Elasticsearch负载均衡策略发生死锁解决方案

一、问题描述与解决方案

1、问题产生的背景

es集群版本:elasticsearch-5.5.3
HEAD插件索引集群显示(red/yellow)。四个节点的集群,索引有大量写入,同时有大量删除操作,删除操作是在单个index(mapping分片数量为4)中执行delete_by_query接口后台执行task的方式实现。集群在负载均衡的时候有线程死锁了,导致分片未分配成功SHARD UNASSINGED。
报错信息:
在这里插入图片描述该报错信息源码位置

reached the limit of outgoing shard recoveries [%d] on the node [%s] which holds the primary,cluser setting [cluster.routing.allocation.node_concurrent_outgoing_recoveries=2]

2、解决方案

在集群设置cluster.routing.allocation.node_concurrent_recoveries这个参数,大于最大分片数量。此参数默认值为2。
在这里插入图片描述

二、集群分片分配时的相关设置(译文)

原文链接:Cluster level shard allocation

集群分片分配

分片分配是将分片分配给节点的过程。这可能发生在初始恢复、副本分配、重新平衡期间(分片均衡分配),或者在添加或删除节点时。

分片分配设置

下面的动态设置可以控制分片的分配和恢复:

1.cluster.routing.allocation.enable

为特定类型的分片启用或者禁用分配:

  • all-(默认设置)允许所有类型的分片分配。
  • primaries-仅仅允许主分片分配
  • new_primaries-仅允许新索引的主分片进行分片分配。
  • none-任何索引都不允许任何类型的分片分配。
  • 此设置不会影响重启节点时本地主分片的恢复。如果重新启动的节点的分配id与集群状态下的一个活动分配id匹配,则该节点拥有未分配的主碎片的副本,该节点将立即恢复该主节点。

2.cluster.routing.allocation.node_concurrent_incoming_recoveries

允许在一个节点上发生多少个并发的传入分片恢复。传入恢复是在节点上分配目标分片(很可能是复制,除非正在重新定位碎片)的恢复。默认为2。

3.cluster.routing.allocation.node_concurrent_outgoing_recoveries

允许在一个节点上执行多少并发传出分片恢复。传出恢复是在节点上分配源分片(很可能是主分片,除非正在重新定位分片)的恢复。默认为2。

4.cluster.routing.allocation.node_concurrent_recoveries

快捷设置:cluster.routing.allocation.node_concurrent_incoming_recoveries 和 cluster.routing.allocation.node_concurrent_outgoing_recoveries.

5.cluster.routing.allocation.node_initial_primaries_recoveries

虽然副本的恢复是通过网络进行的,但是在节点重新启动之后,未分配的主节点的恢复使用本地磁盘中的数据。这些应该是快速的,以便更多的初始主恢复可以在同一节点上并行进行。默认为4。

6.cluster.routing.allocation.same_shard.host

允许执行检查,以防止在单个主机上分配同一分片的多个实例(基于主机名和主机地址)。默认值为false,这意味着在默认情况下不执行任何检查。此设置仅适用于在同一台计算机上启动多个节点的情况。

分片重新平衡分配设置

以下动态设置可用于控制集群中分片的重新平衡:

1.cluster.routing.rebalance.enable

为特定类型的碎片启用或禁用重新平衡:

  • all-(默认设置)允许重新平衡所有节点。
  • primaries-仅允许主分片重新平衡。
  • -replicas-仅允许副分片重新平衡。
  • none-任何索引都不允许任何类型的分片重新平衡分配。

2.cluster.routing.allocation.allow_rebalance

指定什么时候允许碎片再平衡:

  • always-总是允许。
  • indices_primaries_active-只有当集群中的所有主分片都被分配时。
  • indices_all_active(默认设置)只有当集群中所有主分片和副分片都被分配时。

3.cluster.routing.allocation.cluster_concurrent_rebalance
允许控制集群范围内允许多少并发分片重新平衡。默认为2。注意,此设置仅控制由于集群中的不平衡而导致的并发碎片重定位的数量。此设置不限制由于分配筛选或强制感知而导致的分片重定位。

启发式分片平衡分配

当不允许重新平衡操作时,任何节点的权值与任何其他节点的权值之间的距离都超过balance.threshold时,集群就处于平衡状态。

1.cluster.routing.allocation.balance.shard

定义在节点上分片分配总数的权重因子(浮点数)。默认值0.45f。这增加了均衡集群中所有节点上分片配置数量相等的趋势。

2.cluster.routing.allocation.balance.index

为分配给特定节点(浮点数)的每个索引的分片数定义权重因子。默认0.55f。这增加了使集群中所有节点的每个索引的碎片数量相等的趋势。

3.cluster.routing.allocation.balance.threshold

应该执行的操作的最小优化值(非负浮点数)。默认为1.0度。提高这个值将导致集群在优化碎片平衡方面的积极性降低。

发布了173 篇原创文章 · 获赞 113 · 访问量 30万+

猜你喜欢

转载自blog.csdn.net/superman_xxx/article/details/91896841