8.性能优化
Elasticsearch 如何选择硬件配置?
部署 Elasticsearch 对于机器的 CPU 要求并不高,通常选择 2 核或者 4 核的就差不多了。
Elasticsearch 中的很多操作是比较消耗内存的,如果搜索需求比较大的话,建议选择 16GB 以上的内存。具体如何分配内存呢?通常是 50% 给 ES,50% 留给 Lucene。另外,建议禁止 swap。如果不禁止的话,当内存耗尽时,操作系统就会自动把内存中暂时不使用的数据交换到硬盘中,需要使用的时候再从硬盘交换到内存,频繁硬盘操作对性能影响是致命的。
磁盘的速度相对比较慢,尽量使用固态硬盘(SSD)。
Elasticsearch 索引优化策略有哪些?
ES 提供了 Bulk API 支持批量操作,当我们有大量的写任务时,可以使用 Bulk 来进行批量写入。不过,使用 Bulk 请求时,每个请求尽量不要超过几十 M,因为太大会导致内存使用过大。
ES 默认副本数量为 3 个,这样可以提高可用性,但会影响写入索引的效率。某些业务场景下,可以设置副本数量为 1 或者 0,提高写入索引的效率。
ES 在写入数据的时候,采用延迟写入的策略,默认 1 秒之后将内存中 segment 数据刷新到磁盘中,此时我们才能将数据搜索出来。这就是为什么 Elasticsearch 提供的是近实时搜索功能。某些业务场景下,可以增加刷新时间间隔比如设置刷新时间间隔为30s( index.refresh_interval=30s ),减少 segment 合并压力,提高写入索引的效率。
加大 index_buffer_size ,这个是 ES 活跃分片共享的内存区,官方建议每个分片至少 512MB, 且为 JVM 内存的 10%。
使用 ES 的默认 ID 生成策略或使用数字类型 ID 做为主键。
合理的配置使用 index 属性, analyzed 和 not_analyzed ,根据业务需求来控制字段是否分词或不分词。只有groupby 需求的字段,配置时就设置成 not_analyzed ,以提高查询或聚类的效率。
加大 Flush 设置。 Flush 的主要目的是把文件缓存系统中的段持久化到硬盘,当 Translog 的数据量达到 512MB 或者 30 分钟时,会触发一次 Flush,我们可以加大index.translog.flush_threshold_size ,但必须为操作系统的文件缓存系统留下足够的空间。
Elasticsearch 查询优化策略有哪些?
建立冷热索引库(可用固态硬盘存放热库数据,普通硬盘存放冷库数据),热库数据可以提前预热 加载至内存,提高检索效率。
自定义路由规则,让某一类型的文档都被存储到同一分片。
使用 将多个字段整合为一个。
控制字段的数量,业务中不使用的字段,就不要索引。不要返回无用的字段,使用_source 进行指定。
避免大型文档存储,默认最大长度为 100MB。
使用keyword 数据类型,该类型不会走分词器,效率大大提高。开启慢查询配置定位慢查询。
ES 查询的时候,使用 filter 查询会使用 query cache, 如果业务场景中的过滤查询比较多,建议将
querycache 设置大一些,以提高查询速度。尽量避免分页过深。
增加分片副本提高查询吞吐量,避免使用通配符。
加大堆内存,ES 默认安装后设置的内存是 1GB,可以适当加大但不要超过物理内存的 50%,且最好不要超过 32GB。
分配一半物理内存给文件系统缓存,以便加载热点数据。