背景:
我们开发环境最近一个月ES集群总是yellow状态,一些索引总是yellow,但Es集群各节点是正常的。yello说明索引的副本有故障导致。那为什么副本一直无法恢复?
原因分析:
Es集群因为部分索引的副本状态为Unassigned Replica。那为什么集群各节点是好的,坏的副本不能自动恢复呢?ES是有平衡机制的,正常情况下副本丢失是可以从主分片那重新获取到并重建的。
回顾下Es平衡机制,ES平衡机制需要满足一定的条件才会触发,详细如下
cluster.routing.allocation.allow_rebalance Always 标识rebalance一直会开着 Indices_primaries_active 标识Es的主分片都上线才开始rebalance Indices_all_active 标识ES主分片和副本分片都上线才开始rebalance. 默认配置 |
如果各节点分片数量不均衡根据平衡策略条件必须主分片和副本都上线后才会触发。那是否可以先把有问题的索引副本数改成0,然后在修改成指定副本通过这种方式来恢复副本?
PUT my-index/_settings { "number_of_replicas": 1 } |
但是我所遇到的情况是副本改成0后集群状态变成green,重新修改副本为1后又变成yellow。感觉很奇怪。
通过查看指定索引的setting信息发现一些秘密,执行GET _settings?pretty。筛选指定索引的配置发现多了一个冷热数据的配置信息cluster.routing.allocation.require.temperature=warn。之前我们开发做过集群节点冷热数据配置,从索引的属性上来看索引被设置为了冷数据。那是否有可能是因为被打上冷数据标签导致的问题呢?
通过修改索引冷热数据属性来尝试是否能让索引重新平衡分片。命令如下
PUT my_index/_settings { "routing": { "allocation": { "require": { "temperature":null } } } } |
完成上述操作后目前集群状态以恢复正常。这里留下一个疑问?难道索引被打成冷数据后会影响副本重建吗?