faster-bulk插件是阿里云Elasticsearch團隊自研的插件,目的是為了提高寫入吞吐和降低寫入拒絕。該插件能夠實現將bulk寫入請求按照指定bulk請求大小和時間間隔進行批量聚合,防止過小的bulk請求阻塞寫入隊列,有效提升寫入吞吐。本文介紹faster-bulk插件的適用場景和使用方法。
適用場景
faster-bulk插件適用于寫入吞吐高、索引分片數多的場景,實測對這類場景寫入吞吐提升20%以上,能有效降低寫入拒絕,測試說明如下。
注意 faster-bulk實現的本質是對bulk寫入請求進行批量聚合后再寫入shard,因此建議不要在寫入延時要求較高的場景中使用。
- 測試環境
- 節點:3 * 16核64 GB數據節點 + 2 * 16核64 GB獨立協調節點。
- 數據集:esrally官方數據集nyc-taxis,單文檔大小為650字節。
- 參數:apack.fasterbulk.combine.interval設置為200ms。
- translog狀態:分別對translog在同步及異步狀態進行測試。
- 測試結果
translog狀態 寫入性能(原生集群,未使用faster-bulk插件) 寫入性能(阿里云集群,使用faster-bulk插件) 性能提升 同步狀態 182314/s 226242/s 23% 異步狀態 218732/s 241060/s 10% - 結論
由實驗數據對比可得,使用faster-bulk插件后,translog同步或異步狀態下寫入性能均有所提升,同步狀態(默認)下寫入性能提升了23%。
前提條件
您已完成以下操作:
- 創建阿里云Elasticsearch實例,版本為6.7.0或7.10.0。
具體操作步驟請參見創建阿里云Elasticsearch實例。說明 faster-bulk插件目前僅支持阿里云Elasticsearch 6.7.0和7.10.0版本(商業版和增強版)。
- 安裝faster-bulk插件。
具體操作步驟請參見安裝或卸載系統默認插件。插件安裝后,bulk聚合功能默認關閉,使用前需要先開啟該功能。
開啟bulk聚合功能
設置bulk聚合大小和時間間隔
執行以下命令,指定bulk請求的聚合大小和時間間隔。當單個數據節點上,bulk請求的累計大小或聚合時間間隔達到閾值,即會觸發數據寫入。
PUT _cluster/settings
{
"transient" : {
"apack.fasterbulk.combine.flush_threshold_size":"1mb",
"apack.fasterbulk.combine.interval":"50"
}
}
- apack.fasterbulk.combine.flush_threshold_size:聚合的bulk請求的最大值,默認值為1mb。
- apack.fasterbulk.combine.interval:聚合的bulk請求的最大時間間隔,單位為ms,默認值為50。
說明 對于海量數據高并發場景,在集群可承受的壓力范圍內,可適當將最大聚合大小或最大時間間隔調大,減少bulk請求阻塞寫入隊列。
定向路由
當批量寫入文檔未指定routing和主鍵(_id)時,您可以為集群或指定索引開啟定向路由,提高寫入速度。
說明 如果集群或索引開啟了定向路由,同時寫入中也指定了routing和主鍵(_id),那么定向路由不會生效,且不會影響正常的業務寫入。
- 為集群開啟定向路由
PUT _cluster/settings { "persistent" : { "index.direct_routing.global.enable" : "true" } }
- 為指定索引開啟定向路由
PUT index/settings { "index.direct_routing.enable" : "true" }
關閉bulk聚合功能
執行以下命令,關閉bulk聚合功能。
PUT _cluster/settings
{
"transient" : {
"apack.fasterbulk.combine.enabled":"false"
}
}