一、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() //查看节点状态
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()
3.模拟主节点故障
如果主节点出现故障,另一个标准节点将会选举成为新的主节点。
[root@localhost ~]# mongod -f /etc/mongod.conf --shutdown
killing process with pid: 6653
[root@localhost ~]# mongo --port 27018
kgcrs:PRIMARY> rs.status()
4.模拟所有标准节点都出现故障
如果所有标准节点都出现故障,被动节点也不能成为主节点。
[root@localhost ~]# mongod -f /etc/mongod2.conf --shutdown
killing process with pid: 6685
[root@localhost ~]# mongo --port 27019
kgcrs:SECONDARY> rs.status()
二、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
kgcrs:SECONDARY> rs.slaveOk()
kgcrs:SECONDARY> show dbs
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()
kgcrs:PRIMARY> use admin #身份登录验证
kgcrs:PRIMARY> db.auth("root","123")