由于服务器磁盘满了,所有服务未能正常运行,检查了一下es,发现有个索引以出现黄色警告,显示有两个分片未被分配。
通过命令systemctl status elasticsearch
查看es运行状态,看到以下异常:
Sep 07 12:31:44 sz-1 elasticsearch[2063]: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) [?:?]
Sep 07 12:31:44 sz-1 elasticsearch[2063]: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) [?:?]
Sep 07 12:31:44 sz-1 elasticsearch[2063]: at java.lang.Thread.run(Thread.java:830) [?:?]
Sep 07 12:31:44 sz-1 elasticsearch[2063]: Caused by: org.elasticsearch.env.ShardLockObtainFailedException: [my_index][1]: obtaining shard lock timed out after 5000ms, previous lock details:...shard creation]
Sep 07 12:31:44 sz-1 elasticsearch[2063]: at org.elasticsearch.env.NodeEnvironment$InternalShardLock.acquire(NodeEnvironment.java:771) ~[elasticsearch-7.6.2.jar:7.6.2]
Sep 07 12:31:44 sz-1 elasticsearch[2063]: at org.elasticsearch.env.NodeEnvironment.shardLock(NodeEnvironment.java:686) ~[elasticsearch-7.6.2.jar:7.6.2]
Sep 07 12:31:44 sz-1 elasticsearch[2063]: at org.elasticsearch.index.IndexService.createShard(IndexService.java:394) ~[elasticsearch-7.6.2.jar:7.6.2]
Sep 07 12:31:44 sz-1 elasticsearch[2063]: ... 18 more
网上搜到很多解决方法是调用一下接口,但仍然无法解决。
POST _cluster/reroute?retry_failed=true
后来在亚马逊上找到了解决方案,以下是操作步骤:
排查您的黄色群集状态
由于节点或网络故障,您的 Elasticsearch 群集会进入黄色状态。如果集群中的节点因内部硬件问题出现故障,则现有节点将被新节点替换。此替换是 Amazon ES 的自动检测功能。但是,在某些情况下,故障节点中的副本分片尚未分配。如果先前使用的资源尚未释放,则副本分片将保留未分配状态。在此期间,领导节点进行了五次分配副本分片尝试。如果领导节点的五次分配副本分片尝试都失败,则您的集群将进入红色或黄色运行状态。
要识别哪些索引导致集群进入黄色状态,请使用以下查询:
GET /_cat/indices?v&health=yellow
然后,使用以下查询来识别集群未分配分片的根本原因:
GET /_cluster/allocation/explain
增加最大重试设置
要使 Elasticsearch 集群恢复到绿色状态,请增加每个黄色索引的最大重试次数:
PUT <yellow-index-name>/_settings
{
"index.allocation.max_retries" : 10
}
运行此 API 调用时,领导节点将重试您的集群上指定索引的分片分配。
注意: 当您增加最大重试设置时,分片不会总是自动分配。您可能需要手动分配分片。
更新副本数量
重要提示: 如果 Elasticsearch 集群负载高,请不要使用此方法。从索引中删除所有副本时,索引必须且仅能依赖于主分片。如果节点出现故障,您的集群则可能因为主分片尚未分配而进入 红色群集状态 。
要更改副本数量,请执行以下步骤:
- 删除所有副本,使受影响的索引数量变为 0:
PUT /<yellow-index-name>/_settings
{
"index" : {
"number_of_replicas" : 0
}
}
- 将副本数量更改回所需的数量:
PUT /< yellow -index-name>/_settings
{
"index" : {
"number_of_replicas" : 1
}
}