聊一聊Elasticsearch的索引分片的恢复机制
1、什么是索引分片的恢复?
所谓索引分片的恢复指的是在某些条件下,索引分片丢失,ES会把某索引的分片复制一份来得到该分片副本的过程。
2、触发分片恢复的场景有哪些?
-
分片的分配
当集群中节点的数量发生变化,或者配置了分片的过滤,使得某节点上的分片需要移动到另外一个节点上,就需要进行分片的分配。在分片分配的过程当中,当某个索引的分片缺失,则会通过分片恢复来创建对应的分片。
-
增加索引的副本数
-
从索引备份的快照中恢复数据
3、分片恢复的类型
- 从本地分片复制而来,称为本地存储恢复(local store recovery)。
- 从其他节点上分片复制而来,称为对等恢复(peer recovery)。
- 从索引备份的快照文件中恢复的,称为快照恢复(snapshot recovery)。
4、分片恢复的过程
我们假设在一个有3个节点(节点1、节点2、节点3)的集群中创建一个索引(test_index),该索引有3个主分片(P1、P2、P3),每个主分片有1个副本分片(R1、R2、R3)。经过分片分配,每个节点上被分配2个分片,如下图:
让我们来看看此时的分片分配过程都发生了什么?首先在创建索引的时候,分别在3个节点上创建3个主分片,这三个主分片是在本地创建了3个空分片。然后会将这3个主节点复制到其他节点上产生副本分片(这3个副本分片是从其他节点上的分片复制而来,所以这里发生了3次对等恢复)。
我们再假设下如果节点3下线了会发生什么?节点3下线后,首先要将节点3上的主分片P0恢复,将P0复制到节点1上(我的理解是将节点1上的副本分片R0选举为新的P0主分片),如图:
然后将缺失的副本(R0、R2)恢复,即分别从节点1上的P0复制到节点2上形成R0,从节点2上的P2复制到节点1上形成R2,如图:
5、减少不必要的分片恢复
在生产环境中,通常会有很多节点、索引、分片,且索引分片的容量都比较大,若某个节点临时断网或者集群重启时未及时启动所有节点,就会使集群增加很多不必要的分片恢复。
我们可以通过以下两种方式来尽量避免这些不必要的分片恢复:
- 延时分片恢复:ES提供了一种索引级别的动态配置,可以通过来指定节点下线多久后开始分片恢复,默认是1分钟。
- 调整触发分片恢复的条件:通过ES的elasticsearch.yml文件中添加与网关相关的配置来设置分片恢复的触发条件。
6、参考文献
- 《Elasticsearch数据搜索与分析实战》——王深湛
上一篇:《聊一聊Elasticsearch的索引的分片分配机制》
下一篇:《聊一聊Elasticsearch的索引数据搜索过程》