MongoDB副本集

  • 早期版本使用master-slave,一主一从和Mysql类似,但slave在此架构中为只读,当主库宕机后,从库不能自动切换为主
  • 目前已经淘汰master-slave模式,改为副本集,这种模式下有一个主(primary),和多个从(secondary),只读。支持给它们设置权重,当主宕掉后,权重最高的从切换为主。
  • 在此架构中还可以建立一个仲裁(arbiter)的角色,它只负责裁决,而不存储数据
  • 再此架构中读写数据都是在主上,要想实现负载均衡的目的需要手动指定读库的目标server

MongoDB副本集搭建

  • 三台机器:192.168.221.10(secondary) 192.168.221.20(primary) 192.168.221.30(secondary),都安装mongodb-org
  • 三台机器都要编辑配置文件(去掉用户认证,关闭防火墙、selinux)
    vim /etc/mongod.conf  //加上以下三行
    replication:
    oplogSizeMB: 20
    replSetName: apenglinux
    bindIp: 127.0.0.1,192.168.221.20 //各自加各自的ip
    systemctl restart mongod.service
  • 连接主,在主上配置如下,目的是为了建立副本集
    mongo
    > use admin;
    >  config={_id:"apenglinux",members:[{_id:0,host:"192.168.221.20:27017"},{_id:1,host:"192.168.221.10:27017"},{_id:2,host:"192.168.221.30:27017"}]}
    > rs.initiate(config)
    apenglinux:SECONDARY> rs.status();//关注输出内容中的“"stateStr" : "SECONDARY",”
    apenglinux:PRIMARY>

mongodb副本集测试

  • 在主上建立testdb,再建立集合testCollection并插入数据
    apenglinux:PRIMARY> use testdb;
    apenglinux:PRIMARY> db.testCollection.insert({AccountID:1,UserName:'test',password:'test'});
    apenglinux:PRIMARY> show dbs;
    admin   0.000GB
    config  0.000GB
    local   0.000GB
    test    0.000GB
    testdb  0.000GB
  • 连接到从,查看
mongo
apenglinux:SECONDARY> show dbs;
"errmsg" : "not master and slaveOk=false", //会报这样的错误
         ......以下省略........
apenglinux:SECONDARY> rs.slaveOk();  //注意拼写
apenglinux:SECONDARY> show dbs;
admin   0.000GB
config  0.000GB
local   0.000GB
test    0.000GB
testdb  0.000GB
apenglinux:PRIMARY> use testdb;
apenglinux:PRIMARY> show tables;
testCollection

副本集更改权重模拟主宕机

  • 查看优先级(副本集中中的成员都可以查看,默认都为1)
    apenglinux:SECONDARY> rs.conf();
  • 模拟主宕机(在主的机器上开启防火墙规则)
    iptables -I INPUT -p tcp --dport 27017 -j DROP

    MongoDB副本集

在从上查看,192.168.221.30变为了PRIMARY

mongo --port 27017 --host 192.168.221.30
apenglinux:PRIMARY> rs.status()   //只列出了重要部分
               ............
"_id" : 0,
            "name" : "192.168.221.20:27017",
            "health" : 0,
            "state" : 8,
            "stateStr" : "(not reachable/healthy)",
                  ................
"_id" : 1,
            "name" : "192.168.221.10:27017",
            "health" : 1,
            "state" : 2,
            "stateStr" : "SECONDARY",
            .................
"_id" : 2,
            "name" : "192.168.221.30:27017",
            "health" : 1,
            "state" : 1,
            "stateStr" : "PRIMARY",
            .............

将192.168.221.20这台机器变为正常,正常了也不能成为PRIMARY

更改优先级,使优先级高的成为新的PRIMARY

在主上设置

apenglinux:PRIMARY> cfg = rs.conf()
apenglinux:PRIMARY> cfg.members[0].priority = 3
apenglinux:PRIMARY> cfg.members[1].priority = 2
apenglinux:PRIMARY> cfg.members[2].priority = 1
apenglinux:PRIMARY> rs.reconfig(cfg)

更改之后,可以发现192.168.221.20又变成了PRIMARY