MongoDB 副本集介绍:

(1) 早期 MongoDB 使用一主一从这种架构,从库为只读状态,当主库宕机后,从库不能自动切换为主,因此被淘汰,改为副本集
(2) 副本集说白了也是主从架构,一主多从,从库为只读状态,但支持给它们设置权重,当主宕掉后,权重最高的从切换为主
(3) 在副本集中还可以设置一个仲裁(Arbiter)角色,它只负责当主节点挂掉之后,哪个备备用节点提升为主节点,而不存储数据
(4) MongoDB 副本集复制过程:主节点应用业务操作修改到数据库中,然后记录这些操作到 oplog(operations log) 中,从节点复制这些 oplog,然后应用这些修改

MongoDB 副本集搭建:

(1) 准备三台机器,192.168.119.141(primary)、192.168.119.147(secondary)、192.168.119.148(secondary)
(2) 三台机器都安装 MongoDB,一台做主节点,另外两台做备节点,三台机器都关闭防火墙和SELinux,三台机器都开启副本集配置

[root@localhost ~]# iptables -F
[root@localhost ~]# setenforce 0
[root@localhost ~]# cat /etc/mongod.conf    // 修改如下配置

net:
  port: 27017
  bindIp: 192.168.119.141    // 这里设置为本机IP,不要设置成127.0.0.1

replication:
  oplogSizeMB: 20       // 指定 operations log 的大小,如果超过这个大小,新操作的日志会自动替换旧的操作日志
  replSetName: mongo    // 指定副本集的名称
[root@localhost ~]# systemctl restart mongod


创建副本集:

[root@localhost ~]# mongo --host 192.168.119.141 --port 27017    // 在哪一台主机上配置,哪一台就会成为主库
> use admin    // 定义副本集配置,_id 用于指定副本集名称,members 用于指定副本集成员
> config={_id: "mongo", members: [{_id: 0, host: "192.168.119.141:27017"}, {_id: 1, host: "192.168.119.147:27017"}, {_id: 2, host: "192.168.119.148:27017"}]}
> rs.initiate(config)    // 初始化副本集
> rs.status()            // 查看副本集状态
mongo:PRIMARY>           // 隔一会按回车会自动变成这种标识符,表示名称为 mongo 的副本集的主节点


测试副本集:

① 先在主节点创建一个数据库
[root@localhost ~]# mongo --host 192.168.119.141 --port 27017mongo:PRIMARY> use mydb
mongo:PRIMARY> db.info.insert({'id': 1, 'name': 'Tom', 'age': 20})

② 在备节点查看是否同步了这条数据
[root@localhost ~]# mongo --host 192.168.119.147 --port 27017
mongo:SECONDARY> rs.slaveOk()   //表示允许在备节点上进行查询操作
mongo:SECONDARY> show dbs       //查看是否创建了数据库
admin 0.000GB
local 0.000GB
mydb 0.000GB


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

默认三台机器权重都为1,如果任何一个权重设置为比其他的高,则该台机器马上切换为 primary 角色

[root@localhost ~]# mongo --host 192.168.119.141 --port 27017
mongo:PRIMARY> config = rs.conf()                // 获取副本集配置信息
mongo:PRIMARY> config.members[0].priority = 1    // 设置第一个成员的权重为1
mongo:PRIMARY> config.members[1].priority = 2    // 设置第二个成员的权重为2
mongo:PRIMARY> config.members[2].priority = 1    // 设置第三个成员的权重为1
mongo:PRIMARY> rs.reconfig(config)               // 重新配置副本集
mongo:SECONDARY>                                 // 隔一会按回车就会自动变成备节点