图解 MongoDB 18|复制集拓扑:Primary、Secondary 和 Arbiter 的分工

作者:十三Tech日期:2026/6/28

存储引擎阶段回答了「数据怎么存、怎么不丢」,但留下一个致命问题:单机宕机了怎么办。一台 mongod 进程挂掉,不管是硬件故障、进程崩溃还是网络隔离,所有读写都会中断。这在生产环境是不可接受的。

MongoDB 解决单点故障的方式是复制集(Replica Set)——把数据复制到多个节点,一台挂了自动切换到另一台。这一阶段(18–23)就围绕复制集展开,从拓扑结构、复制原理、延迟、选举到读写关注,把 MongoDB 的高可用讲透。

先把机制边界说清楚

复制集是一组维护相同数据集的 mongod 实例。它的核心特征是:

  • 一个 Primary,多个 Secondary。Primary 是唯一接受写入的节点,Secondary 从 Primary 异步复制数据。
  • 自动 failover。Primary 宕机时,Secondary 们会自动选举出一个新 Primary,不需要人工介入。
  • 奇数节点。为了保证选举能形成多数派,复制集通常是奇数节点(3、5、7)。

复制集和简单的「主从复制」(比如 MySQL 的异步主从)有本质区别:主从复制是「数据同步」,主挂了要人工切;复制集是「带选举的高可用集群」,主挂了自动切。MongoDB 没有传统的「主从」概念,生产环境的最小形态就是 3 节点复制集。

三种节点角色

把三种节点画在一起,分工立刻清晰:Primary 管写,Secondary 备份数据和分担读,Arbiter 只为投票。

Primary(主节点)。复制集里唯一接受写入的节点。所有写操作先进 Primary,Primary 把写操作记到 oplog(操作日志),Secondary 拉取 oplog 重放来实现复制。Primary 默认也接受读(readPreference: primary)。Primary 宕机或失联时,会触发选举,从 Secondary 里选出新 Primary。

Secondary(从节点)。Primary 的数据副本,通过异步拉取 oplog 保持数据同步。Secondary 的能力比单纯备份强得多:

  • 可被选为 Primary。当 Primary 故障,符合条件的 Secondary 会参与选举。
  • 可接受读。通过 readPreference 配置,应用可以把读请求分发到 Secondary,分担 Primary 压力。
  • 可定制角色。比如 priority: 0 的 Secondary 永远不会被选为 Primary(适合做纯备份或异地节点);hidden: true 的 Secondary 对应用不可见(适合做报表分析);delayed 的 Secondary 延迟同步(适合防误删,延迟节点保留几小时前的数据)。

Arbiter(仲裁节点)。一个特殊节点,不存数据,只参与投票。它的存在是为了凑齐奇数节点——比如只有两台数据机器时,加一个 Arbiter 凑成 3 节点,保证选举能形成多数派。Arbiter 不能被选为 Primary(它没数据),资源开销极小。但它只是权宜之计,真正的生产复制集应该是 3 个数据节点,而不是 2 数据 + 1 Arbiter(因为 Arbiter 不提供数据冗余)。

为什么必须是奇数节点

复制集的选举依赖多数派(majority)——要超过半数节点同意才能选出 Primary。奇数节点能保证多数派明确:

  • 3 节点:多数派是 2。任何 1 个节点挂了,剩下 2 个仍能形成多数派,继续工作。
  • 5 节点:多数派是 3。可以容忍 2 个节点同时故障。

偶数节点会有「脑裂」风险:4 节点如果分裂成 2+2,两边都拿不到 3 票多数派,无法选举,整个集群不可用。奇数节点避免了这种对称分裂。所以复制集规模总是奇数,哪怕用 Arbiter 凑。

复制集怎么实现高可用

把高可用拆成两个能力:

数据冗余。Primary 的数据被复制到多个 Secondary,任何一个节点故障,数据都不丢(前提是用了 w: "majority")。这是「不丢」的保证。

自动 failover。Primary 故障时,Secondary 检测到(心跳超时),发起选举,选出新 Primary,应用 driver 自动重连到新 Primary。整个过程通常在 10–30 秒完成,期间写不可用(因为只有一个 Primary),读如果配了 Secondary 读则不受影响。这是「不断」的保证。

这两个能力合起来,就是复制集相对单机的核心价值。下一篇会深入 oplog,讲清楚 Secondary 到底是怎么「复制」的。

部署形态的选择

