Sphinx+MySQL全文检索架构和安装过程

梦中呓语Y点滴

梦中呓语Y点滴

2016-01-29 14:48

Sphinx+MySQL全文检索架构和安装过程,本文阐述的是一款经过生产环境检验的千万级数据全文检索(搜索引擎)架构。本文只列出前几章的内容节选,不提供全文内容。

原文:http://blog.s135.com/read.php/360.htm

前言

本文阐述的是一款经过生产环境检验的千万级数据全文检索(搜索引擎)架构。本文只列出前几章的内容节选,不提供全文内容。

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/mysql/)

在DELL PowerEdge 6850服务器(四颗64 位Inter Xeon MP 7110N处理器 / 8GB内存)、RedHat AS4 Linux操作系统、MySQL 5.1.26、MyISAM存储引擎、key_buffer=1024M环境下实测,单表1000万条记录的数据量(这张MySQL表拥有int、 datetime、varchar、text等类型的10多个字段,只有主键,无其它索引),用主键(PRIMARY KEY)作为WHERE条件进行SQL查询,速度非常之快,只耗费0.01秒。

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/mysql/)

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

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

一、搜索引擎架构设计

1、搜索引擎架构图

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查询每秒只能处理几十次到几百次:

③、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自带的中文分词词库。

[next]

二、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以及中文分词补丁。

点击这里下载文件

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页):

展开更多 50%)
分享

猜你喜欢

Sphinx+MySQL全文检索架构和安装过程

MySQL mysql数据库
Sphinx+MySQL全文检索架构和安装过程

通过MySQL内置全文检索实现中文的相关检索

MySQL mysql数据库
通过MySQL内置全文检索实现中文的相关检索

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

SQL全文检索例讲

编程语言 网络编程
SQL全文检索例讲

linux 安装过程全攻略

Linux Linux命令 Linux安装 Linux编程 Linux桌面 Linux软件 Linux内核 Linux管理
linux 安装过程全攻略

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

SQL Server全文检索简介

SQLServer
SQL Server全文检索简介

图解CentOS系统的安装过程

服务器
图解CentOS系统的安装过程

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

Oracle数据库中索引的维护

Oracle数据库中索引的维护

《全民打怪兽》辅助刷金币钻石攻略

《全民打怪兽》辅助刷金币钻石攻略
下拉加载更多内容 ↓