Elasticsearch 有未分配的分片 详细思路

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Elasticsearch 有未分配的分片 详细思路相关的知识,希望对你有一定的参考价值。

Elasticsearch 有未分配的分片通常意味着某些节点无法分配索引分片,这可能会导致搜索和写入的延迟或失败。以下是排查和处理 Elasticsearch 未分配分片的步骤:

  1. 使用 Elasticsearch API 检查集群状态:使用以下 API 获取集群的状态信息:
GET /_cluster/health

如果有未分配的分片,该 API 将返回一个黄色或红色的集群状态。黄色表示分片分配正常,但不是所有的主分片都已经分配。红色表示有一个或多个主分片未分配。

  1. 检查日志:查看 Elasticsearch 节点的日志,以了解是否有任何错误或警告。在节点日志中搜索 “unassigned” 关键字,可以找到未分配的分片的原因,例如节点故障、索引设置不正确等。
  2. 使用 Elasticsearch API 确定未分配的分片:使用以下 API 获取未分配的分片列表:
GET /_cat/shards/<index>?h=index,shard,prirep,state,unassigned.reason

其中 ​​<index>​​ 是要检查的索引名称。这个 API 将返回所有未分配的分片以及原因,例如节点故障、索引设置不正确等。

  1. 解决未分配的分片:一旦确定了未分配的分片,可以采取以下措施:
  • 如果是节点故障造成的未分配,可以修复节点或添加新节点。
  • 如果是索引设置不正确造成的未分配,可以更改索引设置以便正确分配分片。
  • 如果是其他原因造成的未分配,可以根据日志中提供的信息采取相应的措施。
  1. 重新平衡分片:一旦解决了未分配的分片,可以使用以下 API 强制重新平衡分片:
POST /_cluster/reroute?retry_failed=true

这个 API 将强制 Elasticsearch 重新分配所有未分配的分片,并将它们分配给适当的节点。

通过以上步骤,您可以成功排查和处理 Elasticsearch 未分配分片的问题。

Elasticsearch:为自管的 Elasticsearch 添加分片分配感知

Elasticsearch 是一种流行的搜索和分析引擎,用于存储、搜索和分析大量数据。 为了增强 Elasticsearch 集群的可靠性,你可以利用自定义节点属性作为感知属性。 通过这样做,Elasticsearch 可以考虑您的硬件配置并相应地分配分片。 如果 Elasticsearch 知道哪些节点共享相同的物理服务器、机架或区域,它可以战略性地分配主分片和副本分片,以最大限度地降低在硬件故障时丢失所有分片副本的风险。相关阅读 “Elasticsearch:shard 分配感知”。

什么是分片分配感知?

分片分配感知是 Elasticsearch 中的一项功能,允许你根据特定节点属性分配分片。 通过这样做,你可以确保分片在集群中的节点之间均匀分布,从而提高性能和资源利用率,并最大限度地降低在硬件故障时丢失所有分片副本的风险。

如何为 Elasticsearch 集群添加分片分配感知?

要为 Elasticsearch 集群添加分片分配感知,你需要执行以下步骤:

步骤一:添加节点属性

第一步是为 Elasticsearch 集群中的所有节点添加节点属性。 你可以使用以下命令向节点添加节点属性:

node.attr.<attribute_name>: <attribute_value>

例如,如果要为节点添加名为 server 且值为 V1 的节点属性,则可以使用以下命令。使用你最喜欢的文本编辑器并更新 elasticsearch.yml

node.attr.server: V1

步骤二:禁用分片分配

下一步是禁用副本分片的分片分配,为滚动重启做准备。 你可以使用以下命令禁用分片分配:

PUT _cluster/settings

  "persistent": 
    "cluster.routing.allocation.enable": "primaries"
  

提示:请检查第 10 步是否有其他选项。

步骤三:执行 flush(可选)

虽然你可以在滚动重启期间继续索引,但如果你暂时停止非必要索引并执行 flush,则分片恢复会更快。 你可以使用以下命令执行刷新:

POST /_flush

步骤四:重启节点

下一步是重新启动 Elasticsearch 节点。 你可以使用以下命令重新启动节点:

service elasticsearch restart

