第一次开博客,不知道可以写什么,先记录一下ES的分片分配的其中一个过程吧
官方链接:官方参考链接
这个功能,首先我自己觉得非常不错,也许是因为我在生产环境用的版本太低了导致无法配置而产生了对这个功能的一些爱慕之情。23333333
嗯,先介绍一下我遇到的情况。
每次对ES服务进行重启时,集群总是会进行一次Rebalancing操作,而这一次操作因为集群里数据量的问题导致时间过长。时间长还没关系因为master会把重启的节点的主分片的副本分片提升为主分片所以并不会对集群有什么影响,但主要还是浪费了这一次操作,完全没有必要。我想要的就是重启一个节点的时候,延迟分配分片。
接下来看看官网的介绍
当集群节点脱离集群的时候会有以下动作产生:
1. master将离开节点包含的所有主分片的副本分片提升为主分片
2. 假如有足够的节点将把所有丢失的副本分片重新分配到集群中的其他节点中
3. Rebalancing操作
以上的Rebalancing操作会带来很大开销,如果节点离开后马上又回来(如网络不好,重启等),在这个短时间内会进行两次Rebalancing操作。这是何等的无赖,对吧
怎么设置延迟分配呢?
index.unassigned.node_left.delayed_timeout
通过这个参数控制延迟多长时间后才开始分配unassigned的分片
也可以通过setting api进行设置:
PUT /_all/_settings
{
"settings": {
"index.unassigned.node_left.delayed_timeout": "5m"
}
}
当设置了延迟分配后,当节点离开集群时的动作如下:
1. master将离开节点包含的所有主分片的副本分片提升为主分片
2. Master记录日志,(delaying allocation for [3] unassigned shards, next check in [5m])
3. 集群状态还是黄色,因为有分片还没有被分配(但是不影响查询写入)
4. 节点在延迟时间内返回,直接打开副本分片
4. 节点超时返回,集群将unassigned的副本分片进行分配,然后进行一次Rebalancing操作。
如果想立即恢复,可以把参数值设置为0。
以上内容中加入了自己的理解,如有错误请大神指点纠正。谢谢