亿级数据的高并发通用搜索引擎架构设计(转-张宴)

[文章作者:张宴 本文版本: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。但是,跟谷歌一样,两次搜索同比都要较百度、搜狗、中国雅虎慢一些。

Tags: linux , php , sphinx , search , tokyotyrant , ttserver , tokyocabinet , mysql , google , 百度 , 谷歌 , 搜狗 , 雅虎 , 有道

技术大类 » 搜索引擎技术 | 评论(85) | 引用(1) | 阅读(96748)

linvo

2008-12-9 12:34

强~不知道那些搜索门户网站的构架怎样

jk

2008-12-9 12:42

怀疑百度显示的时间不是实际检索花费的时间。

大菠萝

2008-12-9 12:46

感觉Baidu和Google一样快呀。用FireBug查看页面载入时间。Baidu :165ms,Google:154ms。

张宴 回复于 2008-12-9 12:56

搜索引擎显示的都只是索引查询时间,页面载入时间不包含在内。

outrace

2008-12-9 13:00

Sphinx 不支持非int类型的id。这点很讨厌。
ttserver对php内容无法反序列化,不支持压缩,这两点也很讨厌。

要是没有这几个问题就好了。

ptubuntu

2008-12-9 14:27

对开发程序还是不懂.不过这对我来说可以多学习一些.不过觉的google他们做的比较复杂的.可想而知.

cyt

2008-12-9 15:24

这套东西离google、baidu还差好远好远。。

fei

2008-12-9 17:13

有没有这么夸张啊?

dugu

2008-12-9 17:30

想用到实践中。

cncaiker

2008-12-9 22:34

会发布吗?非常期待

jeck

2008-12-9 22:49

强,佩服的五体投地!更期待在高负荷的生产环境中的数据

dd_macle

2008-12-10 03:41

学习...

gs

2008-12-10 07:23

sina wants to develop his own search engine

ttplay

2008-12-10 12:03

一句话解释:
一个人将记录写到了缓存,数据库中并更新索引,
另一个人通过索引从缓存或数据库中读出记录.

plantegg

2008-12-11 23:19

从原理上讲你这个是不可能赶上google/baidu/sogou那些的,虽然看起来和Lucene(Java写得,你也没做任何优化吧)差不
多,Lucene搜索结果也是要考虑相关性、排名等等(所以在每篇文章中命中次数是要统计的,不是找到一次就了事),不知道Sphinx有这些没?没有的
话这个比较对Lucene太不公平 :)

搜索引擎Cache命中率一般在60%略高的样子,索引所用的内存都是几百G几百G的

你这个只对增量增加敏感,好像删除的话不能更新索引吧?

不过不得不赞一下你这个也相当棒:)

张宴 回复于 2008-12-12 09:35

