sphinx mysql存储引擎_基于Sphinx+MySQL的千万级数据全文检索(搜索引擎)架构设计...

Sphinx,单一索引最大可包含1亿条记录,在1千万条记录情况下的查询速度为0.x秒(毫秒级)。Sphinx创建索引的速度为:创建100万条记录的索引只需3~4分钟,创建1000万条记录的索引可以在50分钟内完成,而只包含最新10万条记录的增量索引,重建一次只需几十秒。

基于以上几点,我设计出了这套搜索引擎架构。在生产环境运行了一周,效果非常不错。有时间我会专为配合Sphinx搜索引擎,开发一个逻辑简单、速度快、占用内存低、非表锁的MySQL存储引擎插件,用来代替MyISAM引擎,以解决MyISAM存储引擎在频繁更新操作时的锁表延迟问题。另外,分布式搜索技术上已无任何问题。

一、搜索引擎架构设计:

1、搜索引擎架构图:

  sphinx.png

2、搜索引擎架构设计思路:

(1)、调用方式最简化:

尽量方便前端Web工程师,只需要一条简单的SQL语句“SELECT ... FROM myisam_table JOIN sphinx_table ON (sphinx_table.sphinx_id=myisam_table.id) WHERE query='...';”即可实现高效搜索。

(2)、创建索引、查询速度快:

①、Sphinx Search 是由俄罗斯人Andrew Aksyonoff 开发的高性能全文搜索软件包,在GPL与商业协议双许可协议下发行。

Sphinx的特征:

•Sphinx支持高速建立索引(可达10MB/秒,而Lucene建立索引的速度是1.8MB/秒)

•高性能搜索(在2-4 GB的文本上搜索,平均0.1秒内获得结果)

•高扩展性(实测最高可对100GB的文本建立索引,单一索引可包含1亿条记录)

•支持分布式检索

•支持基于短语和基于统计的复合结果排序机制

•支持任意数量的文件字段(数值属性或全文检索属性)

•支持不同的搜索模式(“完全匹配”,“短语匹配”和“任一匹配”)

•支持作为Mysql的存储引擎

②、通过国外《High Performance MySQL》专家组的测试可以看出,根据主键进行查询的类似“SELECT ... FROM ... WHERE id = ...”的SQL语句(其中id为PRIMARY KEY),每秒钟能够处理10000次以上的查询,而普通的SELECT查询每秒只能处理几十次到几百次:

  mysqlselect.png

③、Sphinx不负责文本字段的存储。假设将数据库的id、date、title、body字段,用sphinx建立搜索索引。根据关键字、时间、类别、范围等信息查询一下sphinx,sphinx只会将查询结果的ID号等非文本信息告诉我们。要显示title、body等信息,还需要根据此ID号去查询MySQL数据库,或者从Memcachedb等其他的存储中取得。安装SphinxSE作为MySQL的存储引擎,将MySQL与Sphinx结合起来,是一种便捷的方法。

创建一张Sphinx类型表,将MyISAM表的主键ID和Sphinx表的ID作一个JOIN联合查询。这样,对于MyISAM表来所,只相当于一个WHERE id=...的主键查询,WHERE后的条件都交给Sphinx去处理,可以充分发挥两者的优势,实现高速搜索查询。

(3)、按服务类型进行分离:

为了保证数据的一致性,我在配置Sphinx读取索引源的MySQL数据库时,进行了锁表。Sphinx读取索引源的过程会耗费一定时间,由于MyISAM存储引擎的读锁和写锁是互斥的,为了避免写操作被长时间阻塞,导致数据库同步落后跟不上,我将提供“搜索查询服务”的和提供“索引源服务”的MySQL数据库进行了分开。监听3306端口的MySQL提供“搜索查询服务”,监听3406端口的MySQL提供“索引源服务”。

(4)、“主索引+增量索引”更新方式:

一般网站的特征:信息发布较为频繁;刚发布完的信息被编辑、修改的可能性大;两天以前的老帖变动性较小。

基于这个特征,我设计了Sphinx主索引和增量索引。对于前天17:00之前的记录建立主索引,每天凌晨自动重建一次主索引;对于前天17:00之后到当前最新的记录,间隔3分钟自动重建一次增量索引。

(5)、“Ext3文件系统+tmpfs内存文件系统”相结合:

为了避免每3分钟重建增量索引导致磁盘IO较重,从而引起系统负载上升,我将主索引文件创建在磁盘,增量索引文件创建在tmpfs内存文件系统“/dev/shm/”内。“/dev/shm/”内的文件全部驻留在内存中,读写速度非常快。但是,重启服务器会导致“/dev/shm/”内的文件丢失,针对这个问题,我会在服务器开机时自动创建“/dev/shm/”内目录结构和Sphinx增量索引。

(6)、中文分词词库:

我根据“自整理的中文分词库”+“搜狗拼音输入法细胞词库”+“LibMMSeg高频字库”+... 综合整理成一份中文分词词库,出于某些考虑暂不提供。你可以使用LibMMSeg自带的中文分词词库。

二、MySQL+Sphinx+SphinxSE安装步骤:

