这里写自定义目录标题
ES集群掉出节点后恢复时出现red
集群red/yellow排查
- ES集群掉出节点后恢复时出现red
- 集群red/yellow排查
- 一个比较难处理的case
基本思路: 1.分片设置不合理,单组分片:primary数 + replica数 > node数,则yellow 2.total_shards_per_node参数的限制导致分片不能完全分配 3.节点掉出导致red 4.各种元数据修改、恢复等操作导致rebalance(暂时的init) 5…
除了上述经验的思路,可以直接使用explain
GET /_cluster/allocation/explain
{
"index": "vacationvbkorderindex",
"shard":4,
"primary":false
}
一个比较难处理的case
场景:集群配置过低(1c4g)导致集群某个节点cpu打满,脱离集群,进而流量全部打到剩余节点,导致又有其他节点因为压力过大继续脱离集群---->集群不可用
集群由于超过延迟时间不能发现节点,则准备重新分配分片数据,allocation的流程消耗性能,导致加剧集群的压力---->集群不可用
处理:
- 紧急扩容,减小集群压力
- 处理red分片
处理red分片的过程:
- 通过上述explain命令,发现是node_left导致的red;
- 结果:由于多个节点脱离,导致节点主分片、副本分片都unassign; 由于allocation的源码(decide)不能允许非最新的数据分片成为主分片–→主分片不能分配 因为主分配不能分配–→副本分配也不能分配
- 根据以上分析,发现没法使用ES的自治均衡分配分片,只能使用手动的逻辑
1.先查询未分配的主分片原来是在哪个节点上
GET /order_orderlist/_shard_stores
2.处理方案
-- 方案一:将主分片分配(只丢失部分数据)
POST _cluster/reroute {
"commands": [
{
"allocate_stale_primary":
{
"index": "index_name",
"shard": 4,
"node": "node_name",
"accept_data_loss" : true
}
}
]
}
-- 方案二:如果数据不重要,可以不用放到原来的节点上,直接新建一个空分片替代(会丢失整个分片的数据)
POST _cluster/reroute {
"commands": [
{
"allocate_empty_primary":
{
"index": "index_name",
"shard": 2,
"node": "node_name",
"accept_data_loss" : true
}
}
]
}