微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Elasticsearch配置文件介绍2—— 群集级分片分配、路由设置及断路器设置

断路器设置

Elasticsearch包含多个断路器,用于防止操作导致OutOfMemoryError。每个断路器指定它可以使用的内存量限制。此外,还有一个父级中断器,用于指定可跨所有中断器使用的内存总量。

除非另有说明,否则可以使用集群更新设置 API在活动集群上动态更新这些设置。

父断路器

父级断路器可配置以下设置:

indices.breaker.total.use_real_memory

静态)确定父断路器应考虑实际内存使用情况(true)或者仅考虑子断路器保留的容量(false)。认为true。

indices.breaker.total.limit 

动态)所有父断路器的启动极限。如果 indices.breaker.total.use_real_memory 为false,则认为JVM堆的70%。如果 indices.breaker.total.use_real_memory 为true,则认为JVM堆的95%。

字段数据断路器

字段数据断路器估计将字段加载到字段数据缓存所需的堆内存。如果加载字段会导致缓存超过预定义的内存限制,断路器将停止操作并返回错误

indices.breaker.fielddata.limit

(动态)字段数据断路器的限制。认为JVM堆的40%。

indices.breaker.fielddata.overhead

(动态)一个常数,所有现场数据估计值乘以该常数以确定最终估计值。认值为1.03。

请求断路器

请求断路器允许Elasticsearch防止每个请求的数据结构(例如,在请求期间用于计算聚合的内存)超过一定的内存量。

indices.breaker.request.limit 

(动态)请求断路器的限制。认为JVM堆的60%。

indices.breaker.request.overhead

(动态)一个常数,所有请求的估计值都与之相乘以确定最终的估计值。认为1。

 

飞行中请求断路器

飞行中请求断路器允许Elasticsearch限制传输或HTTP级别上所有当前活动传入请求的内存使用量,使其不超过节点上的特定内存量。内存使用量基于请求本身的内容长度。这个断路器还考虑到内存不仅用于表示原始请求,而且还作为认开销反映的结构化对象。

network.breaker.inflight_requests.limit

(动态)飞行中请求的限制,认为JVM堆的100%。这意味着它受到为父断路器配置的限制的约束。

network.breaker.inflight_requests.overhead

(动态)一个常数,所有飞行中的请求估计值乘以该常数以确定最终估计值。认为2。

记述请求断路器

记述断路器允许Elasticsearch限制在请求完成时未释放的内存中的内容的内存使用。这包括Lucene段内存之类的东西。

indices.breaker.accounting.limit

(动态)记述断路器的限制,认为JVM堆的100%。这意味着它受到为父断路器配置的限制的约束。

indices.breaker.accounting.overhead

(动态)所有会计估计数相乘以确定最终估计数的常数。认为1

脚本编译断路器

与以前基于内存的断路器略有不同,脚本编译断路器限制了一段时间内内联脚本编译的次数

有关更多信息,请参阅脚本文档的“首选参数”部分。

script.context.$CONTEXT.max_compilations_rate

(动态)特定时间间隔内允许为给定上下文编译的唯一动态脚本数的限制。认为75/5m,即每5分钟75次。

 

群集级分片分配和路由设置

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

主节点的主要角色之一是决定将哪些shard分配给哪些节点,以及何时在节点之间移动shard以重新平衡集群。

有许多设置可用于控制分片分配过程:

  • 群集级别的分片分配设置控制分配和重新平衡操作。
  • 基于磁盘的分片分配设置解释了Elasticsearch如何考虑可用磁盘空间以及相关设置。
  • 分片分配意识和强迫意识控制如何跨不同机架或可用性区域分发Shard。
  • 群集级别的分片分配过滤允许从分配中排除某些节点或节点组,以便它们可以退役。

除此之外,还有其他一些杂项集群级别设置。

下面开始细讲下以上设置。

集群级分片分配设置

我们可以使用以下设置来控制分片分配和恢复:

cluster.routing.allocation.enable

(动态)启用或禁用特定类型分片的分配:

  • all-(default)允许为所有类型的分片 进行分片分配。
  • primaries - 只允许为主分片进行分片分配。
  • new_primaries -只允许为新索引的主分片 进行分片分配。
  • no -任何索引都不允许任何类型的分片分配。

重新启动节点时,此设置不影响本地主分片的恢复。如果重新启动的节点有一个未分配的主分片的副本,则该节点将立即恢复该主分片,前提是其分配id与处于群集状态的活动分配id之一匹配。

cluster.routing.allocation.node_concurrent_incoming_recoveries

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

cluster.routing.allocation.node_concurrent_outgoing_recoveries

(动态)在节点上允许发生多少并发传出分片恢复。传出恢复是在节点上分配目标分片(最可能是主分片,除非分片重新定位)的恢复。认为2。

cluster.routing.allocation.node_concurrent_recoveries

(动态)设置两者的快捷方式:cluster.routing.allocation.node_concurrent_incoming_recoveries 和 cluster.routing.allocation.node_concurrent_outgoing_recoveries

cluster.routing.allocation.node_initial_primaries_recoveries

(动态)当通过网络恢复副本时,在重新启动未分配的主节点后恢复将使用本地磁盘中的数据。这些恢复应该很快,以便在同一节点上并行执行更多的初始主恢复。认为4。

cluster.routing.allocation.same_shard.host

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

分片重新平衡设置

