亿级数据的高并发通用搜索引擎架构设计[原创]

来源:百度文库 编辑:神马文学网 时间:2024/04/29 13:04:37

亿级数据的高并发通用搜索引擎架构设计[原创]

大 | 中 | 小 [ 2008-12-9 08:47 | by 张宴 ][文章作者:张宴 本文版本:v1.0 最后修改:2008.12.09 转载请注明原文链接:http://blog.s135.com/post/385/]

  曾经在七月,写过一篇文章──《基于Sphinx+MySQL的千万级数据全文检索(搜索引擎)架构设计》,前公司的分类信息搜索基于此架构,效果明显,甚至将很大一部分带Where条件的MySQLSQL查询,都改用了Sphinx+MySQL搜索。但是,这套架构仍存在局限:一是MySQL本身的并发能力有限,在200~300个并发连接下,查询和更新就比较慢了;二是由于MySQL表的主键与Sphinx索引的ID一一对应,从而无法跨多表建立整站查询,而且新增加类别还得修改配置文件,比较麻烦;三是因为和MySQL集成,无法发挥出Sphinx的优势。

  最近,我设计出了下列这套最新的搜索引擎架构,目前已经写出“搜索查询接口”和“索引更新接口”的beta版。经测试,在一台“奔腾四 3.6GHz双核CPU、2GB内存”的普通PC机,7000万条索引记录的条件下,“搜索查询接口”平均查询速度为0.0XX秒(查询速度已经达到百度、谷歌、搜狗、中国雅虎等搜索引擎的水平,详见文章末尾的“附2”),并且能够支撑高达5000的并发连接;而“索引更新接口”进行数据分析、入队列、返回信息给用户的全过程,高达1500 Requests/Sec。

  “队列控制器”这一部分是核心,它要控制队列读取,更新MySQL主表与增量表,更新搜索引擎数据存储层Tokyo Tyrant,准实时(1分钟内)完成更新Sphinx增量索引,定期合并Sphinx索引。我预计在这周写出beta版。

②③、search.php通过Sphinx的API(我根据最新的Sphinx 0.9.9-rc1API,改写了一个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的高速队列系统



   附1:MySQL FullText、Lucene搜索、Sphinx搜索的第三方对比结果:
   1、查询速度:
  MySQL FullText最慢,Lucene、Sphinx查询速度不相上下,Sphinx稍占优势。
  

   2、建索引速度:
  Sphinx建索引速度是最快的,比Lucene快9倍以上。因此,Sphinx非常适合做准实时搜索引擎。

   3、详细对比数据见以下PDF文档:下载文件 点击这里下载文件
亿级数据的高并发通用搜索引擎架构设计[原创] 亿级数据的高并发通用搜索引擎架构设计[原创] - 回忆未来[张宴] - 服务器系统架构与底... 基于Sphinx MySQL的千万级数据全文检索(搜索引擎)架构设计[原创] 基于Sphinx+MySQL的千万级数据全文检索(搜索引擎)架构设计[原创] - 回忆未来... 基于Sphinx MySQL的千万级数据全文检索(搜索引擎)架构设计[原创] - 回忆未来[张宴] - 服务器系统架构与底层研发 说说大型高并发高负载网站的系统架构 大型高并发高负载网站的系统架构 说说大型高并发高负载网站的系统架构 说说大型高并发高负载网站的系统架构 高并发高流量网站架构(转) 高并发高负载数据库架构策略 高并发高流量网站架构 [转载]说说大型高并发高负载网站的系统架构 - jiangxinyanyu的专栏 - CS... 说说大型高并发高负载网站的系统架构 - elimago的专栏 - CSDN博客 [转载]说说大型高并发高负载网站的系统架构 大型高并发高负载网站的系统架构-Web开发 说说大型高并发高负载网站的系统架构(更新)[Michael] - 我的BT下载实验室 - BlogJava 利用Tokyo Tyrant构建兼容Memcached协议、支持故障转移、高并发的分布式key-value持久存储系统[原创] - 回忆未来[张宴] - 服务器系统架构与底层研发 利用Tokyo Tyrant构建兼容Memcached协议、支持故障转移、高并发的分布式key-value持久存储系统[原创] - 回忆未来[张宴] - 服务器系统架构与底层研发 架构设计的三个维度 [架构设计与模式]初学者如何开发出一个高质量的J2EE系统 创意纪 » 转载:高并发高负载网站系统设计 查看Apache并发请求数及其TCP连接状态[原创] - 回忆未来[张宴] - 服务器系统架构与底层研发 软件的架构与设计模式之什么是架构