一起来学ES —— Bulk剖析

少于 1 分钟 读完全文

背景

  • 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线程池,很是惊讶。不知道是不是没找到。。。

版权声明

  • 自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
  • 本文首发于: http://czjxy881.coding.me/

留下评论