Patroni执行switchover时API请求如何选择目标服务器
Patroni管理Postgres集群Switchover API调用问题
基础环境信息
- 3节点Postgres集群节点列表:
- serverA_1
- serverA_2
- serverB
- 集群规则:serverA_2必须经过手动切换操作才可成为leader节点
- 当前状态:集群leader为 serverA_1
- 操作目标:执行switchover操作,将leader切换为 serverB
待确认的两种调用方案
方案1(现有Jenkins任务使用写法)
curl -s http://serverA_1:8008/switchover -XPOST -d '{"leader":"serverA_1"}'
核心逻辑:告知当前leader节点主动放弃leader角色。
方案2(逻辑推导写法)
curl -s http://serverB:8008/switchover -XPOST -d '{"leader":"serverB"}'
核心逻辑:告知目标节点主动接管leader角色。
问题说明
按常规逻辑推导认为方案2合理,但现有生产Jenkins任务采用方案1写法,需要确认正确的API调用方式。
正确答案
正确的调用方式是方案1,即向当前在位的leader节点serverA_1发送switchover请求,现有Jenkins的写法逻辑是对的,但建议补充参数避免切换目标不符合预期。
具体原因和注意事项如下:
- 8008是Patroni的REST API默认端口,Patroni的switchover接口设计要求请求必须发送给当前leader节点。follower节点没有集群控制权限,收到switchover请求会直接返回错误,不会执行任何切换操作,所以方案2根本不会生效。
- 请求体里的
leader字段是安全校验位,作用是确认你发请求时连接的节点确实是你指定的当前leader,避免因为网络延迟、集群已经发生意外故障切换等场景触发误操作。如果请求到达节点时,该节点已经不是leader,请求会直接被拒绝,不会触发异常流程。 - 你当前写的方案1请求没有指定切换目标,Patroni会自动选择符合条件的优先级最高的节点作为新leader。由于你集群里serverA_2配置了必须手动切换才能成为leader(一般是设置了
nofailover标签或者节点优先级为0),默认自动选择确实会挑中serverB,但生产环境强烈建议补充candidate参数明确指定目标节点,避免意外选主,完整的生产可用请求如下:curl -s http://serverA_1:8008/switchover -XPOST -d '{"leader":"serverA_1", "candidate":"serverB"}' - 额外提醒:你问题描述里写当前leader是
serverA-1(横杠分隔),节点清单里是serverA_1(下划线分隔),实际调用时leader和candidate字段的值必须和Patroni集群里注册的节点名完全一致,否则校验会直接失败。
内容的提问来源于stack exchange,提问作者sadux
相关产品推荐
相关产品推荐

