ElasticSearch的部署、同步与调优

n6xb 4年前

ElasticSearch是一个强大的搜索服务器,基于Apache Lucene的全文搜索引擎开发,具有高性能、分布式和零配置的优点。在当前的项目中,我们希望ES能承担亿级文档的搜索,而ES也证明了即便面对这样的数据规模,也能实现十分迅速的搜索响应。

概念

  • 节点(Node):节点是一个ES的实例,一般一台主机上部署一个节点-
  • 集群(Cluster):集群由若干节点组成,和任意节点的通信等价于和集群的通信
  • 分片(Shard):一个索引会分成多个分片存储,分片数量在索引建立后不可更改
  • 副本(Replica):副本是分片的一个拷贝,目的在于提高系统的容错性和搜索的效率
  • 索引(Index):类似数据库的库
  • 类型(Type):类似数据库的表
  • 文档(Document):类似数据库的行,包含一个或多个Field
  • 字段(Field):搜索的最小单元,可通过Mapping定义不同的属性(比如可否被搜索)

部署

以ElasticSearch 1.5.0版本为例

ES的使用很简单,从官网下载压缩包后,解压后输入如下指令:

./bin/elasticsearch -d --cluster.name [your_cluster_name] --node.name [your_node_name] 

一旦在多台主机上启动拥有同一个cluster.name的ES实例,它们会自动组成一个集群

elasticsearch-head

elasticsearch-head是一个必装的插件,它提供了一个web界面,显示集群和索引的状态,同时具备浏览和搜索文档的功能。只需要通过ES的plugin指令安装就OK了:

./bin/plugin -install mobz/elasticsearch-head 

同步

通常线上系统都不会使用ES作为主存储,从主存储创建索引的效率是我们关心的。ES的bulk API能支持批量操作,大大提升了创建索引的效率。以下是使用pyelasticsearch(非官方的一个Python客户端)批量创建索引的范例:

from pyelasticsearch import ElasticSearch  from pyelasticsearch import bulk_chunks    es = ElasticSearch()    def documents():   for _doc in docs:    yield es.index_op(doc=_doc, id=doc['id'])    for chunk in bulk_chunks(documents(), docs_per_chunk=500, bytes_per_chunk=10000):   es.bulk(chunk, index='index-test', doc_type='doc')

单机索引200万条记录的耗时约10分钟。

调优

ES的调优分两个层面,一是Java层面的调优,包括加大JVM的可用内存及单线程内存。
对Unix系统,可修改./bin/elasticsearch.in.sh文件:

# 一般分配主机1/4-1/2的内存  if [ "x$ES_MIN_MEM" = "x" ]; then      ES_MIN_MEM=12g  fi  if [ "x$ES_MAX_MEM" = "x" ]; then      ES_MAX_MEM=12g  fi    JAVA_OPTS="$JAVA_OPTS -Xms${ES_MIN_MEM}"  JAVA_OPTS="$JAVA_OPTS -Xmx${ES_MAX_MEM}"  # 线程大小, ES单线程承载的数据量比较大  JAVA_OPTS="$JAVA_OPTS -Xss128m"

调优的第二个层面是ES本身的调优,修改./config/elasticsearch.yml文件,关键的项目如下所示:

# 分片数量,推荐分片数*副本数=集群数量  # 分片会带来额外的分割和合并的损耗,理论上分片数越少,搜索的效率越高  index.number_of_shards: 5  # 锁定内存,不让JVM写入swapping,避免降低ES的性能  bootstrap.mlockall: true  # 缓存类型设置为Soft Reference,只有当内存不够时才会进行回收  index.cache.field.max_size: 50000  index.cache.field.expire: 10m  index.cache.field.type: soft

来自:http://guoze.me/2015/04/04/elasticsearch-optimization/