在亚马逊 Elasticsearch 服务中优化索引的性能
简要描述
在Amazon Elasticsearch Service(以下简称Amazon ES)上进行索引性能优化,结果显示改善了近3倍,因此将描述那时有效的操作和无效的操作。
前提
调整目标的索引是用于搜索用途的,例如Web服务等。
由于采用了按日期重新建立索引并切换别名的操作,
因此假设调整主分片和更改映射比较容易进行。
测量方法
使用CloudWatch指标来测量IndexingLatency和IndexingRate。
-
- IndexingLatency : インデックス作成オペレーションを完了するためにシャードで必要な平均時間(ミリ秒)
- IndexingRate : 1分あたりのインデックス作成オペレーションの数
产生了效果的调整。
我們實際上是按照Elastic公司和AWS公司的文件進行操作。
https://www.elastic.co/guide/en/elasticsearch/reference/current/tune-for-indexing-speed.html
https://aws.amazon.com/jp/premiumsupport/knowledge-center/elasticsearch-indexing-performance/
刪除未使用的 Field。
将未使用的Field从Mappings中删除。
特别是删除高成本的文本应该会有很好的效果。
通过这样的调优,IndexingLatency改善了2倍。
更改实例类型
专用主节点和数据节点都使用了t3实例,但这不是用于生产环境的实例,所以将专用主节点改为c6g,将数据节点改为r6g。
建议选择专用的主节点(例如c6g)进行计算优化,而数据节点则可以选择通用或内存优化的节点(例如m6g、r6g)。更多信息请参考https://docs.aws.amazon.com/ja_jp/elasticsearch-service/latest/developerguide/sizing-domains.html#aes-bp-instances。
碎片数的优化
从实际数据容量重新调整大小,并减少节点数量和主分片数量。
公式中指出,与其分片数过多,不如分片数过少来得更好。
批量大小的调整
根据 Elastic 公司的文档,逐渐增加 Bulk API 的批量大小,并寻找其极限值。在我的案例中,大约在20MB左右时,性能达到了瓶颈。
以上提到的四種調整對效果特別明顯,其他調整只有稍微改善的程度。
刷新间隔的延长
我将刷新间隔提升至60秒。这稍微改善了索引速率。
https://www.elastic.co/guide/en/elasticsearch/reference/current/tune-for-indexing-speed.html#_unset_or_increase_the_refresh_interval
自动调音
在导入过程中无法确认状态是否充分,但亚马逊 ES 有一个仅限于其功能的自动调优工具 Auto-Tune,它可以自动优化线程池,从而更容易避免索引时的 429 错误。
调整没有效果
使用本地存储
根据 Elastic 公司的文档指出,像 EBS 等虚拟化存储设备速度较慢,
因此我尝试将 r6g 更换为 NVMe SSD 的 r6gd。
https://www.elastic.co/guide/en/elasticsearch/reference/current/tune-for-indexing-speed.html#_use_faster_hardware
然而,实际上对性能影响并不大,因此又改回了 r6g。
减少响应大小
写入 Elasticsearch 是使用 embulk-output-elasticsearch 插件实现的,但在下面的地方对 bulk 响应进行了修改,将 items 字段排除掉了。
https://github.com/embulk/embulk-output-elasticsearch/blob/99e1ee36ea2adf0c0e925f9d4f0ad953a1e44b01/src/main/java/org/embulk/output/elasticsearch/ElasticsearchHttpClient.java#L86
然而,索引的性能几乎没有改变。
当然,这对带宽利用率等方面是有影响的,因此可以认为传输速度有所提高。
没有进行调整的车辆
将 number_of_replicas 设置为 0
我把number_of_replicas设置为0,但似乎没有显著改善,并且在索引过程中需要将number_of_replicas设为0,完成索引后再恢复,但由于工作流程会变得复杂,所以我决定不采用。
参考网页:https://www.elastic.co/guide/en/elasticsearch/reference/current/tune-for-indexing-speed.html#_disable_replicas_for_initial_loads
使用自动生成的ID
通过不使用”_id”字段来使用自动生成的ID,可以减少查询分片的成本。然而,由于旧版的Elasticsearch已经足够快速,且更新变得困难,因此我们选择不采用这种方法。
链接:https://www.elastic.co/guide/en/elasticsearch/reference/current/tune-for-indexing-speed.html#_use_auto_generated_ids
禁用_source和_all
在Elastic公司的文档中,虽然经常提到优化索引的调优方法,但却写着通过启用(enable)的方式带来的好处更大。因此,我们不宜轻易地选择禁用(disable)。详见https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-source-field.html。