如何轻松配置MongoDB Ubuntu副本集,实现数据高可用性?
- 内容介绍
- 文章标签
- 相关推荐
想象一下当你正忙着写代码,服务器突然停了下来所有用户的请求被迫等待。那种无奈和焦虑,谁都不想经历。MongoDB 的副本集正是为了让数据拥有“平安感”,无论单点故障如何,都能保持业务持续可用。
太刺激了。 本文将带你踏上一段从零到一的旅程——在 Ubuntu 系统上轻松搭建一个三节点副本集,让你的数据库像铁板铸就的钢铁般坚不可摧。
这家伙... 1️⃣ 确保系统更新sudo apt update && sudo apt upgrade -y给自己的机器一次完整的升级,避免后续因依赖不匹配而出现奇怪错误。
2️⃣ 创建独立的 Ubuntu 主机或 VM至少需要三台主机, IP 地址最好在同一子网内,方便相互访问。
本质上... 3️⃣ 开放必要端口MongoDB 默认使用 27017,需要在每台机器的防火墙里开放。sudo ufw allow 27017/tcp
sudo apt install -y mongodb-orgsudo systemctl enable mongod --now- 确认服务已启动:
systectl status mongod | grep Active
- /etc/mongod.conf
- 关键字段:
- net.bindIp: 设为对应机器 IP,以防外部误入。
- replication.replSetName: 统一设置为 rs0;名字随意,但要一致。
- wiredTiger.engineConfig.cacheSizeGB: 根据内存大小调节缓存;默认即可。
- # 日志路径:
/var/log/mongodb/mongod-N.log - # 数据路径:
/var/lib/mongodb/N/data.db
示例片段:
yaml
storage:
dbPath: /var/lib/mongodb/01/data.db
systemLog:
destination: file
path: /var/log/mongodb/mongod-01.log
net:
port: 27017
bindIp: 192.168.1.101
replication:
replSetName: rs0
节点2、 3 同理,只需改 IP 与路径即可。
温馨提示:若你使用的是云服务器,请确认平安组也已开放相应端口。
地道。 常见坑点:Mongod 启动报错 “no such file or directory”, 往往是主要原因是目录权限或缺失导致,请检查 /var/lib/mongodb/01 是否存在且可写。
小技巧:MongoDB 自带的 可以直接连接任意节点来施行命令,无需额外客户端,我明白了。。
步骤一:把每个实例都跑起来并验证连通性
- "node1" 用以下命令启动:
$ sudo systemctl restart && sudo systemctl status | grep Active
- "node2", "node3" 同理,用各自的 service 名称重启并检查状态。
- "node1" 用 mongo shell 连上自己:
$ mongo --host localhost --port 27017
若看到 “MongoDB shell version …”, 恭喜,你已经能正常连通自己的实例。步骤二:初始化副本集——这一步决定未来是否能无缝切换
- "node1" 在 mongo shell 输入:
$ rs.initiate
此时你会看到一个 JSON 对象返回,其中包含各成员状态。初始时 node1 会被选为 PRIMARY,其余为 SECONDARY。如果出现 “not master and slaveOk=false”, 请先停止所有节点,再重新施行上述命令。别怕,一步步来!
步骤三:验证副本集运行状态
- "node1":
$ rs.status // 查看详细状态信息 $rs.printReplicationInfo // 查看延迟信息 $rs.printSecondaryStatus // 检查次级节点是否同步完毕 $ use admin ; $ db.serverStatus.replset // 获取更细粒度指标
如果所有成员均显示 stateStr 为 PRIMARY 或 SECONDARY,那么你的副本集已完全上线! 🎉 记得留意 health 字段是否全为 true;否则说明某些节点网络或磁盘有问题。步骤四:让主从自动切换——测试一下容错能力吧!
- "node1" 挂掉主节点:
$ sudo systemctl stop ; sleep 5 ; $ mongo --host localhost --port 27017 --eval 'printjson)' // 检查当前 master 状态 // 输出中应该出现 secondary 的 hostname - "node2"/"node3" 自动接管成为新的 Primary —— 别惊讶,这是 MongoDB 的核心优势之一!
一下整个流程,几乎只需要手动操作两次。其余都是由 MongoDB 自动处理,一旦设置完成,你就拥有了真正意义上的高可用数据库。 ### 四、 日常运维与监控建议 * **定期检查** `rs.status` 和 `rs.conf`,确保成员列表未被篡改。 * **开启 oplog 长度监控**,防止日志过大导致空间耗尽。 * **使用监控工具** 如 Promeus + Grafana 或直接 `mongostat` 与 `mongotop` 命令查看实时性能瓶颈。 * **备份策略** 定期施行 `mongodump` 或使用第三方备份方案;注意不要只备份 PRIMARY,主要原因是它可能因故障失效。 ### 五、 常见错误排查速查表 | 错误 | 常见原因 | 快速解决 | |---|---|---| | 无法连接到远程主机 | 防火墙未开放、bindIp 未设置正确 | 检查 UFW 与 net.bindIp | | replSetInitiate 报错 “already initialized” | 已经存在 replica set 配置 | 删除 /etc/mongod.conf 中 replication 部分后重启 | | 节点无法加入 Replica Set | 主机时间不同步导致证书/身份校验失败 | 使用 NTP 同步时间 | | 数据同步慢甚至卡住 | 网络抖动或磁盘 IO 限制 | 调整 oplog 大小或升级硬件 | ### 六、再说说一句话 搭建完毕后你会发现那条看似繁复的配置流程,其实只是给数据提供了一条隐形护盾。每当系统崩溃时它们就像背靠背的人群默默站立,让业务继续流转。愿你的 MongoDB 副本集像守夜人一样执勤,让每一次请求都安心归位,不再担心突发故障。祝你玩得开心,也祝数据永不掉线!
- "node1" 挂掉主节点:
- "node1":
- "node1" 在 mongo shell 输入:
想象一下当你正忙着写代码,服务器突然停了下来所有用户的请求被迫等待。那种无奈和焦虑,谁都不想经历。MongoDB 的副本集正是为了让数据拥有“平安感”,无论单点故障如何,都能保持业务持续可用。
太刺激了。 本文将带你踏上一段从零到一的旅程——在 Ubuntu 系统上轻松搭建一个三节点副本集,让你的数据库像铁板铸就的钢铁般坚不可摧。
这家伙... 1️⃣ 确保系统更新sudo apt update && sudo apt upgrade -y给自己的机器一次完整的升级,避免后续因依赖不匹配而出现奇怪错误。
2️⃣ 创建独立的 Ubuntu 主机或 VM至少需要三台主机, IP 地址最好在同一子网内,方便相互访问。
本质上... 3️⃣ 开放必要端口MongoDB 默认使用 27017,需要在每台机器的防火墙里开放。sudo ufw allow 27017/tcp
sudo apt install -y mongodb-orgsudo systemctl enable mongod --now- 确认服务已启动:
systectl status mongod | grep Active
- /etc/mongod.conf
- 关键字段:
- net.bindIp: 设为对应机器 IP,以防外部误入。
- replication.replSetName: 统一设置为 rs0;名字随意,但要一致。
- wiredTiger.engineConfig.cacheSizeGB: 根据内存大小调节缓存;默认即可。
- # 日志路径:
/var/log/mongodb/mongod-N.log - # 数据路径:
/var/lib/mongodb/N/data.db
示例片段:
yaml
storage:
dbPath: /var/lib/mongodb/01/data.db
systemLog:
destination: file
path: /var/log/mongodb/mongod-01.log
net:
port: 27017
bindIp: 192.168.1.101
replication:
replSetName: rs0
节点2、 3 同理,只需改 IP 与路径即可。
温馨提示:若你使用的是云服务器,请确认平安组也已开放相应端口。
地道。 常见坑点:Mongod 启动报错 “no such file or directory”, 往往是主要原因是目录权限或缺失导致,请检查 /var/lib/mongodb/01 是否存在且可写。
小技巧:MongoDB 自带的 可以直接连接任意节点来施行命令,无需额外客户端,我明白了。。
步骤一:把每个实例都跑起来并验证连通性
- "node1" 用以下命令启动:
$ sudo systemctl restart && sudo systemctl status | grep Active
- "node2", "node3" 同理,用各自的 service 名称重启并检查状态。
- "node1" 用 mongo shell 连上自己:
$ mongo --host localhost --port 27017
若看到 “MongoDB shell version …”, 恭喜,你已经能正常连通自己的实例。步骤二:初始化副本集——这一步决定未来是否能无缝切换
- "node1" 在 mongo shell 输入:
$ rs.initiate
此时你会看到一个 JSON 对象返回,其中包含各成员状态。初始时 node1 会被选为 PRIMARY,其余为 SECONDARY。如果出现 “not master and slaveOk=false”, 请先停止所有节点,再重新施行上述命令。别怕,一步步来!
步骤三:验证副本集运行状态
- "node1":
$ rs.status // 查看详细状态信息 $rs.printReplicationInfo // 查看延迟信息 $rs.printSecondaryStatus // 检查次级节点是否同步完毕 $ use admin ; $ db.serverStatus.replset // 获取更细粒度指标
如果所有成员均显示 stateStr 为 PRIMARY 或 SECONDARY,那么你的副本集已完全上线! 🎉 记得留意 health 字段是否全为 true;否则说明某些节点网络或磁盘有问题。步骤四:让主从自动切换——测试一下容错能力吧!
- "node1" 挂掉主节点:
$ sudo systemctl stop ; sleep 5 ; $ mongo --host localhost --port 27017 --eval 'printjson)' // 检查当前 master 状态 // 输出中应该出现 secondary 的 hostname - "node2"/"node3" 自动接管成为新的 Primary —— 别惊讶,这是 MongoDB 的核心优势之一!
一下整个流程,几乎只需要手动操作两次。其余都是由 MongoDB 自动处理,一旦设置完成,你就拥有了真正意义上的高可用数据库。 ### 四、 日常运维与监控建议 * **定期检查** `rs.status` 和 `rs.conf`,确保成员列表未被篡改。 * **开启 oplog 长度监控**,防止日志过大导致空间耗尽。 * **使用监控工具** 如 Promeus + Grafana 或直接 `mongostat` 与 `mongotop` 命令查看实时性能瓶颈。 * **备份策略** 定期施行 `mongodump` 或使用第三方备份方案;注意不要只备份 PRIMARY,主要原因是它可能因故障失效。 ### 五、 常见错误排查速查表 | 错误 | 常见原因 | 快速解决 | |---|---|---| | 无法连接到远程主机 | 防火墙未开放、bindIp 未设置正确 | 检查 UFW 与 net.bindIp | | replSetInitiate 报错 “already initialized” | 已经存在 replica set 配置 | 删除 /etc/mongod.conf 中 replication 部分后重启 | | 节点无法加入 Replica Set | 主机时间不同步导致证书/身份校验失败 | 使用 NTP 同步时间 | | 数据同步慢甚至卡住 | 网络抖动或磁盘 IO 限制 | 调整 oplog 大小或升级硬件 | ### 六、再说说一句话 搭建完毕后你会发现那条看似繁复的配置流程,其实只是给数据提供了一条隐形护盾。每当系统崩溃时它们就像背靠背的人群默默站立,让业务继续流转。愿你的 MongoDB 副本集像守夜人一样执勤,让每一次请求都安心归位,不再担心突发故障。祝你玩得开心,也祝数据永不掉线!
- "node1" 挂掉主节点:
- "node1":
- "node1" 在 mongo shell 输入:

