一、硬件层面优化配置
(1) 合理选择服务器。
Elasticsearch的运行对JDK版本、Linux内核、最小内存等都有一定的要求,在安装部署集群之前需要选择和Elasticsearch版本匹配的的服务器配置,同时也要根据业务量做集群规划。
(2)提高Linux系统应用程序最大打开文件数。
在启动Elasticsearch集群以前,增大机器的最大文件数,可以避免数据导入高峰时期打开文件过多异常的发生。
(3)增大虚拟映射内存。
Elasticsearch写入文档时最终要使用Lucene构建倒排索引,增大虚拟映射内存可以加快索引速度。
二、数据导入性能优化
(4)关闭_all字段。
_all字段是把一个文档的所有字段合并在一起的超级字段,在搜索字段不明确的情况下可以对_all进行搜索,默认是开启的。如果没有模糊搜索的需要,关闭_all字段可以缩小索引大小,提高导入性能。
(5)设置副本为0。
如果副本不为0,Master节点需要把文档复制到副本分片上,复制过程需要消耗系统资源,因此可以在数据导入阶段设置副本为0,等数据导入完成以后再提高副本数。
(6)对不必要的字段不索引。
Elasticsearch可以通过参数设置字段是否建索引,建索引需要分词、解析、建倒排记录表等一系列过程,可以根据业务需求对不必要的字段(比如需要精确匹配的地名)不索引。
(7)使用批量导入。
文档一条一条的导入会导致频繁的磁盘读写,使用批量导入可以降低I/O消耗。
(8)适当增大刷新间隔。
索引数据过程中为了使数据尽快可搜索,Elasticsearch会不断刷新创建新的段并打开它,默认1s刷新1次,在数据导入期间可适当增大刷新间隔,待数据导入完成以后再恢复至默认设置。
三、查询优化
(9)使用路由。
路由机制即是通过哈希算法,将具有相同哈希值的文档放置到同一个主分片中,合理使用路由机制可以提高查询性能。
(10)正确使用Query和Filter。
Query和Filter都有查询的功能,但是Query使用的是搜索机制,需要通过评分模型计算相关度,而Filter是过滤机制,只需要根据条件进行过滤,无需计算相关度,因此Filter响应时间更快。
(11)使用Optimize API合并段。
Elasticsearch中每个分片有多个段,每个段都是一个完整的倒排索引,在查询时Elasticsearch会把所有段的查询结果汇总作为最终的查询结果。当索引的文档不断增多时段也会增多,查询性能就会下降。Optimize API可以强制分片进行段合并,把多个小的段合并成大的段(通常合并成一个段),通过减少段的数量达到提高搜索性能的目的。
在日志处理场景中,日志的存储一般按天、周、月存入索引,而且日志一旦索引就不会再修改,索引只是可读的,这种情况下把索引段设为1是非常有效的。
欢迎补充