最小生产复制集:3 节点(1 Primary + 2 Secondary)。容忍 1 个节点故障,数据有 2 份冗余。这是绝大多数业务的起点。

两数据节点 + 1 Arbiter。机器有限时用,能容忍 1 个数据节点故障。但数据只有 1 份冗余(Arbiter 不算),不如 3 数据节点安全。只适合「实在没有第三台机器」的场景。

5 节点。容忍 2 个节点同时故障,适合更高可用要求。通常跨机房部署(比如两地三中心,后面专门讲)。

跨可用区部署。把节点分散到不同可用区/机房,避免单机房故障导致整个复制集不可用。这是云上部署的标准做法。

取舍与边界

复制集的代价:

  • 写入有放大。每个写要复制到 Secondary,Secondary 也要写一遍。w: "majority" 还要等多数节点确认,延迟更高。
  • 读 Secondary 可能不一致。Secondary 异步复制,有延迟,读到的数据可能比 Primary 旧(最终一致性)。
  • 选举期间写不可用。Primary 切换的 10–30 秒,写操作会失败或排队。对写敏感的业务要有重试机制。
  • 运维复杂度。3 个节点要分别监控、分别备份,比单机复杂。

版本演进上,MongoDB 持续优化了选举速度(更快的心跳和选举协议)、复制效率(streaming replication)和一致性保证。但「Primary 写 + Secondary 异步复制 + 多数派选举」这套骨架始终稳定。

判断框架

  • 生产环境最小形态是 3 数据节点,不要用单机跑生产。
  • 节点数必须是奇数,凑不齐用 Arbiter,但 Arbiter 不提供数据冗余。
  • Primary 唯一写,Secondary 可分担读(但要接受最终一致性)。
  • 高可用 = 数据冗余(多副本)+ 自动 failover(选举),缺一不可。
  • 跨可用区部署避免单机房故障,是云上标配。
  • 选举期间写不可用,写敏感业务要有重试。

下一篇讲 oplog,看清复制的真正载体。


关于十三Tech

All in AI Agent 方向的架构师,专注 AI 工程实践。

相信 AI 是程序员的最佳搭档,帮助每一位开发者驾驭 AI。

公众号搜索「十三Tech」

本文首发:rubyfun.cn/posts/%E5%9…


图解 MongoDB 18|复制集拓扑:Primary、Secondary 和 Arbiter 的分工》 是转载文章,点击查看原文


相关推荐


百度 C++/PHP 研发一二面:一面扫八股和算法,二面开始逼近 Redis、MySQL 和秒杀设计
TechPioneer_lp2026/6/19

这篇百度 C++/PHP 研发面经很适合作为“后端基础到系统设计过渡”的样本来看。 它的一面还比较像常规校招: 算法 OS 计网 HTTP Redis 静态 / 动态链接 C++ 基础 但二面明显开始往: 智能指针 TCP 窗口和拥塞 Redis 各种底层结构 MySQL 索引、隔离级别、锁 秒杀系统和高并发设计 去推进了。 校招大礼包获取:入口 可能是至今最全,最好,最实用的校招大礼包,减少信息差,预期漫步无敌的刷提,不如有的放矢,针对性的准备,这


从单机到分布式:用 Go + Eino + DeepSeek V4 构建生产级 Code Review Agent
银河技术2026/6/11

从单机到分布式:用 Go + Eino + DeepSeek V4 构建生产级 Code Review Agent 不是把大模型接到 GitHub Webhook 上,就叫生产级 Code Review Agent。真正决定系统上限的,是任务编排、规则前置、上下文治理、并发隔离与可观测性。 引言:为什么团队越来越需要“生产级” Code Review Agent 在小团队里,Code Review 通常是一个“人盯人”的流程:开发者提 PR,Reviewer 看 diff,提几点


Webpack如何实现万物皆可import?loader的使用/配置/手写实践
漂流瓶jz2026/6/4

Webpack是前端历史上具有统治地位的打包工具,应用非常广泛。虽然现在逐渐被性能更强的工具替代,但是依然有很多工程使用。loader是Webpack中的一种重要的外部插入配置工具,负责对源代码进行转换。Webpack本身只能理解JavaScript和JSON文件,其它类型的文件不能处理。正是使用各种loader,Webpack才有了将各种格式的资源和代码识别和引入的能力。当然,loader的能力也并不仅限于此。 loader使用示例 为了了解loader的作用和使用方式,我们举例一些现有的知名


Android 离线优先架构实践:网络只是本地数据库的同步触发器
潜龙勿用之化骨龙2026/5/29

