2009年1月23日星期五

MySQL亿级索引架构图


图示说明:

  1、搜索查询接口:

  ①、Web应用服务器通过HTTP POST/GET方式,将搜索关键字等条件,传递给搜索引擎服务器的search.php接口;

  ②③、search.php通过Sphinx的API(我根据最新的Sphinx 0.9.9-rc1 API,改写了一个C语言的PHP扩展sphinx.so),查询Sphinx索引服务,取得满足查询条件的搜索引擎唯一ID(15位搜索唯一ID:前5位类别ID+后10位原数据表主键ID)列表;

  ④⑤、search.php将这些ID号作为key,通过Memcache协议一次性从Tokyo Tyrant中mget取回ID号对应的文本数据。

  ⑥⑦、search.php将搜索结果集,按查询条件,进行摘要和关键字高亮显示处理,以JSON格式或XML格式返回给Web应用服务器。



  2、索引更新接口:

  ⑴、Web应用服务器通过HTTP POST/GET方式,将要增加、删除、更新的内容告知搜索服务器的update.php接口;

  ⑵、update.php将接收到的信息处理后,写入TT高速队列(我基于Tokyo Tyrant做的一个队列系统);

  注:这两步的速度可达到1500次请求/秒以上,可应对6000万PV的搜索索引更新调用。



  3、搜索索引与数据存储控制:

  ㈠、“队列控制器”守护进程从TT高速队列中循环读取信息(每次50条,直到末尾);

  ㈡、“队列控制器”将读取出的信息写入搜索引擎数据存储层Tokyo Tyrant;

  ㈢、“队列控制器”将读取出的信息异步写入MySQL主表(这张主表按500万条记录进行分区,仅作为数据永久性备份用);

  ㈣、“队列控制器”将读取出的信息写入MySQL增量表;

  ㈤、“队列控制器”在1分钟内,触发Sphinx更新增量索引,Sphinx的indexer会将MySQL增量表作为数据源,建立增量索引。Sphinx的增量索引和作为数据源的MySQL增量表成对应关系;

  ㈥、“队列控制器”每间隔3小时,短暂停止从TT高速队列中读取信息,并触发Sphinx将增量索引合并入主索引(这个过程非常快),同时清空MySQL增量表(保证了MySQL增量表的记录数始终只有几千条至几十万条,大大加快Sphinx增量索引更新速度),然后恢复从TT高速队列中取出数据,写入MySQL增量表。



  本架构使用的开源软件:

  1、Sphinx 0.9.9-rc1

  2、Tokyo Tyrant 1.1.9

  3、MySQL 5.1.30

  4、Nginx 0.7.22

  5、PHP 5.2.6



  本架构自主研发的程序:

  1、搜索查询接口(search.php)

  2、索引更新接口(update.php)

  3、队列控制器

  4、Sphinx 0.9.9-rc1 API的PHP扩展(sphinx.so)

  5、基于Tokyo Tyrant的高速队列系统




没有评论: