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聚合功能

  1. 登錄阿里云Elasticsearch實例的Kibana控制臺。
    具體操作步驟請參見登錄Kibana控制臺
  2. 在左側導航欄,單擊Dev Tools
  3. Console中,執行以下命令,開啟bulk聚合功能。
    PUT _cluster/settings
    {
       "transient" : {
          "apack.fasterbulk.combine.enabled":"true"
       }
    }
    說明 您也可以通過curl命令或第三方可視化插件執行以上命令。

設置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"
   }
}