es Unassigned Shards 排查思路

时间:2022-04-05 01:00:07

es Unassigned Shards

可能性1一

未分配的分片是指在Elasticsearch集群中存在的分片,但它们没有被分配到任何节点上。通常情况下,未分配的分片是由于集群中的节点无法分配或承载分片所致。在处理未分配的分片之前,我们需要先了解以下几点:

  1. 确定未分配分片的原因:通过执行以下命令可以确定未分配分片的原因
curl -XGET 'http://localhost:9200/_cat/shards?h=index,shard,prirep,state,unassigned.reason'

这将列出集群中所有分片的详细信息,包括未分配的原因。

  1. 集群健康状况:执行以下命令可以检查集群的健康状况
curl -XGET 'http://localhost:9200/_cluster/health?pretty=true'

健康状况为绿色(green)表示集群健康状况良好,黄色(yellow)表示部分分片未分配,红色(red)表示大量分片未分配。

  1. 确认节点是否可用
GET /_cat/nodes?v
  1. 确认可用磁盘空间:在重新分配未分配分片之前,需要确保每个节点上有足够的可用磁盘空间来存储这些分片。您可以使用以下命令来检查每个节点的可用磁盘空间:
GET /_cat/allocation?v
  1. 检查分片分配策略是否正确配置。分片分配策略可以指定如何将分片分配给节点,以确保在节点宕机或新节点加入时正确分配分片。例如,可以使用以下命令来查看分片分配策略:
curl -X GET "http://localhost:9200/_cluster/settings?pretty=true"

根据未分配分片的原因和集群的健康状况,我们可以采取以下几种措施来处理未分配的分片:

  1. 增加节点容量:如果未分配的分片是由于节点容量不足而导致的,则可以考虑增加节点容量
  2. 重新平衡分片:如果集群中某些节点上的分片负载过高,可以尝试通过重新平衡分片来解决问题。可以通过执行以下命令来手动触发重新平衡分片
POST /_cluster/reroute?retry_failed=true

这将触发集群重新平衡所有分片。

  1. 修复故障节点:如果未分配的分片是由于故障节点所致,则需要先修复故障节点,然后重新平衡分片
  2. 手动分配分片:如果以上方法都无法解决问题,可以考虑手动分配分片。可以通过执行以下命令来手动分配分片:
PUT /{index}/_shard/{shard}/_allocate?node={node_name}

其中{index}是分片所属的索引名称,{shard}是分片ID,{node_name}是要将分片分配到的节点名称。但是,手动分配分片需要谨慎操作,因为错误的分配可能会导致数据丢失或损坏。

总之,在处理未分配的分片之前,需要仔细检查集群的健康状况和未分配分片的原因,并采取适当的措施来解决问题。

  1. 检查分片状态:重新分配操作完成后,需要检查分片状态是否已解决。您可以使用以下命令来检查分片状态:
curl -XGET 'http://localhost:9200/_cat/shards?h=index,shard,prirep,state'

可能性二

如果一个 Elasticsearch 索引没有副本(replica),并且在某个节点上的主分片(primary shard)由于某些原因无法分配,则该索引上的未分配分片(unassigned shard)将无法在其他节点上创建副本,因为副本的创建依赖于已经存在的主分片。因此,在这种情况下,该索引上的未分配分片可能会显示为未分配状态。

在 Elasticsearch 中,主分片和副本分片都是分片(shard),它们都包含索引中的数据的一部分。主分片和副本分片之间的区别在于主分片是唯一的,它们是数据的主要拥有者,而副本分片是主分片的复制品,它们用于提高数据的可用性和容错性。

因此,如果一个索引没有副本并且主分片无法分配到节点上,则该索引上的未分配分片将无法创建副本,从而无法在其他节点上分配未分配分片。如果想要解决这个问题,可以尝试将该索引的副本数量设置为大于 0 的值,以便在主分片无法分配到节点时,副本分片可以接管该分片并提供数据的访问。

  1. 打开 Kibana 控制台或使用 curl 命令与 Elasticsearch 进行交互。
  2. 确认当前索引的副本数量。可以使用以下 curl 命令检索索引的当前设置
curl -X GET "http://localhost:9200/your_index_name/_settings?pretty"

其中,将 ​​your_index_name​​ 替换为要设置副本数量的索引名称。

  1. 如果当前索引的副本数量为 0,则使用以下 curl 命令将其设置为大于 0 的值:
curl -X PUT "http://localhost:9200/your_index_name/_settings?pretty" -H 'Content-Type: application/json' -d'
{
"index": {
"number_of_replicas": 1
}
}
'

其中,将 ​​your_index_name​​ 替换为要设置副本数量的索引名称,这里将副本数量设置为 1。

  1. 等待 Elasticsearch 完成重新平衡并将副本分配到其他节点。这可能需要一些时间,具体取决于集群中的索引大小和节点数量。

在副本分配到节点后,该索引上的未分配分片将会被自动分配到节点上。如果仍然存在未分配分片的问题,可以尝试重新启动 Elasticsearch 节点或手动重新分配分片