面试题答案
一键面试原理
cluster.routing.allocation.awareness
是 Elasticsearch 中用于控制分片在集群节点间分布的配置选项。它的核心原理是基于节点的元数据属性(如机架、数据中心等标识)来进行分片分配,目的是确保不同分片尽可能均匀地分布在不同的故障域,避免因某个故障域出现问题(如整个机架断电、数据中心网络故障等)导致大量分片不可用,从而提高系统的高可用性。
当启用此功能时,Elasticsearch 在分配分片时会检查节点的相关属性,并尝试将主分片及其副本分片分配到具有不同属性值的节点上。例如,如果以机架作为故障域,节点通过设置机架相关属性,Elasticsearch 会尽量将分片分散到不同机架的节点,这样即使某个机架出现故障,其他机架上的分片副本仍可继续提供服务。
配置方法
- 节点属性配置:首先需要在每个节点的配置文件(
elasticsearch.yml
)中设置与故障域相关的节点属性。例如,以机架为例:
node.attr.rack: rack1
这里 rack1
是机架的标识,可以根据实际情况修改。如果有多个机架,不同节点设置不同的 rack
值,如 rack2
、rack3
等。对于数据中心,可以类似设置:
node.attr.dc: dc1
- 集群配置:在集群层面启用
cluster.routing.allocation.awareness
并指定依据的属性。同样以机架为例,在elasticsearch.yml
或通过动态配置 API 设置:
cluster.routing.allocation.awareness.attributes: rack
这就告诉 Elasticsearch 在分配分片时依据 rack
这个节点属性来分配。
实际场景举例
假设我们有一个 Elasticsearch 集群,分布在两个数据中心(dc1
和 dc2
),每个数据中心内有三个机架(rack1
、rack2
、rack3
),每个机架上有若干 Elasticsearch 节点。
- 节点属性配置:
- 在
dc1
数据中心rack1
上的节点,其elasticsearch.yml
配置:
- 在
node.attr.dc: dc1
node.attr.rack: rack1
- 在 `dc1` 数据中心 `rack2` 上的节点,配置为:
node.attr.dc: dc1
node.attr.rack: rack2
- 以此类推,在 `dc2` 数据中心的节点也类似配置不同的 `dc` 和 `rack` 值。
2. 集群配置:在集群的 elasticsearch.yml
中设置:
cluster.routing.allocation.awareness.attributes: rack
- 分片分配效果:当创建一个索引时,Elasticsearch 会尽量将主分片和副本分片分配到不同机架的节点上。例如,一个索引有 3 个主分片和 2 个副本分片,Elasticsearch 会尝试将这些分片分布在尽可能多的不同机架上。这样,如果
dc1
数据中心的rack1
出现故障,由于其他分片分布在rack2
、rack3
以及dc2
数据中心的机架上,索引仍然可以保持可用,大大提高了系统的高可用性。如果还想进一步以数据中心为维度进行分片分配,可在集群配置中增加:
cluster.routing.allocation.awareness.force.rack.values: rack1,rack2,rack3
cluster.routing.allocation.awareness.force.dc.values: dc1,dc2
这样不仅可以在机架层面,还能在数据中心层面确保分片的合理分布,增强系统应对不同级别故障域故障的能力。