返回
Elasticsearch扩容后恢复索引分片指南
后端
2023-09-10 00:04:32
在一次系统扩容后,我遇到了一个棘手的Elasticsearch故障,它导致了索引分片不可用。经过一番调查,我发现故障的根源在于未将新添加的节点配置为包含受影响索引的文件。本文将详细介绍这个故障的症状、原因以及逐步恢复索引分片的步骤。
故障症状
扩容后,我观察到Elasticsearch集群中的某些索引分片处于“UNASSIGNED”状态。同时,还出现了以下错误日志:
[2023-03-08T14:24:12,245][INFO ][o.e.c.s.ClusterService] [my-cluster] Applying started shard [nApP0eVgS2Sb-xFJifKdSw][search-logs-2023.03.07][0] to [es-node-3]
[2023-03-08T14:24:12,250][WARN ][o.e.a.AllocationService] [my-cluster] [search-logs-2023.03.07][0] allocation failed on es-node-3
故障原因
经过调查,我发现故障的原因是新添加的节点未配置为包含受影响索引的文件。在分配主分片时,Elasticsearch会检查节点上是否存在该索引的文件。如果不存在,则分配将失败,导致分片处于“UNASSIGNED”状态。
恢复步骤
为了恢复受影响的分片,我执行了以下步骤:
-
停止受影响节点 :首先,我停止了新添加的节点,以防止进一步的分配失败。
-
将索引文件复制到新节点 :接下来,我将受影响索引的文件从其他节点复制到新节点。可以使用rsync或scp等工具来完成此操作。
-
配置新节点 :复制文件后,我配置新节点以识别索引文件。这可以通过在elasticsearch.yml配置文件中添加以下设置来实现:
node.data: true
path.data: /path/to/index_files
-
启动新节点 :配置好新节点后,我重新启动了它。
-
重新分配分片 :最后,我使用以下命令重新分配分片:
curl -XPOST 'localhost:9200/_cluster/reroute?pretty' -H 'Content-Type: application/json' -d '
{
"commands" : [
{
"allocate_stale_primary" : {
"index" : "search-logs-2023.03.07",
"shard" : 0,
"node" : "es-node-3"
}
}
]
}
结论
通过遵循这些步骤,我成功地恢复了受影响的分片并解决了Elasticsearch故障。这个经验让我深刻认识到在扩容时配置新节点的重要性,并强调了彻底故障排除和恢复过程的重要性。