allocation模块分析
什么是allocation
分片分配就是把一个分片指派到集群中某个节点的过程。分配决 策由主节点完成,分配决策包含两方面:
· 哪些分片应该分配给哪些节点;
· 哪个分片作为主分片,哪些作为副分片。
对于新建索引和已有索引,分片分配过程也不尽相同。不过不管 哪 种 场 景 , ES 都 通 过 两 个 基 础 组 件 完 成 工 作 : allocators 和 deciders。allocators尝试寻找最优的节点来分配分片,deciders则 负责判断并决定是否要进行这次分配。
· 对于新建索引,allocators负责找出拥有分片数最少的节点列 表,并按分片数量升序排序,因此分片较少的节点会被优先选择。所 以对于新建索引,allocators的目标就是以更均衡的方式把新索引的分 片分配到集群的节点中。然后deciders依次遍历allocators给出的节 点,并判断是否把分片分配到该节点。例如,如果分配过滤规则中禁 止节点A持有索引idx中的任一分片,那么过滤器也阻止把索引idx分配 到节点A中,即便A节点是allocators从集群负载均衡角度选出的最优节点。需要注意的是,allocators只关心每个节点上的分片数,而不管 每个分片的具体大小。这恰好是 deciders 工作的一部分,即阻止把 分片分配到将超出节点磁盘容量阈值的节点上。
· 对于已有索引,则要区分主分片还是副分片。对于主分片, allocators只允许把主分片指定在已经拥有该分片完整数据的节点上。 而对于副分片,allocators则是先判断其他节点上是否已有该分片的数 据的副本(即便数据不是最新的)。如果有这样的节点,则allocators 优先把分片分配到其中一个节点。因为副分片一旦分配,就需要从主 分片中进行数据同步,所以当一个节点只拥分片中的部分数据时,也 就意味着那些未拥有的数据必须从主节点中复制得到。这样可以明显 地提高副分片的数据恢复速度。
触发时机
触发分片分配有以下几种情况:
· index增删;
· node增删;
· 手工reroute;
· replica数量改变;
· 集群重启。
allocation模块结构概述
这个复杂的分配过程在reroute函数中实现: AllocationService.reroute
此函数对外有两种重载,一种是通过接口调用的手工 reroute, 另一种是内部模块调用的reroute。
AllocationService.reroute对一个或多个主分片或副分片执行分 配,分配以后产生新的集群状态。Master节点将新的集群状态广播下 去,触发后续的流程。对于内部模块调用,返回值为新产生的集群状 态,对于手工执行的reroute命令,返回命令执行结果。
allocators
目前,allocators的类型如下图所示。