文章目录
- 集群健康状态的解读
- 如何定位黄色的索引
- 确定我们所能知道的主要问题
- 确定哪些索引有问题,多少索引有问题
- 查看有问题的分片及其原因
- 进一步定位未分配的原因
- 对症下药,解决问题
- 如何定位红色的索引
- 模拟场景使集群变红色
- 定位是哪个索引、哪个分片
- 解决问题
集群健康状态的解读
- 分片健康
- 红:至少有一个主分片没有分配
- 黄:至少有一个副本没有分配
- 绿:主副本分片全部正常分配
- 索引健康:最差的分片的状态
- 集群健康:最差的索引的状态
如何定位黄色的索引
确定我们所能知道的主要问题
例如节点宕机、磁盘空间(磁盘使用逼近或超过警戒水位线,磁盘使用率达到85%、90%甚至95%)等问题,这些问题很可能会造成集群状态的变化。这些外部表现明显的问题便于我们追溯问题,形成针对性的解决方案。
面对这种场景,我们有时只需要耐心等待,因为系统通常会通过移动数据来自我修复。
❑举例1:重新启动则会经历集群由红色变为黄色,再由黄色变为绿色的过程。
❑举例2:一个节点的主分片出了问题,系统会将副本分片升级为主分片,然后重新创建新副本,但这需要几分钟到更长的时间,具体取决于分片数量、大小、集群负载、磁盘速度等。
# 检查集群状态,查看是否有节点丢失,有多少分片无法分配
GET /_cluster/health/
确定哪些索引有问题,多少索引有问题
通过_cat API的返回结果,我们可以知道这一点。
GET cat/indices?v&health=red
GET cat/indices?v&health=yellow
GET cat/indices?v&health=green
其中黄色索引如图14-4所示。
查看有问题的分片及其原因
为此我们应该使用_cat API。该API用于查询集群中的所有分片信息,包括节点名称、索引名、分片编号、是否为主分片、分片状态、存储方式、分片大小、未分配原因和详细信息,并按照存储方式和索引名称进行排序。
GET /_cat/shards?v&h=n,index,shard,prirep,state,sto,sc,unassigned.reason, unassigned.details&s=sto,index
上述API各个细分参数的含义如下。
❑v:显示表头。
❑h:指定要在结果中显示的列。在这个例子中,它被设置为n(节点名称)、index(索引名)、shard(分片编号)、prirep(是否为主分片)、state(分片状态)、sto(存储方式)、sc(分片大小)、unassigned.reason(未分配原因)和unassigned.details(未分配详细信息)。
❑s:指定对结果进行排序的列。在这个例子中,它被设置为sto(存储方式)和index(索引名称)。
执行结果如图
其中,unassigned.reason字段表示未分配分片的原因,返回值如表
虽然未分配原因已经很详细了,但是有时候我们需要更多细节,特别是当我们有节点路由或遇到其他更复杂的问题时。
进一步定位未分配的原因
我们继续探究集群为什么不分配分片。为此,让集群进一步返回给定分片的当前分配情况和逻辑。这需要结合上一步的返回结果,对_cluster/allocation/explain API进行修改。
GET /_cluster/allocation/explain
{"index": "my_index_0602","shard": 0,"primary": false
}GET /_cluster/allocation/explain
{"index": "my_index_0517","shard": 0,"primary": false
}
以上3个参数都是可选参数,含义分别如下。
❑index:索引名称。
❑Shard:分片数。
❑Primary:是否是主分片。
在单节点集群上为新建的索引my_index_0602
设置了副本分片,导致副本分片无法分配,所以分片状态呈现黄色。
current_state字段表示数据分片在Elasticsearch集群中的当前状态。unassigned是其中一种状态,表示该分片当前未被分配到任何节点。除此之外,还有以下可能的状态。
❑initializing:分片正在初始化,但尚未开始提供服务。
❑started:分片已经成功初始化并且正在提供服务。
❑relocating:分片正在从一个节点迁移到另一个节点。
对症下药,解决问题
修补方法分为几类。
1)等待Elasticsearch集群自行修复。这种方式适用于临时状况、集群启动阶段。操作方法是节点重启。
2)将副本设置为0,即删除所有副本。针对场景是既无法修复副本,也无法手动移动或分配副本的情况。在这种情况下,只要拥有主分片(健康状态为黄色,而不是红色),就可以始终使用以下命令将副本数设置为0,等待给定响应时间,再将其设置为1或任意一个业务场景需要的值。
PUT my_index_0517/_settings
{"index": {"number_of_replicas": 0}
}
3)借助reroute API手动分配分片。举例如下,该代码共做了移动分片(move)和分配副本(allocate_replica)两个操作。
POST /_cluster/reroute
{"commands": [{"move": {"index": "test","shard": 0,"from_node": "nodel","to node": "node2"}},{"allocate replica": {"index": "test","shard": 1,"node": "node3"}}]
}
- 检查路由、分配规则。许多高可用或复杂的系统使用路由或分配规则来控制分片分配,随着情况的变化,可能会出现无法分配的分片。这个时候,可以使用explain API帮助排查问题。
如何定位红色的索引
模拟场景使集群变红色
DELETE mytest
PUT mytest
{"settings":{"number_of_shards":1,"number_of_replicas":0,"index.routing.allocation.require.box_type":"hot"}
}
定位是哪个索引、哪个分片
GET cat/indices?v&health=red
GET /_cat/shards?v&h=n,index,shard,prirep,state,sto,sc,unassigned.reason, unassigned.details&s=sto,index
GET /_cluster/allocation/explain
{"index": "mytest","shard": 0,"primary": true
}
意思是主分片没有办法分配,是应为没有hot属性的节点
解决问题
DELETE mytestPUT mytest
{"settings":{"number_of_shards":1,"number_of_replicas":0}
}GET /_cluster/health/