本文基于对 Learn-Kotlin-Coroutines 的工程化重构,记录从「请求式架构」走向「响应式单一数据源(SSOT)」的完整思路与实现方案。 引言:被网络绑架的 UI 过去很多 Android 项目的数据流都是这样的: 请求网络 → 拿到数据 → 更新 UI 这种模式在网络稳定时看起来没有问题。但一旦网络变慢、接口超时、页面频繁切换,问题就会迅速暴露: 页面白屏等待 数据状态不一致 本地缓存形同虚设 根本原因在于:UI 的命运被网络状态决定了。 现代 Android 架构正


ODA运维实战:Oracle 19c YJXT PDB表空间在线扩容全过程_20260503
sysrootsa2026/5/6

一、操作时间 2026 年 5 月 3 日 09:30 二、操作环境 平台:Oracle Database Appliance,ODA 数据库版本:Oracle Database 19c,19.25.0.0.0 主机:teierp1 实例:erpcdb1 CDB:ERPCDB PDB:YJXT 存储:ASM +DATA 操作方式:在线扩容 本次操作为 Oracle 表空间在线扩容,不涉及业务数据修改,不需要停库。 三、登录数据库并进入


AI!一种新的AI项目架构思想与尝试(怎么让AI更有效的开发)
无我Code2026/4/27

前言 在2026的今天,AI极大的提升了项目的开发效率,程序员在当下已经不是考虑AI行不行,而是应该如何积极的拥抱AI,虽然AI不是万能的银弹,但是在2026的今天,AI已经可以帮助我们快速的开发一款小而美的应用,或者解决一些简单的功能开发,提升我们的开发进度,减少我们敲击键盘的次数。那么在AI盛行的当下,我们的项目架构自然需要针对性的向AI方向进行调整,让AI能够更容易的理解项目,提升代码准确率已经是当下最需要解决的问题。 项目架构设计 在近期使用AI的过程中,我使用AI搭建了一个python


《 SwiftUI 进阶第8章:表单与设置界面》
90后晨仔2026/4/18

8.1 Form 组件 核心概念 Form 是 SwiftUI 中用于创建表单界面的专用组件,它提供了: 自动的分组和分隔线 自适应的布局 与系统设置一致的外观 支持多种表单控件 基本使用 import SwiftUI struct ContentView: View { var body: some View { NavigationStack { Form { Section {


OpenClaw(龙虾)最强开源对手!Github 40K Star了,又一个爆火的Agent..
AI袋鼠帝2026/4/10

大家好,我是袋鼠帝。 最近几天,不管是国内的开发者社群,还是国外的X,又有一个开源项目的热度简直高得离谱。 根据开源项目飙升榜的数据,它在一个月内的增长率达到了惊人的百分之1237。 仅仅过了两个月时间,它的标星数量就已经突破了40k大关。 在技术社区里,很多人甚至直接把它称为OpenClaw的第一个真正竞争对手。 这个爆火的开源项目,叫做 Hermes Agent,地址 github.com/NousResearc… 是由 Nous Research 团队倾力打造的开源Agent。 今


在 Debian 上部署 ELK 7.17 完整指南
itmanll2026/4/2

Elasticsearch 7.17 是 7.x 系列的最终维护版本,目前仍有大量生产环境集群运行此版本。本指南将详细介绍如何在 Debian 12/13 上完整部署 ELK 7.17 栈(Elasticsearch、Logstash、Kibana)。 环境要求 Debian 12(bookworm)或 Debian 13(trixie)至少 4GB 内存(默认堆内存占用约 2.4GB)开放端口:9200(Elasticsearch HTTP)、9300(Elasticsearch 传输)


【35天从0开始备战蓝桥杯 -- Day5】
小年糕是糕手2026/3/24

🫧个人主页:小年糕是糕手 💫个人专栏:《C++》《Linux》《数据结构》《C语言》 🎨你不能左右天气,但你可以改变心情;你不能改变过去,但你可以决定未来! 目录 一、输入输出 1.1、单组测试用例 1°计算 (a+b)/c 的值 2°与 7 无关的数 1.2、多组测试用例 情况一 1°多组输入a+b II 2°斐波那契数列 3°制糊串 情况二 1°多组输入a+b 2°数字三角形 3°定位查找 情况三 1°字符统计 拓展函数 2°多组数据

首页编辑器站点地图

本站内容在 CC BY-SA 4.0 协议下发布

Copyright © 2026 聚合阅读