1、安装python支持(以下针对CentOS系统,其他Linux系统请使用相应的方法安装)

yum install -y python python-devel

2、编译安装LibMMSeg(LibMMSeg是为Sphinx全文搜索引擎设计的中文分词软件包,其在GPL协议下发行的中文分词法,采用Chih-Hao Tsai的MMSEG算法。LibMMSeg在本文中用来生成中文分词词库。)

以下压缩包“sphinx-0.9.8-rc2-chinese.zip”中包含mmseg-0.7.3.tar.gz、sphinx-0.9.8-rc2.tar.gz以及中文分词补丁。

download.gif下载文件 (已下载 7 次)

unzip sphinx-0.9.8-rc2-chinese.zip

tar zxvf mmseg-0.7.3.tar.gz

cd mmseg-0.7.3/

./configure

make

make install

cd ../

3、编译安装MySQL 5.1.26-rc、Sphinx、SphinxSE存储引擎

wget http://dev.mysql.com/get/Downloads/MySQL-5.1/mysql-5.1.26-rc.tar.gz/from/http://mirror.x10.com/mirror/mysql/

tar zxvf mysql-5.1.26-rc.tar.gz

tar zxvf sphinx-0.9.8-rc2.tar.gz

cd sphinx-0.9.8-rc2/

patch -p1 < ../sphinx-0.98rc2.zhcn-support.patch

patch -p1 < ../fix-crash-in-excerpts.patch

cp -rf mysqlse ../mysql-5.1.26-rc/storage/sphinx

cd ../

cd mysql-5.1.26-rc/

sh BUILD/autorun.sh

./configure --with-plugins=sphinx --prefix=/usr/local/mysql-search/ --enable-assembler --with-extra-charsets=complex --enable-thread-safe-client --with-big-tables --with-readline --with-ssl --with-embedded-server --enable-local-infile

make && make install

cd ../

cd sphinx-0.9.8-rc2/

CPPFLAGS=-I/usr/include/python2.4

LDFLAGS=-lpython2.4

./configure --prefix=/usr/local/sphinx --with-mysql=/usr/local/mysql-search

make

make install

cd ../

mv /usr/local/sphinx/etc/sphinx.conf /usr/local/sphinx/etc/sphinx.conf.old

第二章第3节之后的正文内容不予公布,全文的目录如下(共24页):

  doc1.gif

  doc2.gif

  doc3.gif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/395920.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《第一桶金怎么赚——淘宝开店创业致富一册通》一一1.1 创业者需具备的素质...

本节书摘来自异步社区出版社《第一桶金怎么赚——淘宝开店创业致富一册通》一书中的第1章&#xff0c;第1.1节&#xff0c;作者&#xff1a;葛存山&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看。 1.1 创业者需具备的素质 第一桶金怎么赚——淘宝开店创业致…

4-1 线程安全性-原子性-atomic-1

转载于:https://www.cnblogs.com/ZHONGZHENHUA/p/10026627.html

构建了我的第一个React Native应用程序之后,我现在确信这是未来。

by Taylor Milliman泰勒米利曼(Taylor Milliman) 构建了我的第一个React Native应用程序之后&#xff0c;我现在确信这是未来。 (After building my first React Native app, I’m now convinced it’s the future.) After a few weeks of playing around with React Native, …

delphi7 提示注册过期问题

很同情你得经过~ 因为我以前也是经常遇见这个问题~就和你说得一样~ 后来~ 我发现 下载使用的Delphi 7只能使用一个注册码&#xff0c;那就是:6AMD-PKG68E-DB8PP7-9SFE 3QH-9QW所以,你先把C:\Documents and Settings\Administrator\.borland文件夹下的两个文件删除然后用 Progra…

计算机开机引导的结果是,电脑开机显示引导媒体是怎么回事

电脑开机显示引导媒体是怎么回事分类&#xff1a;数据恢复常见问题|最后更新&#xff1a;2020年4月9日开机显示重新启动并选择适当的引导设备或插入1.如果主机上接有可移动存储介质(如光盘、移动硬盘、U盘等),将其拔掉,然后重启。2.如果仍然这样,进入主板设置中,依次检测以下几…

《操作系统真象还原》——0.23 操作系统是如何识别文件系统的

本节书摘来自异步社区《操作系统真象还原》一书中的第0章&#xff0c;第0.23节&#xff0c;作者&#xff1a;郑钢著&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看 0.23 操作系统是如何识别文件系统的 我们知道&#xff0c;一个硬盘上可以有很多分区&#xf…

mysql怎样修改my ini_mysql修改my.ini报错怎么办

mysql修改my.ini报错的解决办法&#xff1a;首先将mysql默认编码改成utf8mb4&#xff0c;并修改【my.ini】配置&#xff1b;然后修改变量&#xff0c;并检查是否设置成功即可。更多相关免费学习推荐&#xff1a;mysql教程(视频)mysql修改my.ini报错的解决办法&#xff1a;将mys…

golang---map类型

map 类似其它语言中的哈希表或字典&#xff0c;以key-value形式存储数据key必须是支持或!比较运算的类型&#xff0c;不可以是函数、map或sliceMap查找比线性搜索快很多&#xff0c;但比使用索引访问数据的类型慢100倍 Map使用make()创建&#xff0c;支持:这种简写方式 make([k…

