分布式弹性搜索研究与实践
2014-10-20王占宏王战英顾国强马国春吕振华
王占宏,王战英,顾国强,马国春,吕振华
0 引言
互联网的快速发展,已逐渐在人们的工作、生活中,扮演着不可或缺的角色。人们通过互联网,最基本的目的就是获取自己感兴趣、满足需求的信息。搜索引擎技术为人们从浩如烟海的信息中准确获取想要的信息提供了可能,它经历了十多年的发展,极大的改变了人们获取信息的方式。
例如在传统的电子政务领域,对信息的检索,已经不再满足普遍针对特定字段的精确或模糊检索,在形式上采用类似Google、baidu的一框式全文检索,其技术路线一般是采用基于大字段BLOB的全文检索技术,如ORACLE 全文检索引擎[1,2]。随着数据量和访问量的增大,该方式就经常出现检索速度慢、宕机等问题。而且其功能、检索精度、信息资源覆盖面、可维护性等方面也与专业的搜索引擎无法相比,这些问题往往制约着搜索结果的有效性和可用性。
采用搜索引擎是解决这一问题的比较合适的方法,但目前领先的搜索技术大都掌握在大公司的手中,如 Google、百度等,很难被用于普通的项目中。而一些开源的搜索引擎软件,如 Lucene,其自身良好的跨平台、搜索强大和简单易用等特点,吸引了众多的用户群体。但 lucene在分布式存储管理、集群搜索管理等方面存在不足。
由于用户对信息资源的需求越来越大,对速度、准确度、可扩展性的要求也是越来越高,这无疑对目前传统的集中式搜索引擎提出了巨大的挑战,应用云计算技术的分布式搜索引擎技术,自从进入人们视线之后,就得到了广泛关注,基于云计算的分布式搜索引擎构建也已成为搜索引擎的热点研究问题之一[3]。
基于云计算的分布式搜索引擎就是要让搜索的资源广泛分布在云端,并且由云为客户提供搜索计算能力,有效的解决了资源与效率的问题,不仅提高了数据资源的安全性,也大幅提升了用户的检索效率。因此,基于云计算的搜索引擎研究有很大的实用性价值。
ElasticSearch(简称ES)是一个基于Lucene构建的开源,分布式搜索引擎,支持云计算框架。本文对ES进行了研究,并成功运用于公安信息资源整合与搜索的项目中,取得了良好的应用效果。
1 Lucene及特点
Lucene[4-8]是Apache软件基金会jakarta项目组的一个子项目,它结构完整、层次分明、可扩展性好,且给开发人员在应用中实现全文检索功能提供了完善的API文档。
Lucene采用面向对象方法对系统的核心内容进行了抽象和封装,形成了具体的类或接口。形成了一个与平台无关、低耦合、高效率、易二次开发的全文检索引擎构架。它技术上采用高度优化的倒排索引结构,大大的提高了检索效率。Lucene系统结构图如图1所示:
图1 基于Lucene全文检索系统结构图
Lucene源码中共包括 7个子包,每个包完成特定的功能[9],具体如表1所示:
表1 Lucene源码包对应功能表
Lucene是集中式、单节点的框架体系,当索引文件越来越多时,其所需建立索引的时间会成倍、甚至几何级增长,而且当索引文件达到一定数量时,搜索引擎也会遇到性能瓶颈。
所以要解决这一问题,就必须将集中式框架升级为分布式、多节点框架。
2 弹性搜索(ElasticSearch)
弹性搜索[10](Elastic Search简称:ES),是一个基于Lucene构建的分布式搜索引擎,能够达到实时、稳定、可靠的效果。
它由弹性网络[11]演化而来的搜索方法,继承了弹性网络的思想。首先,从任意1个节点出发,将其与离该节点最近的两个节点连成一个环,这个环像是一个正在逐渐被吹大气球,由于气球的弹力,则气球先遇到离这个气球上所有节点较近的节点,也就是所有未访问节点中先访问所需要距离最短的节点,直至所有节点均被搜索到。弹性搜索避免了弹性网络的训练过程,直接搜索访问路径最短的节点,加快了求解速度,时间复杂度也比较低。
ES支持分布式集群,集群中有多个节点。内部来看有一个主节点,可以通过选举产生的。从外部看ES集群,无中心节点,在逻辑上是个整体,与任何一个节点的通信和与整个ES集群通信是等价的。
ES技术包括了索引存储方式、分布式文件操作、搜索功能、节点发现、节点交互、外部接口等。分布式弹性搜索技术框架图如图2所示:
图2 ES技术框架图
(1)Gateway
Gateway是ES索引快照的存储方式,它默认是先把索引存放到内存中,当内存不足时,再持久化到本地硬盘或存储设备。当整个应用集群关闭再重新启时,ES就会从gateway中读取索引备份数据。目前ES支持本地文件系统、分布式文件系统、Hadoop的HDFS和amazon的s3云存储服务。
(2)Distributed Lucene Directory
Directory是Lucene对文件操作的类,包括管理锁工厂及其锁实例、管理 Directory目录实例的基本属性、管理与操作该目录相关流对象、索引文件的拷贝等。在ES中进行了分布式处理,可以支持集群中所有机器对文件的分布式操作。
(3)功能层
功能层包括Index Module、Search Module、Mapping、River。Index Module是索引管理模块,包括索引的创建、添加、修改、删除等;Search Module是检索管理模块,根据检索条件,返回检索结果;Mapping是对索引库中索引的字段名及其数据类型进行定义,类似于关系数据库中建表时定义字段名及其数据类型,不过ES的mapping比数据库灵活很多,它可以动态添加字段,一般ES会自动根据数据格式定义它的类型,如果需要对某些字段添加特殊属性(如:定义使用其它分词器、是否分词、是否存储等),就必须手动添加mapping;River是ES的一个数据源,也是常用存储方式(如:数据库)同步数据到ES的一个方法,采用插件式服务,读取river中的数据并把它索引到ES中。
(4)Discovery
Discovery是 ES的节点发现机制,他包括了两种 Zen与EC2。Zen是ES的自动发现节点机制,ES是一个基于P2P的系统,它先通过广播寻找存在的节点,再通过多播协议来进行节点之间的通信,同时也支持点对点的交互;EC2是Amazon云平台,ES也支持在此平台中开发。
(5)Scripting
Scripting是书写脚本,可以通过编写自定义的脚本来增强扩充ES的功能,ES支持Mvel、js、python等多种脚本语言。
(6)Transport
Transport是ES内部节点或集群与客户端的交互方式,支持Thrift、Memcached、Http等协议,他们都通过插件方式集成。
(7)RESTFul Style API、Java(Netty)
RESTFul Style API是具有RESTFul风格的接口,即符合REST的一组框架约束条件和原则。ES可以仅通过一组URL来操作其所有功能,便于各平台各语句环境的使用,提供其通用性。另外ES也提供了原生的JAVA API,通过java NIO框架Netty来实现,使熟悉java语言的开发者更容易使用。
(8)监控(JMX)
ES可通过标准的JMX接口监测集群中各节点服务器的运行状态信息,以便对集群进行实时的监控。ES所监测的信息既包括节点级,也包括索引级、分片级。
(9)扩展
ES通过插件机制来扩展其基本功能,开发人员可以根据用户的需求开发不同的插件实现特定功能。ES支持范围很广的插件,包括数据类型映射、分词器、功能脚本、自动发现机制、数据抽取、对外接口等等。
3 基于ES的公安信息资源整合与搜索应用
公安内部大大小小存在200多套信息系统,它们在不同的管理和实战领域发挥着各自的作用,对于情报和一线打击破案部门,这些信息资源都是很有价值的信息,随时都需要查询检索。如果登陆不同的信息系统进行查询检索,效率可想而知。为了方便查询,公安科技通信部门都逐步建立了公安综合查询系统,即把各系统主要的信息资源整合到一个数据库中,然后再分门别类的进行查询。
随着Google、Baidu的全文检索模式逐步被人们所认可,用户就希望不具体选择信息模块、不具体指定查询字段就快速的搜索自己所需要的信息,这也冲击着现有的公安综合查询系统,综合查询系统也经过优化,在ORACLE数据库汇总把部分核心字段合并成一个大的文本字段,作为大字段存放在Oracle中,在利用Oracle 的全文检索功能针对这些核心字段进行全文检索,解决了目前小数量的信息检索,但该放手检索内容上扩展具有局限性,同时随着数量的增加,效率就越来越低,对集中式部署的硬件环境又提出了很高的要求,所以很难满足人们日益增长的搜索体验要求和信息资源迅猛的增长要求。
针对以上问题,我们基于ES开发了公安信息资源整合与全文检索平台,较好地解决了该问题。
3.1 软硬件环境及其配置
我们配置10台刀片机作为一个集群,每台机器安装了64位的Linux操作系统,Intel Xeon E58核2400Hz CPU、内存为16GB,自带200GB硬盘。
安装JAVA虚拟机以及ElasticSearch 0.90.7,安装后系统会自动发现可用的机器节点,参与计算、存储。
3.2 数据同步与索引构建
公安信息资源量非常大,格式多样,有存储在 Oracle中的格式化数据,也有文本文件、网页以及PDF格式的非格式化数据。下面以某市实有人口的数据抽取与索引构建为例,介绍基于ES的数据处理与索引构建过程。
(1)分片、副本设置
根据所用机器配置,反复实验测算,每个节点分配 4个分片,每个分片存储20GB的数据时性能最佳,我们的实验数据大致为300GB包含10亿条记录,考虑到分片太多会增加分布式计算时的分解与聚合成本,影响性能,因此我们把分片数设置为 10,为了数据存储的安全考虑,副本数设置为2,即每份数据存储在3个节点上。
(2)创建river及索引数据
由于实有人口数据存储在 Oracle数据库中,因此我们采用JDBC.river插件实现数据抽取并对数据进行索引,采用java api方式。
主要代码如下:
(3)同步监控
数据同步的监测主要包括集群的运行状况、各节点机器的运行状况和磁盘的读写情况等。
集群的运行状况是通过颜色直观的表达当前集群的“健康”情况,绿色表明集群很“健康”,一切运转正常;黄色表明集群处于“亚健康”状态,即目前的集群状况不能满足所设置的集群策略要求,例如一个数据切片设置了3个副本,而目前集群中只有两台正常运转的机器;橙色表明集群已经被破坏,不能正常运转。
各节点机器的运行状况通过列表形式显示当前正常运作的机器,以及每台机器上数据切片、切片副本。如果某台机器故障,则立即会从列表内被剔除。
磁盘的读写监测重点监测集群中磁盘的读写次数变化以及磁盘的读写数据量变化。
3.3 搜索
在数据索引构建完成后,需要根据应用需求设计系统搜索界面,并通过各种调用方式在集群中分布式执行搜索引擎,并根据系统设计风格将反馈数据嵌入显示界面。
在本项目中我们采用了Java api方式,并通过性能监控接口可视化了性能参数。
(1)搜索调用代码
以下是使用java api执行搜索功能的代码片段。
(2)性能监控
搜索性能监控中,我们重点对内存使用情况、CPU使用情况,查询效率等进行了可视化监测。
内存检测包括常驻内存和共享内存的实时使用情况;CPU检测则实时显示了系统的CPU使用率;查询效率检测一方面实时监测每秒钟平均索引请求数量,另一方面检测每秒每个搜索的平均耗时情况。
4 总结
本文针对大数据量、信息资源全文检索的集中式架构和效率慢问题,通过对ES的深入研究,针对公安信息资源整合和快速查询需求,基于ES开发了分布式的信息整合与搜索信息系统,利用廉价硬件设备资源构建了高效的信息资源整合与搜索平台,满足了公安情报与一线实战部门对信息资源简洁、高效的搜索需要。
目前该系统在增量信息快速同步、智能搜索、自动快速提取有价值信息方面还需要进一步的研究与探索,逐步适应新的挑战。
[1]李瑞丽,钱皓,黄以凯.基于Oracle大数据的全文检索技术研究与实现.微型电脑应用[J].2013,29(1):18-21.
[2]陈天伟.基于Oracle Text电子政务全文检索技术的应用.办公自动化(综合版)[J].2007(1):11-13.
[3]杨光伟.基于Lucene的个性化搜索引擎的研究与实现[D],呼和浩特:内蒙古大学,2009.
[4]张淳晟,郑丽英.基于XML的搜索引擎倒排索引研究[J].太原科技,2009(1):64—66.
[5]Liu chun, Guo Qingping.Analysis and Research of Web Chinese Retrieval system Based Lunece[J].Computer society, 2009(12): 105l-1055.
[6]Zhang Yong, Li Jianlin.Research and Improvement of Search Engine Based on lucene [c].International Conference on Intelligent Human-Machine Systems and Cybemetics.Zhe jiang:[s.n.], 2009:270-273.
[7]Zhou Ning, Wu JiaXin, Zhang ShaoLong, et .Mining Weighted Association Rules with Lucene Index[J].Wireless Communications, Networking and Mobile Computing, 2007 (9):3697—3700.
[8]Kim Min—Soo, Whang Kyu-Young, Lee Jae-Gil, et.n-Gram/2L:A Space and Time Efficient Two-Level n-Gram Inverted Index structure[c]∥Proceedings of the 3lst international conference on very large data bases.Trondheim, Norway: [s.n.], 2005: 325-336.
[9]Gospodnetic O, Hatcher E.Lucene in action[M].[s.l.]:Manning Publications Co, 2005.
[10]http://www.elasticsearch.org/
[11]Durbin R, Willshaw D.An Analogue Approach to the Traveling Salesman Problem Using an Elastic Net method.[J]Nature, 1987, 326:689—691.