关于ElasticSearch的优化方案
关于ElasticSearch的应用方案有很多,下面具体列举一些工作中常用到的几种。
1、调大系统的"最大打开文件数",建议 32K 甚至是 64K
ulimit -a #查看 |
2、修改配置文件调整 ES 的 JVM 内存大小
修改 bin/elasticsearch.in.sh 中 ES_MIN_MEM 和 ES_MAX_MEM 的大小,建议设置一样大,避免频繁的分配内存,根据服务器内存大小,一般分配 60%左右(默认 256M)。
3、设置 mlockall 来锁定进程的物理内存地址
-
避免交换(swapped)来提高性能
-
修改文件 conf/elasticsearch.yml
bootstrap.mlockall: true |
4、分片的设置,5-20 个比较合适
如果分片数过少或过多,都会导致检索比较慢。
- 分片数过多会导致检索时打开比较多的文件,另外也会导致多台服务器之间通讯。
- 分片数过少会导至单个分片索引过大,所以检索速度慢。
建议单个分片最多存储 20G 左右的索引数据,所以,分片数量=数据总量/20G。
5、副本的设置,2-3个比较合适
副本多的话,可以提升搜索的能力,但是如果设置很多副本的话也会对服务器造成额外的压力,因为需要同步数据。所以建议设置 2-3个即可。
如果在项目开始的时候
需要批量入库大量数据的话,建议将副本数设置为 0 – 因为 es 在索引数据的时候,如果有副本存在,数据也会马上同步到副本中,这样会对 es 增加压力。待索引完成后将副本按需要改回来。这样可以提高索引效率
6、要定时对索引进行优化,不然 segment 越多,查询的性能就越差
- 索引量不是很大的话情况下可以将 segment 设置为 1。
shell操作:curl -XPOST 'http://192.168.110.4:9200/xss/_optimize?max_num_segments=1' |
java代码:client.admin().indices().prepareOptimize(“shsxt").setMaxNumSegments(1).get(); |
7、删除文档
在 Lucene 中删除文档,数据不会马上在硬盘上除去,而是在 lucene 索引中产生一个.del 的文件,而在检索过程中这部分数据也会参与检索,lucene 在检索过程会判断是否删除了,如果删除了在过滤掉。这样也会降低检索效率。
所以可以执行清除删除文档:
shell操作:curl -XPOST 'http://192.168.110.4:9200/elasticsearch/_optimize?only_expunge_deletes=true' |
java代码:client.admin().indices().prepareOptimize("elasticsearch"). |
8、去掉 mapping 中_all 域
ElasticSearch 默认为每个被索引的文档都定义了一个特殊的域 ‘_all’,它自动包含被索引文档中一个或者多个域中的内容, 在进行搜索时,如果不指明要搜索的文档的域,ElasticSearch 则会去搜索_all 域。_all 带来搜索方便,其代价是增加了系统在索引阶段对 CPU 和存储空间资源的开销。
可以使用"_all" : {“enabled”:false} 开关禁用它。
Elasticsearch 使用经验之谈:
1、在使用 java 代码操作 es 集群的时候要保证本地使用的 es 的版本和集群上 es 的版本保持一致。
2、保证集群中每个节点的 JDK 版本和 es 配置一致。
3、Elasticsearch 的分片规则
-
elasticsearch 在建立索引时,根据 id 或 id,类型进行 hash, 得到 hash 值与该索引库的分片数量取余,取余的值即为存入的分片 ID。
-
具体源码为:根据 OperationRouting 类 generateShardId 方法进行分片。