MongoDB 两地三中心(qbit)

引子

理论

MongoDB 的容灾级别

MongoDB 两地三中心(qbit)_第1张图片

两地三中心架构图

MongoDB 两地三中心(qbit)_第2张图片

两地三中心要点

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

实验架构

MongoDB 两地三中心(qbit)_第3张图片

实验步骤

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 实例

  • 在虚拟机1上执行以下命令
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
  • 在虚拟机2上执行以下命令
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
  • 在虚拟机3上执行以下命令
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、模拟从数据中心故障

  • 停止第 2 台虚拟机上所有 mongodb 进程
pkill mongod
  • 观察第3台虚拟机上的写入未受中断

7、模拟主数据中心故障

  • 停止第 1 台虚拟机上所有 mongodb 进程
pkill mongod
  • 观察第3台虚拟机上的写入未受中断
本文出自 qbit snap

你可能感兴趣的:(mongodb)