公众号:六块前端狗
转载请保持完整性,注明来源 猫大叔技术博客
当主图书馆突发火灾,分馆如何瞬间接管服务?这背后是MongoDB副本集的精妙设计
开篇:一场突发危机
周日早上9点,某市图书馆突发火灾警报!
主馆被迫关闭,但读者们惊讶地发现:
- 借书服务几乎没有中断
- 所有借阅记录完整无缺
- 甚至能查到火灾前5分钟的借书信息
这一切的奥秘,就在于图书馆的 \”副本集\”架构——一个主馆 + 两个备用分馆的协同系统。
核心比喻:三馆协同的智慧
️ 主图书馆(Primary) – 核心服务节点
- 处理所有借书、还书 (读、写操作)
- 数据实时同步到各个分馆
- 就像MongoDB的Primary节点
东区分馆(Secondary) – 热备节点
- 完整备份所有书籍和数据
- 可提供读书服务(读操作)
- 主馆故障时可竞选成为新主馆
西区分馆(Secondary) – 同样完整的备份节点
- 同样完整备份所有书籍和数据
- 可提供读书服务(读操作)
- 主馆故障时可参与选举和接管
应急中心(Arbiter)
- 无存储书籍和日志数据
- 只具有投票选举作用
重新理解:什么是真正的「副本」
在MongoDB副本集中,每个数据节点都必须是完整的副本:
// 正确的副本集配置:所有数据节点都有完整数据
{
_id: \"libraryCluster\",
members: [
{_id: 0, host: \"main-library:27017\"}, // 主节点 - 完整数据
{_id: 1, host: \"east-branch:27017\"}, // 从节点 - 完整数据副本
{_id: 2, host: \"west-branch:27017\"} // 从节点 - 完整数据副本
]
}
特殊节点类型
1. Hidden节点(内部档案分馆)
{
_id: 2,
host: \"west-branch:27019\",
hidden: true, // 隐藏节点:不服务读请求
priority: 0, // 不参与选举
// 但仍然存储完整数据副本!
}
特点:有完整数据,但对应用不可见,专用于备份或报表。
2. Delayed节点(时光胶囊分馆)
{
_id: 2,
host: \"west-branch:27019\",
slaveDelay: 3600, // 数据延迟1小时
priority: 0, // 不参与选举
// 存储完整数据,但有延迟!
}
特点:数据同步有意识延迟,用于误操作恢复。
3. Arbiter节点(应急中心)
{
_id: 2,
host: \"arbiter-server:27017\",
arbiterOnly: true // 只投票,不存储数据!
}
特点:这是唯一不存储数据的节点类型,只负责选举投票。
服务中心可以是独立的场馆,也可以在分馆里,当主馆+分馆的数量为偶数时,建议增加服务中心节点用于投票。
因为在偶数进行投票时,容易出现1:1, 2:2 这种平手的局面,导致无法确定谁是主馆,此时增加应急中心来投票,方可打破尴尬局面!
数据同步机制:图书变更日志的正确理解
oplog(操作日志) 就像是图书馆的变更登记簿:
- 主图书馆的每项操作都记录在登记簿上
- 各个分馆抄写这些变更记录
- 但分馆不仅抄记录,还要实际执行这些变更(上架新书、下架旧书等)
// oplog示例:记录但不存储数据
{
ts: Timestamp(1627891234, 1), // 操作时间戳
op: \"i\", // 操作类型:i=插入
ns: \"library.books\", // 集合名
o: {
_id: ObjectId(\"...\"),
title: \"三体\",
status: \"在架\" // 实际书籍数据
}
}
关键区别:
- 错误理解:分馆只保存登记簿(oplog)
- 正确理解:分馆根据登记簿更新自己的实际藏书(完整数据)
副本集节点的完整分类
| 节点类型 | 数据存储 | 读服务 | 写服务 | 选举权 | 适用场景 |
|---|---|---|---|---|---|
| Primary | 完整数据 | 主服务节点 | |||
| Secondary | 完整数据 | 热备节点 | |||
| Hidden | 完整数据 | 可配置 | 专用备份 | ||
| Delayed | 完整数据 | 可配置 | 通常无 | 数据恢复 | |
| Arbiter | 无数据 | 纯投票 |
总结:副本集的正确理解
核心原则:在MongoDB副本集中,除了Arbiter外,所有节点都存储完整数据副本。
设计启示:
- 副本集的核心价值是数据冗余,每个节点都是完整备份
- Arbiter是特例,用于解决投票问题而非数据存储
- 根据业务需求选择合适的节点类型和配置
