Elastic Search优化
1.最大打开文件数
设置系统的最大打开文件数,可以调大到32k以上,且集群每个节点都要操作;
2.JVM的内存
修改Elastic Search的JVM的内存大小;
3.memory_lock设置为true
锁定物理地址,避免内存交换,提高性能;
4.权衡分片个数
分片过多会导致打开的文件比较多,增加节点之间的通讯代价,影响性能;分片数太少会导致单个分片索引过大,检索速度变慢,一般10个左右比较合适,不易超过30个,每个分片数据应该在20G左右,即分片数 = 数据总量 / 20G;
5.控制副本数量
副本增加可以提高检索能力,但是也增加了副本同步数据的压力,增加磁盘空间,一般设置2-3个副本集合;
6.定时对索引进行合并优化
Segment越多,占用的segment memory就会越多,性能反而降低。索引量不大时,可以设置Segment为1,另外可以调整segment merge的配置参数来提高性能,如max_thread_count和单个segment的最大容量等;
7.一个index下只创建一个type
因为只删除type不会释放空间。
8.close关闭不使用的index
索引处于open状态,索引库的Segment就会赞用过内存空间,close后会释放内存空间,不释放磁盘空间;
9.清除已经删除的数据记录
删除后的数据记录不是立刻清除磁盘数据,而是导入到了.del文件中,这部分数据仍然参与检索,在检索过程中再判断是否删除,然后再过滤。因此清除已经删除的数据记录会提高检索效率;
10.第一次大批量导入数据到ES时,可以将副本设置为0
等到数据导入完成后,再恢复副本数量,避免了导入数据时,又要同步副本的性能压力;
11.禁用_all字段
Index默认会有一个_all字段,默认把所有字段的数据copy到_all字段里,方便了query,却增加了索引时间和索引大小;
12.日志级别调整
Elastic Search的默认log级别是trace,当慢查询操作500ms时,就会打印日志,造成了集群负载,影响性能。可以将log级别调整为info;
13._source检索优化
Elastic Search默认检索只会返回ID,然后根据这个ID去倒排索引你中取每个field数据,当开启时,Elastic Search可以根据ID直接检索对应source JSON的field,不再需要倒排索引;
14.index刷新间隔
默认情况下,index刷新间隔为1秒,即数据写入1秒后就可以被query到,每次刷新都会产生新的Lucene段,进而导致频繁的Segment merge行为。
15.使用ik分词
针对中文查询搜索,一定要安装ik分词,有ik_max_word和ik_smart,极大的提高的查询性能和准确度,否则就会逐个中文字进行匹配,耗费性能。
在插入文档时,ES查看该字段有没有定义analyzer,如果定义了就用定义的,否则使用ES默认的;
在搜索文档时,ES会先去看字段有没有定义search_analyzer,如果没有定义,就去看有没有analyzer,再没有定义就使用否则使用ES默认的。
针对中文分词,一般创建index时指定analyzer = ik_max_word,search_analyzer = ik_smark。
16.使用索引模板和别名
根据业务增量需求,可以基于日期模板来创建索引,然后通过roll over API滚动索引。
17.热词冷词分离
采取冷热分离机制,热数据存储到SSD,提高检索效率;冷数据定期进行shrink操作,以缩减存储;
18.使用curator
采取curator进行索引的生命周期管理。
19.写入禁用刷新机制
写入前关闭refresh_interval设置为-1,禁用刷新机制。