--- title: "集群选举策略配置" date: 2026-02-18 lastmod: 2026-02-18 description: "控制集群主节点选举策略的配置说明" tags: ["集群配置", "选举机制", "高可用"] summary: "配置项作用 # cluster.election.strategy 配置项用于指定集群主节点选举时使用的策略。选举策略定义了在选举过程中如何判断是否获得足够票数成为主节点的规则。 此配置主要作为插件扩展点,允许通过自定义插件实现特殊的选举约束条件,满足特定的集群部署需求。 配置项类型 # 该配置项为静态配置,需要在 easysearch.yml 配置文件中设置,修改后需要重启节点才能生效。 默认值 # default 是否必需 # 可选配置项(有默认值) 取值范围 # default 或插件提供的自定义策略名称 配置格式 # # easysearch.yml # 默认配置 cluster.election.strategy: default # 使用自定义插件提供的策略 cluster.election.strategy: custom_strategy_name 工作原理 # ┌─────────────────────────────────────────────────────────────────┐ │ 选举仲裁判断流程 │ └─────────────────────────────────────────────────────────────────┘ 节点发起选举 │ ▼ 收集投票 │ ├── 检查 committed 配置的仲裁 │ │ │ └── joinVotes.isQuorum(lastCommittedConfiguration) │ ├── 检查 accepted 配置的仲裁 │ │ │ └── joinVotes.isQuorum(lastAcceptedConfiguration) │ └── 执行自定义策略的额外约束 │ └── satisfiesAdditionalQuorumConstraints(." --- ## 配置项作用 `cluster.election.strategy` 配置项用于指定集群主节点选举时使用的策略。选举策略定义了在选举过程中如何判断是否获得足够票数成为主节点的规则。 此配置主要作为插件扩展点,允许通过自定义插件实现特殊的选举约束条件,满足特定的集群部署需求。 ## 配置项类型 该配置项为**静态配置**,需要在 `easysearch.yml` 配置文件中设置,修改后需要重启节点才能生效。 ## 默认值 ``` default ``` ## 是否必需 **可选配置项**(有默认值) ## 取值范围 ``` default 或插件提供的自定义策略名称 ``` ## 配置格式 ```yaml # easysearch.yml # 默认配置 cluster.election.strategy: default # 使用自定义插件提供的策略 cluster.election.strategy: custom_strategy_name ``` ## 工作原理 ``` ┌─────────────────────────────────────────────────────────────────┐ │ 选举仲裁判断流程 │ └─────────────────────────────────────────────────────────────────┘ 节点发起选举 │ ▼ 收集投票 │ ├── 检查 committed 配置的仲裁 │ │ │ └── joinVotes.isQuorum(lastCommittedConfiguration) │ ├── 检查 accepted 配置的仲裁 │ │ │ └── joinVotes.isQuorum(lastAcceptedConfiguration) │ └── 执行自定义策略的额外约束 │ └── satisfiesAdditionalQuorumConstraints(...) │ ├── default: 总是返回 true └── 自定义策略: 实现特定约束逻辑 ``` ## 默认选举策略 **default** 策略使用标准的选举仲裁计算: ```java // 默认策略不添加额外约束 public static final ElectionStrategy DEFAULT_INSTANCE = new ElectionStrategy() { @Override protected boolean satisfiesAdditionalQuorumConstraints(...) { return true; // 不添加额外约束 } }; ``` 当选满足以下条件时,节点成为主节点: 1. 获得 `lastCommittedConfiguration` 的仲裁票数 2. 获得 `lastAcceptedConfiguration` 的仲裁票数 3. 通过自定义策略的额外约束检查(default 策略总是通过) ## 使用场景 ### 1. 默认配置(推荐) ```yaml cluster.election.strategy: default ``` 适用于大多数集群部署场景,使用标准仲裁规则。 ### 2. 自定义选举策略 通过插件实现特殊的选举约束: ```java // 插件实现示例 public class CustomElectionStrategy extends ElectionStrategy { @Override protected boolean satisfiesAdditionalQuorumConstraints( DiscoveryNode localNode, long localCurrentTerm, long localAcceptedTerm, long localAcceptedVersion, VotingConfiguration lastCommittedConfiguration, VotingConfiguration lastAcceptedConfiguration, VoteCollection joinVotes) { // 添加自定义约束逻辑 // 例如:只允许特定属性的节点成为主节点 return hasRequiredAttributes(localNode); } } ``` ```yaml # 配置使用自定义策略 cluster.election.strategy: custom_election_strategy ``` ## 选举机制说明 ### Voting 配置类型 | 配置类型 | 说明 | |----------|------| | lastCommittedConfiguration | 最后一次提交的投票配置,集群稳定状态的配置 | | lastAcceptedConfiguration | 最后一次接受的投票配置,可能包含新加入的节点 | ### 仲裁计算 ``` 仲裁 = ⌊N/2⌋ + 1 其中 N 为投票配置中的节点数 ``` 例如: - 3 节点集群:仲裁 = 2 - 5 节点集群:仲裁 = 3 - 7 节点集群:仲裁 = 4 ## 推荐设置指南 | 部署场景 | 推荐策略 | 说明 | |----------|----------|------| | 标准集群 | default | 使用默认策略即可 | | 多数据中心 | 可能需要自定义 | 确保主节点在特定数据中心 | | 异地多活 | 可能需要自定义 | 控制主节点位置 | | 特定约束场景 | 自定义插件 | 根据业务需求实现 | ## 插件开发示例 ```java public class MyDiscoveryPlugin extends DiscoveryPlugin implements Plugin { @Override public Map getElectionStrategies() { Map strategies = new HashMap<>(); strategies.put("datacenter_aware", new ElectionStrategy() { @Override protected boolean satisfiesAdditionalQuorumConstraints( DiscoveryNode localNode, long localCurrentTerm, long localAcceptedTerm, long localAcceptedVersion, VotingConfiguration lastCommittedConfiguration, VotingConfiguration lastAcceptedConfiguration, VoteCollection joinVotes) { // 只允许主数据中心的节点成为主节点 String datacenter = localNode.getAttributes().get("datacenter"); return "primary".equals(datacenter); } }); return strategies; } } ``` ## 配置验证 ```bash # 查看当前选举策略 GET /_cluster/settings?filter_path=*.cluster.election.strategy # 查看集群状态 GET /_cluster/state # 查看节点信息 GET /_nodes ``` ## 注意事项 1. **静态配置**:修改此配置需要重启节点 2. **集群一致性**:集群中所有节点应使用相同的选举策略 3. **插件依赖**:自定义策略需要相应的插件支持 4. **可用性影响**:不当的自定义策略可能导致无法选出主节点 5. **测试充分**:自定义策略应在测试环境充分验证后再用于生产 6. **默认策略推荐**:除非有特殊需求,建议使用 default 策略