
MongoDB两地三中心集群架构设计、全球多写集群架构设计
发布日期:2025-04-14 14:41:32
浏览次数:8
分类:精选文章
本文共 2788 字,大约阅读时间需要 9 分钟。
高级集群架构设计
两地三中心集群架构设计
容灾级别
RPO(Recovery Point Objective):即数据恢复点目标,主要指的是业务系统所能容忍的数据丢失量。
RTO(Recovery Time Objective):即恢复时间目标,主要指的是所能容忍的业务停止服务的最长时间,也就是从灾难发生到业务系统恢复服务功能所需要的最短时间周期。
两地三中心方案:复制集跨中心部署
双中心双活+异地热备=两地三中心
两地三中心部署的考量点
• 节点数量建议要5个,2+2+1模式 • 主数据中心的两个节点要设置高一点的优先级,减少跨中心换主节点 • 同城双中心之间的网络要保证低延迟和频宽,满足 writeConcern: Majority 的双中心写需求 • 使用 Retryable Writes and Retryable Reads 来保证零下线时间 • 用户需要自行处理好业务层的双中心切换两地三中心复制集搭建
环境准备
• 3台Linux虚拟机,准备MongoDB环境,配置环境变量 • 必须版本一致(重点)整体架构
(图片描述:两地三中心复制集架构图,包含主数据中心和异地热备中心的分布布局)
配置域名解析
• 在3台虚拟机上分别执行以下3条命令,注意替换实际IP地址echo "192.168.65.97 mongo1 mongo01.com mongo02.com" >> /etc/host echo "192.168.65.190 mongo2 mongo03.com mongo04.com" >> /etc/host echo "192.168.65.200 mongo3 mongo05.com " >> /etc/hosts
启动5个 MongoDB 实例
• 在mongo1上执行以下命令:mkdir -p /data/member1/db /data/member1/log /data/member2/db /data/member2/log mongod --dbpath /data/member1/db --replSet demo --bind_ip 0.0.0.0 --port 10001 --fork --logpath /data/member1/log/member1.log• 在mongo2上执行以下命令:
mkdir -p /data/member3/db /data/member3/log /data/member4/db /data/member4/log mongod --dbpath /data/member3/db --replSet demo --bind_ip 0.0.0.0 --port 10001 --fork --logpath /data/member3/log/member3.log• 在mongo3上执行以下命令:
mkdir -p /data/member5/db /data/member5/log mongod --dbpath /data/member5/db --replSet demo --bind_ip 0.0.0.0 --port 10001 --fork --logpath /data/member5/log/member5.log
初始化复制集
• 在mongo1上执行:mongosh mongo01.com:10001 rs.initiate({ "_id" : "demo", "version" : 1, "members" : [ { "id" : 0, "host" : "mongo01.com:10001" }, { "id" : 1, "host" : "mongo02.com:10002" }, { "id" : 2, "host" : "mongo03.com:10001" }, { "id" : 3, "host" : "mongo04.com:10002" }, { "id" : 4, "host" : "mongo05.com:10001" } ] })• 查看复制集状态:
rs.status()
配置选举优先级
• 将mongo1上的2个实例的选举优先级调高为5和10(默认为1),给主数据中心更高的优先级 • 命令执行:mongosh mongo01.com:10001 conf = rs.conf() conf.members[0].priority = 5 conf.members[1].priority = 10 rs.reconfig(conf)
启动持续写脚本(每2秒写一条记录)
• 在mongo3虚拟机上,执行以下 mongo shell 脚本:vim ingest-scriptdb.test.drop() for(var i=1;i<1000;i++){ db.test.insert({ item: i }); inserted = db.test.findOne({ item: i }); if(inserted) print(" Item "+ i +" was inserted " + new Date().getTime()/1000); else print("Unexpected "+ inserted) sleep(2000); }• 使用--retryWrites参数:
mongosh --retryWrites mongodb://mongo01.com:10001,mongo02.com:10002,mongo03.com:10001,mongo04.com:10002,mongo05.com:10001/test?replicaSet=demo ./ingest-script
测试结果
• 测试: 模拟从数据中心故障 • 停止mongo2上所有 mongodb 进程,观察mongo3上的写入未受中断 • 测试:模拟主数据中心故障 • 停止mongo1上所有 mongodb 进程,观察mongo3上的写入未受中断总结
• 搭建简单,使用复制集机制,无需第三方软件 • 使用Retryable Writes以后,即使出现数据中心故障,对前端业务没有任何中断 (Retryable Writes 在4.2以后就是默认设置)发表评论
最新留言
关注你微信了!
[***.104.42.241]2025年05月08日 20时26分48秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Monod生长/降解方程对实验数据的曲线拟合
2025-04-14
MonoGame 示例项目教程
2025-04-14
Monogodb 分组操作
2025-04-14
MonoRail学习笔记九:Rescue的使用
2025-04-14
MVP
2025-04-14
Moodle Local 插件讲解
2025-04-14
Moore's voting algorithm
2025-04-14
MooseFS之数据存储服务器的安装与配置
2025-04-14
mORMot Js对象解析 Json 实例
2025-04-14
MOSFET学习
2025-04-14
MOss213获得用户登录名
2025-04-14
mvn optional
2025-04-14
mount --bind 的妙用
2025-04-14
Mount 使用方法
2025-04-14
mount: none already mounted or /cgroup busy
2025-04-14
mount另一台win机的共享文件夹
2025-04-14
mount命令详解及实例分析
2025-04-14
Mount实现Linux之间数据互相共享
2025-04-14