文章目录
- 配置ElasticSearch
- 集群级分片分配和路由设置
- 集群级分片分配设置
- 分片重新平衡设置
- 分片平衡启发式设置
- 基于磁盘的分片分配设置
配置ElasticSearch
集群级分片分配和路由设置
分片分配是将分片分配给节点的过程。这可能发生在初始恢复、副本分配、重新平衡或添加或删除节点时。
master
的主要作用之一是决定将哪些分片分配给哪些节点,以及何时在节点之间移动分片以重新平衡集群。
有许多设置可用于控制分片分配过程:
-
Cluster-level shard allocation settings
设置控制分配和重新平衡操作。 -
Disk-based shard allocation settings
解释了 Elasticsearch 如何考虑可用磁盘空间以及相关设置。 -
Shard allocation awareness
和Forced awareness
控制如何在不同的机架或可用区之间分配分片。 -
Cluster-level shard allocation filtering
允许某些节点或节点组从分配中排除,以便它们可以退役。
集群级分片分配设置
您可以使用以下设置来控制分片分配和恢复:
cluster.routing.allocation.enable
:为特定类型的分片启用或禁用分配:
-
all -
(默认)允许为所有类型的分片分配分片。 -
primaries -
只允许为主分片分配分片。 -
new_primaries -
仅允许为新索引的主分片分配分片。 -
none -
任何索引都不允许进行任何类型的分片分配。
该设置不影响重启节点时本地主分片的恢复。如果一个重新启动的节点拥有一个未分配的主分片的副本,假设它的分配id
与集群状态中的一个活动分配id
相匹配,那么该节点将立即恢复该主分片。
cluster.routing.allocation.node_concurrent_incoming_recoveries
:一个节点上允许多少个并发恢复传入进来的分片。默认是2
。cluster.routing.allocation.node_concurrent_outgoing_recoveries
:一个节点上允许多少并发输出需要恢复的分片数量。默认是2
。cluster.routing.allocation.node_initial_primaries_recoveries
:虽然副本的恢复是通过网络进行的,但节点重启后未分配的主分片的恢复使用来自本地磁盘的数据。这种方式是很快速的,可以在同一个节点上并行的恢复未分配的主分片。默认值为4
。cluster.routing.allocation.same_shard.host
:允许根据主机名和主机地址执行检查以防止在单个主机上分配同一分片的多个实例。默认为false
,意味着默认情况下不执行任何检查。此设置仅适用于在同一台计算机上启动多个节点的情况。
分片重新平衡设置
当集群中的每个节点上具有相同数量的分片时,集群是平衡的。Elasticsearch 运行一个称为自动重新平衡的进程,它在集群中的节点之间移动分片以改善其平衡。重新平衡遵循所有其他分片分配规则,例如 allocation filtering 和forced awareness ,这可能会阻止它完全平衡集群。在这种情况下,重新平衡会努力在您配置的规则内实现最平衡的集群。如果您使用data tiers ,那么 Elasticsearch 会自动应用分配过滤规则将每个分片放置在适当的层中。这些规则意味着平衡器在每一层内独立工作。
您可以使用以下设置来控制集群中分片的重新平衡:
cluster.routing.rebalance.enable
:(动态)为特定类型的分片启用或禁用重新平衡:
-
all -
(默认)允许对所有类型的分片进行分片平衡。 -
primaries -
只允许主分片的分片平衡。 -
replicas-
仅允许对副本分片进行分片平衡。 -
none -
任何索引都不允许进行任何类型的分片平衡。
cluster.routing.allocation.allow_rebalance
:指定何时允许分片重新平衡:
-
always -
始终允许重新平衡。 -
index_primaries_active -
仅当集群中的所有主节点都已分配时。 -
index_all_active -
(默认)仅当集群中的所有分片(主分片和副本)都被分配时。
-
cluster.routing.allocation.cluster_concurrent_rebalance
:集群范围内,允许多少个并发来进行分片重新分配。默认为2
。注意,此设置仅控制由于集群中的不平衡而导致的并发分片重定位的数量。
分片平衡启发式设置
再平衡是根据每个节点分配的分片计算其权重,然后在节点之间移动分片,以减少较重节点的权重,增加较轻节点的权重。当不存在可能的分片移动时,集群是平衡的,分片移动可以使任何节点的权重比任何其他节点的权重更接近一个可配置的阈值。以下设置允许您控制这些计算的详细信息。
-
cluster.routing.allocation.balance.shard
:定义节点上分配的分片总数的权重因子(浮点数)。默认为0.45f
。提高这个值就会使集群中所有节点的分片数量趋于相等。 -
cluster.routing.allocation.balance.index
:定义在特定节点上分配的每个索引的分片数量的权重因子(浮动)。默认为0.55f
。提高这个值会使集群中所有节点的每个索引的分片数量趋于相等。 -
cluster.routing.allocation.balance.threshold
:
基于磁盘的分片分配设置
基于磁盘的碎片分配器确保所有节点都有足够的磁盘空间,而不会执行超出范围的碎片移动。它根据低水印和高水印的阈值分配碎片。它的主要目标是确保没有节点超过高水印线,或者至少任何这样的超限都只是暂时的。如果一个节点超过了高水印线,Elasticsearch将通过将其部分分片移动到集群中的其他节点上来解决这个问题。
提示:节点暂时超过高水位是正常现象。
分配器还试图通过禁止向超过低水位的节点分配更多的分片来保持节点远离高水位。重要的是,如果您的所有节点都超过了低水位,那么就不能分配新的分片,Elasticsearch将无法在节点之间移动任何分片,以保持磁盘使用率低于高水位。您必须确保集群总有足够的磁盘空间,并且总有一些节点低于低水位。
如果节点填满其磁盘的速度比 Elasticsearch 将分片移动到其他地方的速度快,则存在磁盘完全填满的风险。为了防止这种情况,作为最后的手段,一旦磁盘使用量达到洪水水印阶段,Elasticsearch 将阻止向受影响节点写入索引分片。它还将继续将分片移动到集群中的其他节点上。当受影响节点上的磁盘使用率低于高水位线时,Elasticsearch 会自动删除写入块。
您可以使用以下设置来控制基于磁盘的分配:
- cluster.routing.allocation.disk.threshold_enabled:默认为
true
。设置为false可禁用磁盘分配器。 - **
cluster.routing.allocation.disk.watermark.low
**:控制磁盘使用的低水印。默认为85%
,意味着 Elasticsearch 不会向磁盘使用率超过85%
的节点分配分片。它也可以设置为绝对字节值(如500mb
)以防止 Elasticsearch 在可用空间少于指定量时分配分片。此设置对新创建索引的主分片没有影响,但会阻止分配它们的副本。 cluster.routing.allocation.disk.watermark.high
:控制高水位。默认值为90%
,这意味着Elasticsearch将尝试将分片从磁盘使用率超过90%
的节点上迁移。也可以将其设置为绝对字节值(类似于低水印),以便在节点的空闲空间小于指定数量时将分片移离节点。此设置会影响所有分片的分配,无论之前是否已分配。cluster.routing.allocation.disk.watermark.enable_for_single_data_node
:对于单个数据节点,在做出分配决策时默认是忽略磁盘水印。这是不推荐使用的行为,将在 8.0 中更改。可以将此设置设置为true
以启用单个数据节点集群的磁盘水印cluster.routing.allocation.disk.watermark.flood_stage
: 控制洪水阶段水印,默认为95%
。当超过这个阀值的时候,Elasticsearch在每个索引上强制执行只读索引块。此设置是防止节点耗尽磁盘空间的最后手段。当磁盘利用率低于高水位线时,索引块将自动释放。
提示:您不能在这些设置中混合使用百分比值和字节值。要么将所有值设置为百分比值,要么将所有值设置为字节值。这样做是为了让Elasticsearch能够验证设置在内部是一致的,确保低磁盘阈值小于高磁盘阈值,高磁盘阈值小于洪水阶段阈值。
重置 my-index-000001 索引上的只读索引块的示例:
curl -X PUT "localhost:9200/my-index-000001/_settings?pretty" -H 'Content-Type: application/json' -d'
{
"index.blocks.read_only_allow_delete": null
}
'
cluster.routing.allocation.disk.watermark.flood_stage.frozen
:- **
cluster.routing.allocation.disk.watermark.flood_stage.frozen.max_headroom
**: cluster.info.update.interval
:Elasticsearch 应该多久检查一次集群中每个节点的磁盘使用情况。默认为30
秒。
下面是一个将低水位更新为至少100gb
空闲、将高水位更新为至少50gb
空闲、将洪水水位更新为至少10gb
空闲的示例,并每分钟更新集群信息:
curl -X PUT "localhost:9200/_cluster/settings?pretty" -H 'Content-Type: application/json' -d'
{
"transient": {
"cluster.routing.allocation.disk.watermark.low": "100gb",
"cluster.routing.allocation.disk.watermark.high": "50gb",
"cluster.routing.allocation.disk.watermark.flood_stage": "10gb",
"cluster.info.update.interval": "1m"
}
}
'
分片分配意识