一、MongoDB复制集的选举原理

复制是基于操作日志oplog,相当于MySQL中的二进制日志,只记录发生改变的记录。复制是将主节点的oplog日志同步应用到其他从节点的过程。

复制集的节点是通过选举产生的。节点类型分为标准节点、被动节点和仲裁节点。

(1)只有标准节点可能被选举为活跃节点,有选举权。被动节点有完整副本,不可能成为活跃节点,有选举权。仲裁节点不复制数据,不可能成为活跃节点,只有选举权。

(2)priority值高者是标准节点,低者则为被动节点。

1.配置复制集的优先级

配置4个节点的复制集,设置两个标准节点,一个被动节点和一个仲裁节点。

> cfg={"_id":"kgcrs","members":[{"_id":0,"host":"192.168.113.177:27017","priority":100},{"_id":1,"host":"192.168.113.177:27018","priority":100},{"_id":2,"host":"192.168.113.177:27019","priority":0},{"_id":3,"host":"192.168.113.177:27020","arbiterOnly":true}]}
> rs.initiate(cfg)  //启动复制集

kgcrs:PRIMARY> rs.isMaster()   //查看节点状态

MongoDB复制选举原理及复制集管理_第1张图片

2.在主节点上对数据进行操作,查询oplog日志

kgcrs:PRIMARY> use kgc

kgcrs:PRIMARY> db.t1.insert({"id":1,"name":"tom"})

kgcrs:PRIMARY> db.t1.insert({"id":2,"name":"jerry"})

kgcrs:PRIMARY> db.t1.find()

kgcrs:PRIMARY> db.t1.update({"id":2},{$set:{"name":"jack"}})

kgcrs:PRIMARY> db.t1.remove({"id":1})

在MongoDB的local数据库中可以查看oplog日志。


kgcrs:PRIMARY> use local

kgcrs:PRIMARY> show collections

    oplog.rs    //显示

kgcrs:PRIMARY> db.oplog.rs.find()

MongoDB复制选举原理及复制集管理_第2张图片

3.模拟主节点故障

如果主节点出现故障,另一个标准节点将会选举成为新的主节点。

[root@localhost ~]# mongod -f /etc/mongod.conf --shutdown
killing process with pid: 6653
[root@localhost ~]# mongo --port 27018
kgcrs:PRIMARY> rs.status()

MongoDB复制选举原理及复制集管理_第3张图片

4.模拟所有标准节点都出现故障

如果所有标准节点都出现故障,被动节点也不能成为主节点。

[root@localhost ~]# mongod -f /etc/mongod2.conf --shutdown
killing process with pid: 6685
[root@localhost ~]# mongo --port 27019
kgcrs:SECONDARY> rs.status()

MongoDB复制选举原理及复制集管理_第4张图片

二、MongoDB复制集管理

复制集管理包括配置从节点可以读取数据、查看复制集状态信息、更改oplog大小、配置带认证的复制集。

1.配置允许在从节点读取数据。

默认MongoDB复制集的从节点不能读取数据,可以使用rs.slaveOk()命令允许能够在从节点读取数据。

重新启动两个标准节点,连接到复制集的其中一个从节点,配置其允许读取数据。

mongod -f /etc/mongod.conf 
mongod -f /etc/mongod2.conf 
[root@localhost ~]# mongo --port 27018
kgcrs:SECONDARY> show dbs

MongoDB复制选举原理及复制集管理_第5张图片

kgcrs:SECONDARY> rs.slaveOk()
kgcrs:SECONDARY> show dbs

MongoDB复制选举原理及复制集管理_第6张图片

2.查看复制状态信息

可以使用rs.printReplicationInfo()和rs.printSlaveReplicationInfo()命令来查看复制集状态。

kgcrs:SECONDARY> rs.help()
kgcrs:SECONDARY>  rs.printReplicationInfo()
configured oplog size:   990MB
log length start to end: 2974secs (0.83hrs)
oplog first event time:  Tue Jul 17 2018 14:36:27 GMT+0800 (CST)
oplog last event time:   Tue Jul 17 2018 15:26:01 GMT+0800 (CST)
now:                     Tue Jul 17 2018 15:26:02 GMT+0800 (CST)
kgcrs:SECONDARY> rs.printSlaveReplicationInfo()
source: 192.168.113.177:27018
    syncedTo: Tue Jul 17 2018 15:26:11 GMT+0800 (CST)
    -10 secs (0 hrs) behind the primary 