易语言程序应用程序错误退出_为什么我退出Google并构建了一个向孩子们教授个人理财的应用程序

易语言程序应用程序错误退出Many of my friends thought I was crazy to leave a great position at Google to help parents and kids learn about money. Maybe they’re right.我的许多朋友都认为我为在谷歌上任职以帮助父母和孩子了解金钱而感到疯狂。 也许他们是对的。 B…

蓝叠 正在检查服务器最新,Windows update一直停留在正在检查更新

Windows update一直停留在正在检查更新&#xff0c;为什么啊&#xff1f;一、查看相关服务是否开始&#xff1a;请您根据以下步骤&#xff0c;确认windows update & BITS服务设置1. 按下WinR键输入“services.msc”(输入时不要打引号)&#xff0c;并按下回车。如果此时弹出…

spring-DataSource

spring支持的dataSource有好多&#xff0c; 如&#xff1a;自带的org.springframework.jdbc.datasource.DriverManagerDataSource ibatis、c3p0、JDBC、hibernate等等&#xff1b; 首先看第一种&#xff0c;使用自带的datasource&#xff1a; 1、项目结构 提示&#xff1a;spri…

《Nmap渗透测试指南》—第7章7.8节后台打印机服务漏洞

本节书摘来自异步社区《Nmap渗透测试指南》一书中的第7章7.8节后台打印机服务漏洞&#xff0c;作者 商广明,更多章节内容可以访问云栖社区“异步社区”公众号查看。 7.8 后台打印机服务漏洞表7.8所示为本章节所需Nmap命令表&#xff0c;表中加粗命令为本小节所需命令——后台打…

VSCODE 配置远程调试环境

以下内容为本人的著作&#xff0c;如需要转载&#xff0c;请声明原文链接 微信公众号「englyf」https://mp.weixin.qq.com/s/f1KZOlL92ojes-r2l9rlCw 我的需求是&#xff0c;在Windows桌面环境下&#xff0c;通过 VSCODE 远程调试在服务器(或者其它远程主机)的工程代码。其实就…

html动态网页效果代码_教你制作网页的第一步

Internet中有许多漂亮、美观的网页&#xff0c;要制作出这样的网页&#xff0c;必须先了解什么是网页&#xff0c;网页的基本组成是怎样的。网页又称为Web页&#xff0c;一般都包含图像、文字和超链接等元素。按表现形式的不同&#xff0c;网页可分为静态网页和动态网页。静态网…

Spring Cloud 7:Gateway

Zuul 网关 Zuul 是 Netfilx 开源的一个 API Gateway 服务器&#xff0c;本质是一个 Web Servlet 应用。其在微服务架构体系中提供动态路由、监控、弹性、安全等边缘服务。 使用 Zuul 作为网关&#xff0c;其主要原因有以下几点&#xff1a; 1、Zuul、Ribbon 以及 Consul 客户端…

nodejs开发工程师前景_Google NodeJS运行时团队的工程师Matt Loring访谈

nodejs开发工程师前景by Sameer Khoja通过Sameer Khoja Google NodeJS运行时团队的工程师Matt Loring访谈 (An Interview with Matt Loring, an engineer on Google’s NodeJS Runtime team) I had the pleasure of interviewing Matt Loring (Cornell class of 2015) who wor…

计算机EI期刊2020,2020年Ei Compendex收录的中国期刊目录( JANUARY 1, 2020 )

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼2020年Ei Compendex收录的中国期刊目录更新了&#xff0c;合计222本。本文根据最新 JANUARY 1, 2020 更新《2020年Ei Compendex收录出版物期刊目录》整理&#xff0c;需要提醒&#xff0c;目录EI是不定时更新的&#xff0c;但根据小…

mysql联合索引顺序调整_MySQL 关于联合索引的字段顺序规则讨论

联合索引的顺序&#xff0c;难道不是哪个查询条件最多用就放在前面的吗&#xff1f;比如商品有三个分类A&#xff0c;B&#xff0c;C&#xff0c;类似「界门纲目科属种」那样&#xff0c;越左类别越大。还有一个是商品来源D&#xff0c;不一定会用于查询条件中。举个例子&#…

python基础-第三篇-函数编程

基本数据类型之set set是无序不允许重复的集合set创建&#xff1a;s set&#xff08;&#xff09; 创建空集合 s {11,22,33}转换s set&#xff08;可迭代数据&#xff09;li [11,22,33,44] s set(li) print(s) #结果为{33, 11, 44, 22} 集合元素的添加与清空se {11,22,…

10个 Linux/Unix下 Bash 和 KSH shell 的作业控制实例

Linux 和 Unix 属于多任务的操作系统&#xff0c;也就是说一个系统在同一时间段内能运行多重任务(进程)。在这个新的博客系列&#xff0c;我将会列出相关的 Linux 和 Unix 作业&#xff08;job&#xff09;控制的命令&#xff0c;你可以通过这些命令在 Bash 或 Korn 还有 POSIX…