閱讀47 返回首頁    go 阿裏雲 go 技術社區[雲棲]


一起來學ES —— Bulk剖析

背景

  • Bulk請求是ES常用的一種multi-document請求,其處理比較複雜,之前一直搞不清請求的處理邏輯,今天就從源碼入手,仔細剖析一下其執行邏輯。

時序分析

  • 簡單而言,Bulk的時序如下圖所示,Http節點隻將包轉為TCP,ingest節點進行些預設的前置處理,然後按shard拆分,再把按shard拆開的bulk再發到真實的data節點上,最後由data節點進行主副本同步寫入。 IMAGE

具體流程

  1. RestControllor 接收請求,dispatch到對應的handler上 IMAGE
  2. BaseRestHandler 調用 RestBulkAction 進行前置處理,請求轉為 BulkRequest IMAGE
  3. NodeClient根據 ActionModule 注冊的映射關係,找到TransportBulkAction作為tcp的處理邏輯
  4. TransportBulkAction 檢查自己是不是 ingest node,如果不是就轉發 IMAGE
  5. Ingest Node接收到請求,執行pipeline IMAGE
  6. TransportBulkAction調用BulkOperationBulkRequest拆為BulkShardRequest,轉發到DataNode IMAGE
  7. Primary Data Node收到請求,轉為ReplicationOperation操作,調用TransportShardBulkAction進行主副本的依次執行 IMAGE
  8. TransportShardBulkAction的具體執行過程為shardOperationOnPrimaryshardOperationOnReplica,執行時直接調用了Engine進行執行。具體代碼就不貼了,比較長

線程池分析

  • 在日常中,我們經常遇到由於線程池占滿的es_rejected_execution_exception
  • 通過源碼可以看到,bulk的線程池為ThreadPool.Names.BULK,全局查找後發現隻有TransportShardBulkActionPipelineExecutionService有用。
  • Rest和TransportBulk居然沒有用Bulk線程池,很是驚訝。不知道是不是沒找到。。。

讓搜索更簡單


  • ZSearch2.0 服務申請入口:https://search.alipay.com/看我們這二級的域名就知道重要性了吧。
  • 螞蟻中間件的ZSearch2.0,核心采用了ElasticSearch,原生支持所有的ElasticSearch的操作,具備強大的數據檢索和分析能力,自5月份投入試運行以來,已線上服務16個業務方,數據規模在130TB,近2K億的文檔數,QPS穩定在30W左右。 通過數月不斷的觀察、調優、測試,如今已達到正式上線的標準,歡迎同學們踴躍使用,提出寶貴意見。
  • 後續我們會對Elasticsearch和Lucene做持續優化,歡迎大家來使用,並提出你的需求。
  • 有任何問題可以聯係我們(@善仁(xinyu.jxy),@豐堅(yinghao.wyh),@十倍(lvliang.ll),@城破(huabiao.mahb) )
  • 詳細介紹請參閱ZSearch2.0 夏日來襲

最後更新:2017-08-25 15:32:27

  上一篇:go  【短視頻SDK】如何做到視頻原始比例裁剪?
  下一篇:go  C++11 memory order