当然,Google/Baidu/Sogou的权重计算算法要更复杂,索引数量为几亿到几十亿,也要多很多。为什么文中的搜索结果Google会慢一些,Google网页索引数量已经达到惊人的一万亿(见:http://www.readwriteweb.com/archives/google_hits_one_trillion_pages.php),这么大的数量级,索引比百度慢一些,也是正常的。

所以,相对而言,我的这套索引单台机器支撑1亿索引,达到Google/Baidu/Sogou的查询速度,算不错了。

至于和Lucene的比较,Sphinx拥有下列与Lucene所对应的权重计算模式,那个PDF文档已经在各种类型下与Lucene进行比较:
SPH_RANK_PROXIMITY_BM25, default ranking mode which uses and combines both phrase proximity and BM25 ranking.
SPH_RANK_BM25,
statistical ranking mode which uses BM25 ranking only (similar to most
other full-text engines). This mode is faster but may result in worse
quality on queries which contain more than 1 keyword.
SPH_RANK_NONE,
disabled ranking mode. This mode is the fastest. It is essentially
equivalent to boolean searching. A weight of 1 is assigned to all
matches.
SPH_RANK_WORDCOUNT, ranking by keyword occurrences count.
This ranker computes the amount of per-field keyword occurrences, then
multiplies the amounts by field weights, then sums the resulting values
for the final result.
SPH_RANK_PROXIMITY, added in version 0.9.9,
returns raw phrase proximity value as a result. This mode is internally
used to emulate SPH_MATCH_ALL queries.
SPH_RANK_MATCHANY, added in
version 0.9.9, returns rank as it was computed in SPH_MATCH_ANY mode
ealier, and is internally used to emulate SPH_MATCH_ANY queries.


量索引能够实现索引的增加、更新。索引的删除更简单,Sphinx支持属性标记,假如正常状态is_delete属性为0,那么删除就将
is_delete属性标记为1,属性标记是在内存中进行的,在Sphinx停止时自动写入磁盘,非常快,因而删除索引可以说是实时的。在合并索引时,通
过--merge-dst-range参数,即可排除掉被标记为删除的索引。

dd

2008-12-12 11:36

牛,向你学习,虽然现在有些还是看不懂

EOOD

2008-12-12 18:07

不得不说 Sphinx 与GOOGLE BAIDU 甚至 lucene 都没有可比性

Syu

2008-12-12 21:46

不知道张宴遇到过一个问题没.
我发现凡带 [ ] 号的会对检索结构有严重干扰.

bluepower

2008-12-22 00:16

请问你的柘朴图是用什么软件画的?

rrddd

2008-12-26 16:53

还行

1111

2008-12-27 17:39

请问你的柘朴图是用什么软件画的?
我也想知道?

张宴 回复于 2008-12-30 16:37

亿图 4.1

亿级数据的高并发通用搜索引擎架构设计(转-张宴)

时间: 2024-10-07 01:56:32

亿级数据的高并发通用搜索引擎架构设计(转-张宴)的相关文章

高并发大型网站架构设计

一个大型的网站网站应该由如下6个子系统组成 负载均衡系统 反向代理系统 Web服务器系统 分布式存储系统 底层服务系统 数据库集群系统 为什么要做高并发系统设计? 事实上,针对于任何单一的网络服务器程序,其可承受的同时连接数目是有理论峰值的,通过C++中对TSocket的定义类型:word,我们可以判 定这个连接理论峰值是65535,也就是说,你的单个服务器程序,最多可以承受6万多的用户同时连接.但是,在实际应用中,能达到一万人的同时连接并能保 证正常的数据交换已经是很不容易了,通常这个值都在2

高并发大访问量架构设计演进之路 归纳总结

第01:大型架构的演进之路第02(上):分布式缓存第02(下):分布式缓存第03:分布式消息队列第04:分布式数据存储第05:分布式服务框架第06:高性能系统架构第07:高可用系统架构第08:系统的安全架构第09:架构实战案例分析第10:如何成为技术专家 系统的垂直伸缩,水平伸缩系统的性能瓶颈:分部式缓存:分布式数据存储,分布式服务架构: 强烈的好奇心,工程技术,产生价值赚钱(科学研究不同)扎实的软件技术基础:操作系统,数据结构,设计模式,编程语言,出色的编程能力:优秀的代码深刻领悟主流技术产品

高并发高流量的网站架构设计 (转)

Web2.0的兴起,掀起了互联网新一轮的网络创业大潮.以用户为导向的新网站建设概念,细分了网站功能和用户群,不仅成功的造就了一大批新生的网站,也极大的方便了上网的人们.但Web2.0以用户为导向的理念,使得新生的网站有了新的特点——高并发,高流量,数据量大,逻辑复杂等,对网站建设也提出了新的要求. 本文围绕高并发高流量的网站架构设计问题,主要研究讨论了以下内容: 首先在整个网络的高度讨论了使用镜像网站,CDN内容分发网络等技术对负载均衡带来的便利及各自的优缺点比较.然后在局域网层次对第四层交换技

百万级高并发WebRTC流媒体服务器设计与开发

第1章 课程导学与准备工作本章主要介绍为何要学习WebRTC流媒体服务器开发,以及本门课能为我们带来哪些收获.之后会为大家介绍本课程内容具体安排,最后给出如何学好这门课程的一些学习建议.希望大家都能通过这门课程,学有所成,学有所归. 第2章 C++语言基础回顾[已掌握,可略过]为了便于大家更好的学习流媒体服务器的开发,本章将带大家对WebRTC服务器开发中用到的C++基础知识进行回顾梳理,如类的定义与使用,继承,多态,名存空间等相关知识. 第3章 服务器基础编程本章将带你学习最基础的服务器开发,

百万级高并发WebRTC流媒体服务器设计与开发教程云

百万级高并发WebRTC流媒体服务器设计与开发 资源获取链接:点击获取完整教程 百万级高并发WebRTC流媒体服务器设计与开发 5G时代音视频为王,随着实时音视频应用的爆发,来自Google 的WebRTC成为了人们关注的焦点,但很多人却不知道如何使用WebRTC实现多人实时互动,本课就将围绕与浏览器互通.级联.可扩展等6大痛点手把手带你学习大负载.高并发.高性能 WebRTC 流媒体服务器的设计与开发,揭秘万人互动直播背后的深层奥秘,打造可负载百万用户量的企业级的流媒体服务器 播答题的核心需求

【转载】千万级规模高性能、高并发的网络架构经验分享

在开始谈我对架构本质的理解之前,先谈谈对今天技术沙龙主题的个人见解,千万级规模的网站感觉数量级是非常大的,对这个数量级我们战略上 要重视它,战术上又要藐视它.先举个例子感受一下千万级到底是什么数量级?现在很流行的优步(Uber),从媒体公布的信息看,它每天接单量平均在百万左右, 假如每天有10个小时的服务时间,平均QPS只有30左右.对于一个后台服务器,单机的平均QPS可以到达800-1000,单独看写的业务量很简单 .为什么我们又不能说轻视它?第一,我们看它的数据存储,每天一百万的话,一年数据

【并发与负载】千万级规模高性能、高并发的网络架构经验分享

架构以及我理解中架构的本质 在开始谈我对架构本质的理解之前,先谈谈对今天技术沙龙主题的个人见解,千万级规模的网站感觉数量级是非常大的,对这个数量级我们战略上 要重 视 它 , 战术上又 要 藐 视 它.先举个例子感受一下千万级到底是什么数量级?现在很流行的优步(Uber),从媒体公布的信息看,它每天接单量平均在百万左右, 假如每天有10个小时的服务时间,平均QPS只有30左右.对于一个后台服务器,单机的平均QPS可以到达800-1000,单独看写的业务量很简单 .为什么我们又不能说轻视它?第一,

9种高性能可用高并发的技术架构

1.分层 分层是企业应用系统中最常见的一种架构模式,将系统在横向维度上切分成几个部分,每个部分负责一部分相对简单并比较单一的职责,然后通过上层对下层的依赖和调度组成一个完整的系统. 在网站的分层架构中,常见的为3层,即应用层.服务层.数据层.应用层具体负责业务和视图的展示;服务层为应用层提供服务支持;数据库提供数据存储访问服务,如数据库.缓存.文件.搜索引擎等. 分层架构是逻辑上的,在物理部署上,三层架构可以部署在同一个物理机器上,但是随着网站业务的发展,必然需要对已经分层的模块分离部署,即三层

简谈9种高性能高可用高并发的技术架构

每一个模式描述了一个在我们周围不断重复发生的问题及该问题解决方案的核心.这样,你就能一次又一次地使用该方案而不必做重复工作. 所谓网站架构模式即为了解决大型网站面临的高并发访问.海量数据.高可靠运行等一系列问题与挑战.为此,在实践中提出了许多解决方案,以实现网站高性能.高可靠性.易伸缩.可扩展.安全等各种技术架构目标. 一.分层 分层是企业应用系统中最常见的一种架构模式,将系统在横向维度上切分成几个部分,每个部分负责一部分相对简单并比较单一的职责,然后通过上层对下层的依赖和调度组成一个完整的系统