提示:上述命令适合在 Linux 系统上的安装。针对其它系统的安装,请执行相应的命令。

步骤五:检查节点是否加入和节点属性

重启节点后,需要检查节点是否加入集群及其属性。 你可以使用以下命令检查加入的节点及其属性:

GET _cat/nodeattrs?v&s=attr

步骤六:重新启用分片分配

最后一步是重新启用分片分配。 你可以使用以下命令重新启用分片分配:

PUT _cluster/settings

  "persistent": 
    "cluster.routing.allocation.enable": null
  

提示:请检查第 10 步是否有其他选项。

步骤七:启用集群级感知

重新启动所有节点后,你可以启用集群级别的感知。 你可以使用以下命令启用集群级别的感知:

PUT _cluster/settings

  "persistent": 
    "cluster.routing.allocation.awareness.attributes": "server"
  

此命令告诉 Elasticsearch 根据你在步骤 1 中设置的节点属性分配分片。

注意:在运行上述 API 之前,不会有感知,也不会为感知进行分片重定位。

步骤八:检查分片分配

启用集群级别感知后,Elasticsearch 集群将开始根据新的节点属性分配分片的过程。 你可以使用 _cat/shards API 监控分片分配过程的进度:

GET _cat/shards?v

这将返回一个表,显示集群中每个分片的状态。 查看 INITIALIZING 和 RELOCATING 状态以查看分片分配的进度。

步骤九:调整分片重定位设置(可选)

你可以通过修改 indices.recovery.max_bytes_per_sec 和 cluster.routing.allocation.cluster_concurrent_rebalance 设置来调整分片重定位过程的速度。 默认情况下,分片恢复的最大每秒字节数设置为 40 MB。 你可以增加此值以加快分片重定位过程。

要将分片恢复的每秒最大字节数设置为 250 MB,请使用以下 API:

PUT _cluster/settings

  "persistent": 
    "indices.recovery.max_bytes_per_sec": "250mb"
  

你还可以使用 cluster.routing.allocation.cluster_concurrent_rebalance 设置调整并发分片重定位的数量。 默认情况下,只能同时发生两个分片重定位。 你可以增加此值以加快分片重定位过程。

要将并发分片重定位数设置为 10,请使用以下 API:

PUT _cluster/settings

  "persistent": 
    "cluster.routing.allocation.cluster_concurrent_rebalance": "10"
  

步骤十:调整节点未分配分片等待时间(可选)

如果你不想在每个节点重启后禁用(第 2 步)和重新启用(第 6 步)分片分配,你可以使用此选项。 如果你使用此选项,则无需在每次节点重启后执行第 2 步和第 6 步。

对于较大的 Elasticsearch 集群,你可能需要增加未分配的分片在重新分配之前等待的时间。 默认情况下,未分配的分片在分配给另一个节点之前等待一分钟。 你可以使用 index.unassigned.node_left.delayed_timeout 设置增加此等待时间。

要将未分配的分片等待时间增加到 5 分钟,请使用以下 API:

PUT _all/_settings

  "index.unassigned.node_left.delayed_timeout": "5m"

这会将未分配分片的等待时间增加到五分钟,从而使集群有更多时间来解决节点故障或其他可能导致分片未分配的问题。

结论

为自管理的 Elasticsearch 添加分片分配意识是确保你的集群针对性能和弹性进行优化的关键步骤。 通过启用集群级别感知和调整分片重定位设置,你可以帮助确保你的 Elasticsearch 集群始终以最佳性能运行,即使遇到节点故障或其他问题也是如此。 按照本文中概述的步骤,你可以轻松地将分片分配意识添加到你的自管理 Elasticsearch 集群,并享受更具弹性和性能的搜索解决方案的好处。

以上是关于Elasticsearch 有未分配的分片 详细思路的主要内容,如果未能解决你的问题,请参考以下文章

Elasticsearch揭秘 Elasticsearch 分片分配

禁用分配的单个副本的意外 ElasticSearch 分片分配

Elasticsearch:为自管的 Elasticsearch 添加分片分配感知

Elasticsearch 路由分配感知和分片分配

Elasticsearch 集群分配多少分片合理

Elasticsearch的分片和副本