
本文共 2840 字,大约阅读时间需要 9 分钟。
MongoDB 复制集(Replication Set)详解
MongoDB 复制集是一种高可用性和数据冗余的架构,适用于保障数据一致性和系统的持续运行。以下将详细介绍复制集的工作原理、配置方法及其实际应用场景。
复制集的核心原理
MongoDB 复制集由一个主节点(Primary)和若干从节点(Secondary)组成。所有写操作都直接写入主节点,而主节点将数据同步至从节点。该机制确保数据在主节点和从节点之间保持一致。
复制集的主要功能包括:
常见的复制集模式
1. PSS 模式
PSS(Primary + Secondary + Secondary)模式是官方推荐的复制集架构。它由一个主节点和两个从节点组成。主要特点是:
- 数据集有两个完整副本。
- 主节点故障时,备用节点会自动成为新主节点。
2. PSA 模式
PSA(Primary + Secondary + Arbiter)模式包括一个主节点、一个从节点和一个仲裁节点。仲裁节点仅用于选举投票,不存储数据。该模式提供一个完整数据副本,主节点故障时会自动切换到备用节点。
复制集的环境搭建
硬件要求
- 硬件配置必须一致,避免因硬件差异导致节点角色不平等。
- 硬件应具备独立性,避免同时发生故障。
软件要求
- 所有节点必须运行相同版本的 MongoDB,确保兼容性。
- 添加节点不会提升系统写性能。
搭建步骤
配置复制集
通过 mongosh
工具使用 rs.initiate()
初始化复制集。复制集成员间通过心跳机制同步状态,主节点通过选举机制确保一致性。
复制集的常用命令
命令 | 描述 |
---|---|
rs.add() | 添加新的复制集成员。 |
rs.addArb() | 添加仲裁节点。 |
rs.conf() | 获取复制集配置信息。 |
rs.freeze() | 防止当前节点成为主节点。 |
rs.initiate() | 初始化新的复制集。 |
rs.printReplicationInfo() | 显示复制集的状态报告。 |
rs.remove() | 移除复制集成员。 |
rs.secondaryOk() | 允许从节点执行读操作。 |
rs.status() | 查看复制集成员状态。 |
rs.stepDown() | 暂停当前主节点角色。 |
安全认证
MongoDB 提供多种权限级别,确保数据安全。常见权限包括:
read
:读取权限。readWrite
:读写权限。dbAdmin
:执行数据库管理操作。dbOwner
:全权限操作。userAdmin
:管理用户权限。clusterAdmin
:管理复制集和分片。readAnyDatabase
和readWriteAnyDatabase
:跨数据库读写权限。
用户管理
通过 db.createUser()
创建用户,指定角色权限。例如:
db.createUser({ user: "hushang", pwd: "123456", roles: [ { role: "clusterAdmin", db: "admin" }, { role: "userAdminAnyDatabase", db: "admin" }, { role: "dbAdminAnyDatabase", db: "admin" }, { role: "readWriteAnyDatabase", db: "admin" } ]})
keyFile 配置
创建 keyFile
使用 openssl
生成 keyFile,确保权限为 600。
openssl rand -base64 756 > /mongodb/mongo.keychmod 600 /mongodb/mongo.key
部署 keyFile 认证
在每个 MongoDB 实例中启用 keyFile 认证,并设置正确的路径。
注意事项
- keyFile 配置后,需重启 MongoDB 服务。
- 确保所有节点的 keyFile 路径配置一致。
复制集成员角色
成员属性
- Priority:影响节点成为主节点的概率,值越高,成为主节点概率越大。
- Vote:决定是否参与选举投票,值为 0 表示不能投票。
成员角色
- Hidden Secondary:对客户端不可见,只参与选举。
- Delayed Secondary:在主节点故障时延迟复制数据。
配置隐藏节点
通过 rs.conf()
设置成员为隐藏节点,确保其不参与业务访问。
cfg = rs.conf()cfg.members[2].priority = 0cfg.members[2].hidden = truers.reconfig(cfg)
查看隐藏节点
使用 db.isMaster()
查看当前节点角色,隐藏节点将不列在结果中。
配置延迟节点
延迟节点用于数据备份或快速回滚场景,需设置 secondaryDelaySecs
。
cfg = rs.conf()cfg.members[2].priority = 0cfg.members[2].hidden = truecfg.members[2].secondaryDelaySecs = 60rs.reconfig(cfg)
添加仲裁节点
确保复制集拥有足够的投票成员,避免因偶数节点导致的故障。
添加命令
mongosh -u hushang -p 123456 --port 28018rs.addArb("ip:30000")
检查仲裁节点
使用 rs.conf()
查看仲裁节点属性,确保其角色为 arbiterOnly
。
移除复制集节点
使用 rs.remove()
移除节点
rs.remove("ip:port")
使用 rs.reconfig()
重配置
cfg = rs.conf()cfg.members.splice(3, 1)rs.reconfig(cfg)
更改复制集成员
修改主节点地址,确保端口配置正确。
cfg = rs.conf()cfg.members[0].host = "new-ip:new-port"rs.reconfig(cfg)
通过以上配置和管理,MongoDB 复制集能够有效保障数据一致性和系统高可用性。
发表评论
最新留言
关于作者
