Elasticsearch 的Cluster-level Shard Allocation and Routing Settings(集群级别的分片分配和路由设置)是用于控制分片在集群中的分配和移动的高级功能。这些设置允许管理员根据集群的硬件配置、性能需求、资源可用性以及业务逻辑,灵活地管理分片的分配和重新平衡。以下是对这些设置的详细说明:
---
1.分片分配和路由的基本概念
分片分配(Shard Allocation)是指 Elasticsearch 将分片(包括主分片和副本分片)分配到集群中的节点的过程。分片分配可能发生在以下场景:
• 初始恢复(Initial Recovery):当索引被创建时。
• 副本分配(Replica Allocation):当副本分片需要被分配时。
• 重新平衡(Rebalancing):当集群状态发生变化(如节点加入或移除)时。
• 集群或索引设置更新时。
主节点(Master Node)负责决定将哪些分片分配到哪些节点,并在必要时移动分片以重新平衡集群。
---
2.集群级别的分片分配设置
集群级别的分片分配设置用于控制分片分配和重新平衡的行为。以下是一些关键设置:
2.1`cluster.routing.allocation.enable`
控制分片分配的启用或禁用:
• `all`(默认):允许所有类型的分片分配。
• `primaries`:仅允许主分片分配。
• `new_primaries`:仅允许新索引的主分片分配。
• `none`:禁止所有分片分配。
此设置仅影响未来的分配,不会重新分配已分配的分片。
2.2`cluster.routing.allocation.same_shard.host`
如果设置为`true`,禁止将同一分片的多个副本分配到同一主机上的不同节点。默认值为`false`,允许分片副本分配到同一主机的不同节点。
2.3并发恢复设置
• `cluster.routing.allocation.node_concurrent_incoming_recoveries`:控制节点上允许同时发生的传入分片恢复数量(默认值为 2)。
• `cluster.routing.allocation.node_concurrent_outgoing_recoveries`:控制节点上允许同时发生的传出分片恢复数量(默认值为 2)。
• `cluster.routing.allocation.node_concurrent_recoveries`:同时设置传入和传出恢复的数量(默认值为 2)。
• `cluster.routing.allocation.node_initial_primaries_recoveries`:控制节点上初始主分片恢复的并发数量(默认值为 4)。
这些设置影响分片移动的性能,但通常不建议调整默认值。
---
3.分片重新平衡设置
重新平衡是 Elasticsearch 自动优化集群平衡的过程,目标是使每个节点上的分片数量和资源使用尽可能均匀。重新平衡会遵守分配过滤和强制感知等规则。
3.1`cluster.routing.allocation.allow_rebalance`
控制何时允许分片重新平衡:
• `always`(默认):始终允许重新平衡。
• `indices_primaries_active`:仅当所有主分片都已分配时。
• `indices_all_active`:仅当所有分片(主分片和副本分片)都已分配时。
3.2`cluster.routing.rebalance.enable`
控制哪些类型的分片可以重新平衡:
• `all`(默认):允许所有类型的分片重新平衡。
• `primaries`:仅允许主分片重新平衡。
• `replicas`:仅允许副本分片重新平衡。
• `none`:禁止所有分片重新平衡。
3.3`cluster.routing.allocation.cluster_concurrent_rebalance`
控制整个集群中同时发生的分片重新平衡数量(默认值为 2)。增加此值可能会消耗更多资源,但通常不建议调整默认值。
3.4`cluster.routing.allocation.type`
选择用于计算集群平衡的算法:
• `desired_balance`(默认):使用后台任务计算期望的分片平衡。
• `balanced`(已弃用):旧版算法,基于当前集群状态进行分片移动。
---
4.基于磁盘的分片分配设置
Elasticsearch 使用磁盘水位线(Watermarks)来控制磁盘空间的使用,并防止节点磁盘空间耗尽。
4.1磁盘水位线
• `cluster.routing.allocation.disk.watermark.low`:低水位线(默认 85%),超过此值时,节点不会分配新的分片。
• `cluster.routing.allocation.disk.watermark.high`:高水位线(默认 90%),超过此值时,Elasticsearch 会尝试将分片从该节点移走。
• `cluster.routing.allocation.disk.watermark.flood_stage`:洪水阶段水位线(默认 95%),超过此值时,Elasticsearch 会对相关索引强制执行只读限制,防止磁盘空间耗尽。
4.2最大预留空间
• `cluster.routing.allocation.disk.watermark.low.max_headroom`
• `cluster.routing.allocation.disk.watermark.high.max_headroom`
• `cluster.routing.allocation.disk.watermark.flood_stage.max_headroom`
这些设置用于限制水位线对应的空闲磁盘空间需求,适用于大容量磁盘。
---
5.分片分配感知设置
通过分片分配感知(Shard Allocation Awareness),Elasticsearch 可以根据节点的物理位置(如机架、数据中心)来分配分片,以提高数据的可用性和容错能力。
5.1`cluster.routing.allocation.awareness.attributes`
指定节点属性(如`rack_id`或`datacenter`),Elasticsearch 会根据这些属性将主分片和副本分片分配到不同的位置。
5.2`cluster.routing.allocation.awareness.force.*`
强制感知设置,确保在某些属性值缺失的情况下,分片仍然能够正确分配。
---
6.集群级别的分片分配过滤
集群级别的分片分配过滤允许管理员通过动态设置排除或包含某些节点,从而控制分片的分配位置。
6.1过滤器类型
• `include`:允许分片分配到满足条件的节点。
• `require`:分片必须分配到满足所有条件的节点。
• `exclude`:禁止分片分配到满足条件的节点。
6.2使用场景
• 退役节点:通过排除特定节点的 IP 地址,将分片移出该节点。
• 资源隔离:根据节点的属性(如硬件性能或数据层角色)分配分片。
---
7.实际应用场景
7.1优化集群平衡
通过调整重新平衡设置(如`cluster.routing.allocation.cluster_concurrent_rebalance`),可以优化集群的平衡过程,确保资源均匀分布。
7.2防止磁盘空间耗尽
通过合理设置磁盘水位线,可以防止节点磁盘空间不足,从而避免写入阻塞。
7.3容错和高可用性
通过分片分配感知,可以将分片分布在不同的物理位置,提高集群的容错能力。
7.4资源隔离
通过分片分配过滤,可以将不同类型的索引分配到不同的硬件资源上,优化性能和资源利用。
---
8.注意事项
• 调整设置时需谨慎:某些设置(如并发恢复数量或磁盘水位线)的调整可能会对集群性能产生影响。
• 动态设置:大多数分配设置是动态的,可以在不重启节点的情况下实时生效。
• 监控和调整:建议定期监控集群状态和磁盘使用情况,并根据实际需求调整设置。
---
总结
Elasticsearch 的集群级别分片分配和路由设置提供了强大的功能,允许管理员根据集群的硬件配置、性能需求和业务逻辑灵活地管理分片的分配和重新平衡。通过合理配置这些设置,可以优化集群的性能、可用性和资源利用,同时满足业务需求。