MongoDB 的副本集(Replica Set)会自动处理主从节点的切换,以确保高可用性。默认情况下,当主节点不可用时,副本集中的从节点会选举一个新的主节点(Primary)。这个过程通常是自动的,你不需要干预。
1. 主从自动切换
MongoDB 使用 选举机制来选择主节点。当当前主节点不可用时(如宕机或网络分区),副本集中的从节点会进行选举,选出一个新的主节点。这个过程通常是快速且无缝的,确保了应用的高可用性。
- 优先级(Priority):每个节点在副本集中的选举优先级可以配置。如果一个节点的优先级较高,它更有可能被选为主节点。
- 心跳机制:MongoDB 会定期发送心跳信号,如果主节点无法响应心跳(例如节点宕机或网络问题),副本集会启动选举过程。
2. 手动指定主节点
虽然 MongoDB 会自动选举主节点,但你可以通过一些设置来影响哪个节点会成为主节点,或者避免某些节点成为主节点。以下是几种方法:
a. 设置优先级
你可以通过设置节点的优先级来影响选举过程中的主节点选择。优先级较高的节点更有可能被选举为主节点。
假设你有两个节点,mongodb_primary
和 mongodb_secondary
,你希望 mongodb_primary
始终作为主节点,你可以为它设置一个较高的优先级,而给 mongodb_secondary
设置一个较低的优先级。
修改优先级:
- 连接到 MongoDB 副本集:
docker exec -it mongodb_primary mongo -u root -p password
- 修改节点优先级:
rs.conf() // 查看当前副本集配置
修改 mongodb_primary
和 mongodb_secondary
的优先级:
cfg = rs.conf()
cfg.members[0].priority = 2 // 将 mongodb_primary 的优先级设置为 2
cfg.members[1].priority = 0 // 将 mongodb_secondary 的优先级设置为 0(禁止选举为主节点)
rs.reconfig(cfg) // 应用修改
此设置将确保 mongodb_primary
更有可能成为主节点,而 mongodb_secondary
将永远不会成为主节点。
b. 禁用选举
如果你想禁用某个节点成为主节点,可以设置 hidden
属性,使该节点无法参与选举。
- 连接到 MongoDB 副本集:
docker exec -it mongodb_primary mongo -u root -p password
- 将外网节点(
mongodb_secondary
)设置为隐藏节点,禁止它参与选举:
cfg = rs.conf()
cfg.members[1].hidden = true // 设置 mongodb_secondary 为隐藏节点
cfg.members[1].priority = 0 // 禁止它成为主节点
rs.reconfig(cfg)
这样,mongodb_secondary
将不会参与主节点选举,即使它是最新的节点,也不会被选举为主节点。
c. 手动选举
如果你希望在某些特定情况下手动控制哪个节点成为主节点,可以使用 rs.stepDown()
或 rs.reconfig()
强制重新进行选举。
rs.stepDown()
:让当前主节点放弃主节点角色,触发选举。rs.reconfig()
:重新配置副本集,可以用来修改节点的优先级等设置。
例如,如果你想手动让 mongodb_secondary
成为主节点,可以在 mongodb_primary
上执行:
rs.stepDown()
这将使 mongodb_secondary
成为新的主节点(前提是它的优先级比其他节点高)。
3. 操作步骤总结
假设你有两个容器:mongodb_primary
和 mongodb_secondary
。
1. 查看当前副本集配置:
docker exec -it mongodb_primary mongo -u root -p password
在 MongoDB shell 中运行:
rs.conf()
2. 设置优先级:
假设你希望 mongodb_primary
一直保持为主节点,可以设置较高的优先级:
cfg = rs.conf()
cfg.members[0].priority = 2 // 设置 mongodb_primary 优先级为 2
cfg.members[1].priority = 0 // 设置 mongodb_secondary 优先级为 0
rs.reconfig(cfg)
3. 强制触发选举:
如果你希望强制重新选举主节点,执行:
rs.stepDown() // 主节点放弃主节点角色,触发选举
4. 监控副本集的状态
你可以使用 rs.status()
命令查看副本集的当前状态,包括哪些节点是主节点,哪些是从节点,以及节点的健康状况。
docker exec -it mongodb_primary mongo -u root -p password
在 MongoDB shell 中运行:
rs.status()
这将输出副本集的状态信息。
这些步骤能让你配置和管理 MongoDB 副本集的主从自动切换,也能手动控制哪个节点作为主节点。希望对你有帮助!如果有更多问题,随时可以问我。