[文章作者:张宴 本文版本:v1.0 最后修改:2008.12.09 转载请注明原文链接:http://blog.zyan.cc/post/385/]

  曾经在七月,写过一篇文章──《基于Sphinx+MySQL的千万级数据全文检索(搜索引擎)架构设计》,前公司的分类信息搜索基于此架构,效果明显,甚至将很大一部分带Where条件的MySQL SQL查询,都改用了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版。

点击在新窗口中浏览此图片

  图示说明:
  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的高速队列系统



  附1:MySQL FullText、Lucene搜索、Sphinx搜索的第三方对比结果:
  1、查询速度:
  MySQL FullText最慢,Lucene、Sphinx查询速度不相上下,Sphinx稍占优势。
  点击在新窗口中浏览此图片

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

  3、详细对比数据见以下PDF文档:  



  附2:国内各大中文搜索引擎搜索速度分析:
  以“APMServ张宴”为关键字,比较在各大中文搜索引擎的搜索速度:
  1、百度:
  ①、第一次搜索
  点击在新窗口中浏览此图片

  ②、第二次搜索
  点击在新窗口中浏览此图片

  分析:百度对第一次搜索的搜索结果做了Cache,所以第二次查询非常快。



  2、谷歌:
  ①、第一次搜索
  点击在新窗口中浏览此图片

  ②、第二次搜索
  点击在新窗口中浏览此图片

  分析:谷歌也对第一次搜索的搜索结果做了Cache,但两次查询跟百度同比,都要慢一些。



  3、搜狗:
  ①、第一次搜索
  点击在新窗口中浏览此图片

  ②、第二次搜索
  点击在新窗口中浏览此图片

  ③、第三次搜索
  点击在新窗口中浏览此图片

  分析:搜狗疑似对第一次搜索的搜索结果做了短暂的Cache,第二次搜索速度非常快,第三次搜索的速度比第二次搜索的速度慢。搜狗第一次搜索的速度跟百度差不多。



  4、中国雅虎:
  ①、第一次搜索
  点击在新窗口中浏览此图片

  ②、第二次搜索
  点击在新窗口中浏览此图片

  分析:搜索结果没有做Cache。中国雅虎的搜索速度跟百度第一次搜索的速度差不多。



  5、网易有道:
  ①、第一次搜索
  点击在新窗口中浏览此图片

  ②、第二次搜索
  点击在新窗口中浏览此图片

  分析:有道对第一次搜索的搜索结果做了Cache。但是,跟谷歌一样,两次搜索同比都要较百度、搜狗、中国雅虎慢一些。






技术大类 » 搜索引擎技术 | 评论(129) | 引用(1) | 阅读(179769)
psheng
2009-9-8 17:26
您的这个方案,数据表是怎么拆分呢, 不会1亿数据放在一个表里面吧。估计MYSQL也会撑的够呛吧。
nucdream Email
2009-11-2 16:08
请问您的框架图是用什么软件画的?

期待您的回复!谢谢。。。
彼得
2009-11-10 15:56
请教几点,

“队列控制器” 和其他模块之间的数据同步性是如何保证的?
系统的数据完整性是如何保证的?

谢谢!
BZP
2009-11-30 10:24
百度的搜索用时比Google快 这是让我很惊讶的
theta
2009-12-7 14:21
博主好,我最近在做一个访问统计的项目,从搜索引擎查到这篇文章,能否分享一下关于队列控制器模块的设计?高并发情况下如果入队的数量过大,或者说出队的速度与入队的速度不能达成和谐,就会造成队列溢出。如果入队和出队时会各自锁定资源,则会影响效率。希望得到博主的帮助 :)我的邮箱是thetazhou#163.com
EchoHi Homepage
2009-12-15 16:57
高手写的东西就是比较技术含量,佩服。
kangta
2009-12-25 18:05
能不能讲解一下你的基于Tokyo Tyrant做的一个队列系统是怎么实现的?我这边也做了一个类似的存储结构,但是效率似乎并不理想,如果ttserver的数据库文件很大的话,查询起来速度还是会比较慢。
嗯嗯
2010-1-16 21:56
感觉这个测试做的非常不严谨...
7000万数据,是个非常庞大的数据了~
这个情况下,索引的容量是多大?
是不是全文索引?
搜索语句的长度如何?搜索语句的分词数如何?
搜索的出来的结果集有多大?
比如:
搜索一个“的”字,如果结果集有几千万,也是在0.0X秒内吗?给出精确的结果数吗?
又比如:
搜索“祖国”和搜索“我是中国人 我爱我的祖国”这两者性能应该是完全不一样的,Sphinx在任何情况下都能在0.0X秒内给出具有较高相关度的结果吗?
修罗 Email
2010-2-24 17:00
它这个没有更新啊.所有的更新都作为增量了么?
az235
2010-3-19 19:25
有源码吗,如果有的话请发给我一份:shianli.88@gmail.com
大调动
2010-4-13 11:08
结果集不同,被搜索集也不同,横向比较虽然可以,但实际的意义可能并不是很大。
从使用的效果来看,摆渡出现相同网页的概率很大,而google在这一方面就要好一点。
feiliang
2010-4-28 12:56
如果接口一次性取200条数据 ,还要进行加亮操作。  多长时间可能 完成?
sztonny Homepage
2010-5-18 17:27
非常适合站内搜索
Brian Zou Homepage
2010-11-1 17:59
效果还可以,值得研究。
天语
2010-11-18 01:28
不错
WALOJA
2011-2-24 14:03
Sphinx 和lucene 到底之间有什么差别呢,楼主能否详细说明下呢
louis vuitton uk Email Homepage
2011-11-23 09:06
This louis vuitton uk for sale belongs to the sounding just what are termed as Louis Vuitton vintage best sellers, many other products and services for the reason that range appearing companies.You will easily notice the unfold zippers of this coach outlet store online. That is the decoration. There are some inside pockets for you as well. They are easy to match your clothes and to carry.Let us inspire your inner beauty with fine christian louboutin sale. Purse the elegance in bridal wedding. Enjoy the fashion.
我爱我信 Email
2011-11-26 04:42
张师  你好~!
三年了 这套程序 能开源吗~!渴盼。。。。
emai:14350109@qq.com
我爱我信
2011-11-27 04:57
张老师 好久不来了哦
aoungdm6aif Email Homepage
2011-11-27 18:41
分页: 3/7 第一页 上页 1 2 3 4 5 6 7 下页 最后页
发表评论
表情
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
打开HTML
打开UBB
打开表情
隐藏
记住我
昵称   密码   游客无需密码
网址   电邮   [注册]