source: 192.168.113.177:27019
    syncedTo: Tue Jul 17 2018 15:26:01 GMT+0800 (CST)
    0 secs (0 hrs) behind the primary 
kgcrs:SECONDARY> 

3.更改oplog大小

以修改从节点27018的oplog大小为例。

(1)先退出复制集,以单实例启动

kgcrs:SECONDARY> use admin
kgcrs:SECONDARY> db.shutdownServer()

在配置文件注销replication:相关启动参数,并修改port端口号27028

vim /etc/mongod2.conf
    # replication:       
    # replSetName: kgcrs
    port: 27028:

以单实例启动27028节点

[root@localhost ~]# mongod -f /etc/mongod2.conf
about to fork child process, waiting until server is ready for connections.
forked process: 9954
child process started successfully, parent exiting

(2)创建新的oplog记录,配置其大小

全备当前节点的所有oplog记录

[root@localhost ~]# mongodump --port 27028 --db local --collection 'oplog.rs'
2018-07-17T15:54:20.600+0800    writing local.oplog.rs to 
2018-07-17T15:54:20.604+0800    done dumping local.oplog.rs (364 documents)

进入实例27028,创建新的oplog集合。

[root@localhost ~]# mongo --port 27028
> use local
> db.oplog.rs.drop()
> db.runCommand( { create: "oplog.rs", capped: true, size: (2 * 1024 * 1024 * 1024) } )

重新把单实例27028加入复制集,修改配置文件

> use admin   
> db.shutdownServer()  //关掉服务

vim /etc/mongod2.conf

  port: 27018  //端口号重新改回27018
replication:
    replSetName: kgcrs
    oplogSizeMB: 2048  //oplog的大小2048M

重新启动27018实例,并进入实例

[root@localhost ~]# mongod -f /etc/mongod2.conf
about to fork child process, waiting until server is ready for connections.
forked process: 10295
child process started successfully, parent exiting
[root@localhost ~]# mongo --port 27018
kgcrs:SECONDARY> 

要使实例27018变成主节点,需要将主节点27017退出选举。

[root@localhost ~]# mongo
kgcrs:PRIMARY> rs.stepDown() //有效产生选举
kgcrs:SECONDARY> 
[root@localhost ~]# mongo --port 27018
kgcrs:PRIMARY> 

4.部署认证的复制

(1)在主节点创建用户认证

kgcrs:PRIMARY> use admin
kgcrs:PRIMARY> db.createUser({"user":"root","pwd":"123","roles":["root"]})

(2)编辑4个配置文件去设置密钥文件

vim /etc/mongod.conf

security:
   keyFile: /usr/bin/kgcrskey1
   clusterAuthMode: keyFile
vim /etc/mongod2.conf
vim /etc/mongod3.conf
vim /etc/mongod4.conf

(3)生成4个实例的密钥文件,并设置权限

[root@localhost ~]# cd /usr/bin/

[root@localhost bin]# echo "kgcrs key"> kgcrskey1
[root@localhost bin]# echo "kgcrs key"> kgcrskey2
[root@localhost bin]# echo "kgcrs key"> kgcrskey3
[root@localhost bin]# echo "kgcrs key"> kgcrskey4
[root@localhost bin]# chmod 600 kgcrskey{1..4}

(4)依次重启4个实例

mongod -f /etc/mongod.conf --shutdown
mongod -f /etc/mongod.conf 

mongod -f /etc/mongod2.conf --shutdown
mongod -f /etc/mongod2.conf 

mongod -f /etc/mongod3.conf --shutdown
mongod -f /etc/mongod3.conf 

mongod -f /etc/mongod4.conf --shutdown
mongod -f /etc/mongod4.conf 

(5)进入主节点查看数据库和复制集

kgcrs:PRIMARY> show dbs   
kgcrs:PRIMARY> rs.status()

没有进行身份登录验证,直接查看,结果如下:
MongoDB复制选举原理及复制集管理_第7张图片

kgcrs:PRIMARY> use admin    #身份登录验证
kgcrs:PRIMARY> db.auth("root","123")

进行身份登录后,查看,结果如下:
MongoDB复制选举原理及复制集管理_第8张图片