一个集群在每个节点上有相等数量的分片,而在任何节点上没有来自任何索引的分片的集中时,该集群是平衡的。Elasticsearch运行一个称为“重新平衡”的自动过程,该过程在集群中的节点之间移动分片以提高其平衡性。重新平衡遵循所有其他分片分配规则,例如分配过滤和强制感知,这可能会阻止它完全平衡集群。在这种情况下,重新平衡将努力在我们配置的规则中实现最平衡的集群。如果我们使用的是数据层,那么Elasticsearch会自动应用分配过滤规则,将每个分片放置在适当的层中。这些规则意味着均衡器在每一层中独立工作。

我们可以使用以下设置来控制集群中分片的重新平衡:

cluster.routing.rebalance.enable

(动态)为特定类型的分片启用或禁用重新平衡:

  • all -(default)允许对所有类型的分片进行分片平衡。
  • primaries -只允许主分片的分片平衡。
  • replicas - 仅允许副本分片的分片平衡。
  • none  - 任何索引都不允许任何类型的分片平衡。

cluster.routing.allocation.allow_rebalance

(动态)指定允许分片重新平衡的时间:

  • always - 始终允许重新平衡
  • indices_primaries_active - 仅当群集中的所有主站都已分配时。
  • indices_all_active -(认)仅当集群中的所有分片(主分片和副本)都已分配时。

cluster.routing.allocation.cluster_concurrent_rebalance

(动态)允许控制在集群范围内允许多少并发分片重新平衡。认为2。请注意,此设置仅控制由于集群中的不平衡而导致的并发分片重定位的数量。此设置不会由于分配筛选或强制感知而限制分片重新定位。

分片平衡启发式设置

重新平衡的工作原理是,根据每个节点的分片分配计算其权重,然后在节点之间移动分片,以减少较重节点的权重,并增加较轻节点的权重。当没有可能的分片移动使任何节点的权重接近任何其他节点的权重超过可配置的阈值时,集群是平衡的。以下设置允许我们控制这些计算的详细信息。

cluster.routing.allocation.balance.shard

(动态)定义节点上分配的分片总数的权重因子(float)。认值为0.45f。提高这个值会使集群中所有节点的分片数量趋于均衡。

cluster.routing.allocation.balance.index

(动态)定义在特定节点上分配的每个索引的分片数的权重因子(float)。认值为0.55f。这一点的提出,会导致集群中所有节点的每个索引分片数相等的趋势。

cluster.routing.allocation.balance.threshold

(动态)应该执行的操作的最小优化值(非负浮点)。认值为1.0f。提高这个值将导致集群在优化分片平衡方面不那么积极。

不管平衡算法的结果如何,由于强制感知或分配过滤,可能不允许重新平衡。

 

分片分配感知

我们可以使用自定义节点属性作为感知属性,以使Elasticsearch在分配分片时考虑到我们的物理硬件配置。如果Elasticsearch知道哪些节点位于同一物理服务器、同一机架或同一分区中,它可以分发主分片及其副本分片,以最大限度地降低发生故障时丢失所有碎片副本的风险。

使用 (动态) cluster.routing.allocation.awareness.attributes 设置启用分片分配感知时,分片仅分配给为指定感知属性设置了值的节点。如果使用多个感知属性,Elasticsearch在分配分片时会分别考虑每个属性

认情况下,Elasticsearch使用自适应副本选择来路由搜索获取请求。但是,由于存在分配感知属性,Elasticsearch将倾向于使用相同位置(具有相同感知属性值)的分片来处理这些请求。通过在属于集群的每个节点上指定export ES_JAVA_OPTS="$ES_JAVA_OPTS -Des.search.ignore_awareness_attributes=true"系统属性,可以禁用此行为。

属性值的数量决定在每个位置分配多少个分片副本。如果每个位置的节点数量不平衡,并且存在大量副本,则副本分片可能无法分配。

启用分片分配感知

1、使用自定义节点属性指定每个节点的位置。例如,如果希望Elasticsearch在不同的机架上分发分片,可以在每个节点的Elasticsearch.yml配置文件中设置一个名为rack_id的感知属性

node.attr.rack_id: rack_one

也可以在启动节点时设置自定义属性

`./bin/elasticsearch -Enode.attr.rack_id=rack_one`

2、通过在每个主节点的Elasticsearch.yml配置文件中设置cluster.routing.allocation.awareness.attributes,告诉Elasticsearch在分配分片时考虑一个或多个感知属性

cluster.routing.allocation.awareness.attributes: rack_id 

将多个属性指定为逗号分隔的列表。

我们还可以使用集群更新设置API来设置或更新集群的感知属性

在本示例配置中,如果我们启动两个节点,并将node.attr.rack_id设置为rack_one,然后创建一个索引,其中包含5个主分片和每个主分片的1个副本,则所有主分片和副本都将分配给这两个节点。

如果添加node.attr.rack_id设置为rack_two的两个节点,Elasticsearch会将分片移动到新节点,确保(如果可能)同一分片的两个副本不在同一机架中。

如果rack_two 出现故障并同时关闭了它的两个节点,认情况下Elasticsearch会将丢失的分片副本分配给rack_one中的节点。要防止在同一位置分配特定分片的多个副本,可以启用强制感知。

强制感知

认情况下,如果一个位置失败,Elasticsearch会将所有丢失的副本分片分配给其余位置。虽然我们可能在所有位置都有足够的资源来承载主分片和副本分片,但单个位置可能无法承载所有分片。

 

 

 

 

 

 

 

 

 

 

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