ElasticSearch的部署、同步与调优
ElasticSearch是一个强大的搜索服务器,基于Apache Lucene
的全文搜索引擎开发,具有高性能、分布式和零配置的优点。在当前的项目中,我们希望ES能承担亿级文档的搜索,而ES也证明了即便面对这样的数据规模,也能实现十分迅速的搜索响应。
概念
- 节点(Node):节点是一个ES的实例,一般一台主机上部署一个节点-
- 集群(Cluster):集群由若干节点组成,和任意节点的通信等价于和集群的通信
- 分片(Shard):一个索引会分成多个分片存储,分片数量在索引建立后不可更改
- 副本(Replica):副本是分片的一个拷贝,目的在于提高系统的容错性和搜索的效率
- 索引(Index):类似数据库的库
- 类型(Type):类似数据库的表
- 文档(Document):类似数据库的行,包含一个或多个Field
- 字段(Field):搜索的最小单元,可通过
Mapping
定义不同的属性(比如可否被搜索)
部署
以
ElasticSearch 1.5.0
版本为例
ES的使用很简单,从官网下载压缩包后,解压后输入如下指令:
1 | ./bin/elasticsearch -d --cluster.name [your_cluster_name] --node.name [your_node_name] |
一旦在多台主机上启动拥有同一个cluster.name
的ES实例,它们会自动组成一个集群。
elasticsearch-head
elasticsearch-head是一个必装的插件,它提供了一个web界面,显示集群和索引的状态,同时具备浏览和搜索文档的功能。只需要通过ES的plugin
指令安装就OK了:
1 | ./bin/plugin -install mobz/elasticsearch-head |
同步
通常线上系统都不会使用ES作为主存储,从主存储创建索引的效率是我们关心的。ES的bulk API能支持批量操作,大大提升了创建索引的效率。以下是使用pyelasticsearch
(非官方的一个Python客户端)批量创建索引的范例:
1 | from pyelasticsearch import ElasticSearch |
单机索引200万条记录的耗时约10分钟。
中文
ES支持中文的前提是安装正确的分词组件,比如elasticsearch-analysis-ik。但貌似该组件的最新版本(1.2.9)不支持plugin
指令直接安装,只能通过Maven
重新编译了:
1 | git clone https://github.com/medcl/elasticsearch-analysis-ik.git --depth 1 |
zip解压得到5个jar包:
- elasticsearch-analysis-ik-1.2.9.jar
- httpclient-4.3.5.jar
- httpcore-4.3.2.jar
- commons-logging-1.1.3.jar
- commons-codec-1.6.jar
返回ES目录,新建路径./plugins/analysis-ik
并把上述jar包全部移进去。
第二步,把elasticsearch-analysis-ik/config/ik
文件夹(IK
自带的词典)复制到ES目录的./config
路径下。
第三步,在./config/elasticsearch.yml
文件的最后加上:
1 | index: |
至此大功告成。注意配置分词组件必须在创建索引之前,否则是无效的。
调优
ES的调优分两个层面,一是Java层面的调优,包括加大JVM的可用内存及单线程内存。
对Unix系统,可修改./bin/elasticsearch.in.sh
文件:
1 | # 一般分配主机1/4-1/2的内存 |
调优的第二个层面是ES本身的调优,修改./config/elasticsearch.yml
文件,关键的项目如下所示:
1 | # 分片数量,推荐分片数*副本数=集群数量 |