192.168.56.11                 192.168.56.12   192.168.56.13  三台机器                                                                                                                                                                                     1.##基础配置

mongodb-linux-x86_64-3.4.10.tgztar xf mongodb-linux-x86_64-3.4.10.tgzmv   mongodb-linux-x86_64-3.4.10  /root/mongodbcd /root/mongodbmkdir data  logs

2.###mongo配置文件

[root@k8s-node1 ~]# cat /root/mongodb/mongo.conf logpath=/root/mongodb/logs/mongo.loglogappend=trueport=27018fork=truedbpath=/root/mongodb/data/replSet=replSetkeyFile=/root/mongodb/keyfile

3.####keyfile生成

openssl rand -base64 90 -out ./keyfilechmod  600  keyfilemv  keyfile  /root/mongodb/

scp  -r  /root/mongodb  192.168.56.12:/root/scp  -r  /root/mongodb  192.168.56.13:/root/

4.启动mongodb 所有节点都启动

mongod -f mongodb/mongo.conf

5.初始化副本集以及添加管理员(在一台节点上面 我这是192.168.56.11)

mongo --port 27018config = {_id: 'replSet', members: [{_id: 0, host: '192.168.56.11:27018'},{_id: 1, host: '192.168.56.12:27018'},{_id: 2, host:'192.168.56.13:27018'}]}rs.initiate(config)rs.status()use admindb.createUser({user:"admin",pwd:"123456",roles:[{role:"userAdminAnyDatabase",db:"admin"}]})

6.添加管理员可以操作复制集的权限(在primary节点上面)

use admindb.auth("admin","123456")db.grantRolesToUser( "admin" , [ { role: "dbOwner", db: "admin" },{ "role": "clusterAdmin", "db": "admin" },{ "role": "userAdminAnyDatabase", "db": "admin" },{ "role": "dbAdminAnyDatabase", "db": "admin" }])

7.测试 primary节点(通过rs.status可以看到)

use dbnamedb.createUser({ user: "test",pwd: "123456",roles:[{"role":"readWrite","db":"dbname"},{"role":"dbAdmin","db":"dbname"},{"role":"dbOwner","db":"dbname"},{"role":"read","db":"dbname"}]})db.inventory.insert( { _id: 10, type: "misc", item: "card", qty: 15 } )

primary宕机  从节点选取一个作为primary节点,而且可以写入,如果主节点恢复,将以从节点的方式加进去,不会从新选举,如果三个mongodb宕机2个,那么最后一个将直接变为只读库

#模拟primary宕机

[root@k8s-node1 logs]# mongo  --port 27018MongoDB shell version v3.4.10connecting to: mongodb://127.0.0.1:27018/MongoDB server version: 3.4.10replSet:PRIMARY> quit()[root@k8s-node1 logs]# ps  -ef|grep mongoroot       2331      1  1 Nov17 ?        00:05:00 mongod -f mongodb/mongo.confroot       5441   1101  0 01:55 pts/0    00:00:00 grep --color=auto mongo[root@k8s-node1 logs]# kill  -2  2331[root@k8s-node1 logs]# ps  -ef|grep mongoroot       5444   1101  0 01:55 pts/0    00:00:00 grep --color=auto mongo[root@k8s-node1 logs]#

QQ截图20181117175628.jpg

主节192.168.56.11点宕机 然后192.168.56.13 成为主节点,而且192.168.56.13可以写入

2.jpg

#############模拟启动192.168.56.11 原来的primary,可以看出以secondary方式加入集群

3.jpg

#######手动把primary降级为secondary

rs.stepDown(10)   10s后把primary降级为secondary,其余2个mongodb有一个会成为primary

4.jpg

写入primary 然后生成oplog

异步复制

 use local

 show tables

oplog:

 db.oplog.rs.stats()

 db.oplog.rs.find().sort({$natural:-1}).limit(1).pretty()

 

 capped collection是MongoDB中一种提供高性能插入、读取和删除操作的固定大小集合,当集合被填满的时候,新的插入的文档会覆盖老的文档。

所以,oplog表使用capped collection是合理的,因为不可能无限制的增长oplog。MongoDB在初始化副本集的时候都会有一个默认的oplog大小:

在64位的Linux,Solaris,FreeBSD以及Windows系统上,MongoDB会分配磁盘剩余空间的5%作为oplog的大小,如果这部分小于1GB则分配1GB的空间

在64的OS X系统上会分配183MB

在32位的系统上则只分配48MB

生产大规模场景建议调整oplog的大小 大一点没关系 50G 40G