一起來學ES —— Bulk剖析
背景
- Bulk請求是ES常用的一種multi-document請求,其處理比較複雜,之前一直搞不清請求的處理邏輯,今天就從源碼入手,仔細剖析一下其執行邏輯。
時序分析
- 簡單而言,Bulk的時序如下圖所示,Http節點隻將包轉為TCP,ingest節點進行些預設的前置處理,然後按shard拆分,再把按shard拆開的bulk再發到真實的data節點上,最後由data節點進行主副本同步寫入。
具體流程
-
RestControllor
接收請求,dispatch到對應的handler上 -
BaseRestHandler
調用RestBulkAction
進行前置處理,請求轉為BulkRequest
-
NodeClient
根據ActionModule
注冊的映射關係,找到TransportBulkAction
作為tcp的處理邏輯 -
TransportBulkAction
檢查自己是不是ingest node
,如果不是就轉發 -
Ingest Node
接收到請求,執行pipeline -
TransportBulkAction
調用BulkOperation
將BulkRequest
拆為BulkShardRequest
,轉發到DataNode -
Primary Data Node
收到請求,轉為ReplicationOperation
操作,調用TransportShardBulkAction
進行主副本的依次執行 -
TransportShardBulkAction
的具體執行過程為shardOperationOnPrimary
和shardOperationOnReplica
,執行時直接調用了Engine進行執行。具體代碼就不貼了,比較長
線程池分析
- 在日常中,我們經常遇到由於線程池占滿的
es_rejected_execution_exception
- 通過源碼可以看到,bulk的線程池為
ThreadPool.Names.BULK
,全局查找後發現隻有TransportShardBulkAction
和PipelineExecutionService
有用。 - 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