引子
理论
MongoDB 的容灾级别

两地三中心架构图

两地三中心要点
- 节点数量建议要 5 个,2+2+1 模式
- 主数据中心的两个节点要设置高一点的优先级,减少跨中心换主节点
- 同城双中心之间的网络要保证低延迟和带宽,满足 writeConcern: Majority 的双中心写需求
实验架构

实验步骤
1、配置域名解析
# 在 3 台虚拟机上分别执行以下 3 条命令,注意替换实际 IP 地址
echo "192.168.1.1 geekdemo1 member1.example.com member2.example.com" >> /etc/hosts
echo "192.168.1.2 geekdemo2 member3.example.com member4.example.com" >> /etc/hosts
echo "192.168.1.3 geekdemo3 member5.example.com" >> /etc/hosts
2、启动 5 个 MongoDB 实例
mkdir -p member1 member2
mongod --dbpath ~/member1 --replSet demo --bind_ip 0.0.0.0 --port 10001 --fork --logpath member1.log
mongod --dbpath ~/member2 --replSet demo --bind_ip 0.0.0.0 --port 10002 --fork --logpath member2.log
mkdir -p member3 member4
mongod --dbpath ~/member3 --replSet demo --bind_ip 0.0.0.0 --port 10003 --fork --logpath member3.log
mongod --dbpath ~/member4 --replSet demo --bind_ip 0.0.0.0 --port 10004 --fork --logpath member4.log
mkdir -p member5
mongod --dbpath ~/member5 --replSet demo --bind_ip 0.0.0.0 --port 10005 --fork --logpath member5.log
3、初始化副本集
- 在任意一台虚拟机上执行以下命令测试所有实例正常工作
mongo member1.example.com:10001
mongo member2.example.com:10002
mongo member3.example.com:10003
mongo member4.example.com:10004
mongo member5.example.com:10005
mongo member1.example.com:10001
rs.initiate({
"_id" : "demo",
"version" : 1,
"members" : [
{ "_id" : 0, "host" : "member1.example.com:10001" },
{ "_id" : 1, "host" : "member2.example.com:10002" },
{ "_id" : 2, "host" : "member3.example.com:10003" },
{ "_id" : 3, "host" : "member4.example.com:10004" },
{ "_id" : 4, "host" : "member5.example.com:10005" }
]
})
4、配置选举优先级
- 把第一台机器上的2个实例的选举优先级调高为5和10(默认为1)
mongo member1.example.com:10001
cfg = rs.conf()
cfg.members[0].priority = 5
cfg.members[1].priority = 10
rs.reconfig(cfg)
- 通常都有主备数据中心之分,我们希望给主数据中心更高的优先级
5、启动持续写脚本
# 4.2 默认 retryWrites,但加上无妨
mongo --retryWrites mongodb://member1.example.com:10001,member2.example.com:10002,member3.example.com:10003,member4.example.com:10004,member5.example.com:10005/test?replicaSet=demo ingest-script
- ingest-script 内容(每2秒写一条记录)
db.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);
}
6、模拟从数据中心故障
pkill mongod
7、模拟主数据中心故障
pkill mongod
本文出自 qbit snap
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。