本文分析介绍的Elasticsearch源码是它的0.90.3版本。本文主要介绍Elasticsearch中的shard迁移问题。
Elasticsearch集群中,数据的分布是根据路由表来进行的,可以参考之前的博文。然而,仅仅计算出路由表信息是不够的,还要根据路由表信息将索引建立起来(索引的建立过程,以后再分析)。当集群的所有shard对应的索引信息都建立起来后,Elasticsearch集群就可以对外提供检索和索引等一系列服务了。此时Elasticsearch集群的状态是相对稳定的,而作为分布式系统,有节点死掉或者加入新的节点是常有的事情。此时Elasticsearch会进行路由的再次计算。根据再次计算好的集群状态,Elasticsearch要进行必要的数据迁移,这就是本文主要分析的部分。
在面对数据迁移这一功能的时候,目前我能想到的难点或者说问题,有以下几点:
1) Elasticsearch是如何计算,并重新路由的。
2) Elasticsearch的数据迁移,如何保证不停止服务。
3) Elasticsearch在数据迁移的过程中,对错误是如何处理和控制的。
可以说,这3点都是Elasticsearch比较重要的地方,本篇博文重点分析并介绍2和3条,对于第1条后期会有博文进行分析介绍。
1.预先定义的一些概念
Elasticsearch的数据迁移。我这里面简要分为2种情况。
1) 我称之为数据的剪切。举例说明:当有新节点加入时,Elasticsearch会对数据进行重新路由计算。这个时候,原本属于node A 的shard 0会转移到新加入的node B上,而此时node A不再拥有该shard 0的数据。很像数据被剪切走了一样。
2) 我称之为数据的复制。举例说明:当有节点死掉,Elasticsearch会对数据进行重新路由计算。这个时候,假设死掉的点是 node C 。node C上原来有shard 0、shard 1。这时候就要在集群中存活的节点上对node C丢失的shard进行恢复处理以尽可能的保证shard的副本数。假设此时node A 上有shard 0存活的一个副本,需要将node A上的shard 0复制到node B上一份。而node A中的shard 0依然存在。这很像数据的复制操作。
2.预先简要介绍下Elasticsearch的建立索引过程
Elasticsearch在建立索引的时候,它是有一套逻辑的,它的这套逻辑直接关系到数据迁移时候的一些控制情况。因此这里有必要进行预先说明。下面我以图形的方式简要描述建立索引的过程。
如下图所示,大致分为如下的几个步骤:
1) 步骤1:根据document的id等信息和cluster routing table 哈希出document应该存储到哪个shard上,如图假设hash到shard 1上。
2) 步骤2:找到 shard 1的主shard P