006.MongoDB副本集
一 MongoDB 复制(副本集)
1.1 复制概述
1.2 复制意义
- 保障数据的安全性
- 数据高可用性 (24*7)
- 灾难恢复
- 无需停机维护(如备份,重建索引,压缩)
- 分布式读取数据
1.3 MongoDB复制原理



1.4 MongoDB复制过程
- 检查自己local库的oplog.rs集合找出最近的时间戳。
- 检查Primary节点local库oplog.rs集合,找出大于此时间戳的记录。
- 将找到的记录插入到自己的oplog.rs集合中,并执行这些操作。
1.5 副本集
- N 个节点的集群;
- 任何节点可作为主节点;
- 所有写入操作都在主节点上;
- 自动故障转移;
- 自动恢复。

- 最小构成是:primary,secondary,arbiter,一般部署是:primary,2 secondary。
- 成员数应该为奇数,如果为偶数的情况下添加arbiter,arbiter不保存数据,只投票。
- 最大50 members,但是只能有 7 voting members,其他是non-voting members。
二 前期准备
- NTP同步;
- 关闭SELinux;
- 关闭防火墙或放通相应规则;
- 所有节点安装MongoDB,参考《002.MongoDB社区版安装》;
|
主机名
|
IP
|
类型
|
备注
|
|
mongodb01
|
172.24.8.71
|
primary
|
主节点
|
|
mongodb02
|
172.24.8.72
|
secondary
|
此节点
|
|
mongodb03
|
172.24.8.73
|
secondary
|
此节点
|
|
mongodb04
|
172.24.8.74
|
secondary
|
备节点(测试手动添加)
|
|
arbiter
|
172.24.8.75
|
arbiter
|
冲裁节点
|
1 [root@mongodb01 ~]# vi /etc/hosts
2 172.24.8.71 mongodb01
3 172.24.8.72 mongodb02
4 172.24.8.73 mongodb03
5 172.24.8.74 mongodb04
6 172.24.8.75 arbite
三 副本集正式部署
3.1 开启远程连接及副本集
1 [root@mongodb01 ~]# vi /etc/mongod.conf
2 ……
3 net:
4 port: 27017
5 bindIp: 172.24.8.71 #根据不同节点配置
6 ……
7 replication:
8 replSetName: my_rep #开启副本集,所有节点必须一致
9 ……
10 [root@mongodb01 ~]# systemctl start mongod.service
11 [root@mongodb01 ~]# systemctl enable mongod.service
3.2 配置复制级成员
1 [root@mongodb01 ~]# mongo --host 172.24.8.71
2 > config = { _id: "my_rep", members: [
3 {_id: 0, host: "172.24.8.71:27017"},
4 {_id: 1, host: "172.24.8.72:27017"},
5 {_id: 2, host: "172.24.8.73:27017"}]
6 }
3.3 初始化副本集
1 > rs.initiate(config)
2 my_rep1:PRIMARY> rs.status() #查看集群状态
3.4 创建管理员用户
1 [root@mongodb01 ~]# mongo --host 172.24.8.71
2 my_rep:PRIMARY> use admin #进入admin数据库
3 my_rep:PRIMARY> db.createUser({ user: "admin", pwd: "admin", roles: [{ role: "userAdminAnyDatabase", db: "admin" }] })
4 my_rep:PRIMARY> db.auth("admin", "admin") #验证创建结果
5 1
1 my_rep:PRIMARY> db.getUsers()
2 > db.system.users.find().pretty() #查看全局所有账户

3.5 创建集群用户
1 [root@mongodb01 ~]# mongo --host 172.24.8.71 -u admin -p admin
2 my_rep1:PRIMARY> use admin
3 switched to db admin
4 my_rep1:PRIMARY> db.createUser({user:"clusteradmin",pwd:"clusteradmin",roles:[{role:"clusterAdmin",db:"admin"}]})
3.6 确认验证
1 [root@mongodb01 ~]# mongo --host 172.24.8.72 -u clusteradmin -p clusteradmin
2 my_rep:SECONDARY> rs.status()
3 my_rep:SECONDARY> db.serverStatus().repl.primary #查看主节点
4 172.24.8.73:27017
四 集群开启权限
4.1 配置key
1 [root@mongodb01 ~]# mkdir -p /usr/local/keyfile
2 [root@mongodb01 ~]# openssl rand -base64 100 > /usr/local/keyfile/mongodb_keyfile
3 [root@mongodb01 ~]# chmod 600 /usr/local/keyfile/mongodb_keyfile
4 [root@mongodb01 ~]# chown -R mongod:mongod /usr/local/keyfile/
5 [root@mongodb01 ~]# scp -rp /usr/local/keyfile/ root@mongodb02:/usr/local/
6 [root@mongodb01 ~]# scp -rp /usr/local/keyfile/ root@mongodb03:/usr/local/
7 [root@mongodb01 ~]# scp -rp /usr/local/keyfile/ root@mongodb04:/usr/local/
8 [root@mongodb01 ~]# scp -rp /usr/local/keyfile/ root@arbiter:/usr/local/
9
10 [root@mongodb02 ~]# chown -R mongod:mongod /usr/local/keyfile/
11 [root@mongodb03 ~]# chown -R mongod:mongod /usr/local/keyfile/
12 [root@mongodb04 ~]# chown -R mongod:mongod /usr/local/keyfile/
13 [root@arbiter~]# chown -R mongod:mongod /usr/local/keyfile/
4.2 开启权限
1 [root@mongodb01 ~]# vi /etc/mongod.conf
2 ……
3 security: #取消注释
4 authorization: enabled #开启验证
5 keyFile: /usr/local/keyfile/mongodb_keyfile #key文件
6 ……
7 [root@mongodb01 ~]# systemctl restart mongod.service
4.3 测试登陆
1 [root@mongodb01 ~]# mongo --host 172.24.8.71 -u clusteradmin -p clusteradmin
2 my_rep:PRIMARY> rs.status()
3 my_rep:PRIMARY> db.serverStatus().repl.primary #查看主节点
4 172.24.8.71:27017
五 成员管理
5.1 SECONDARY节点增加
1 [root@mongodb01 ~]# scp -rp /etc/mongod.conf root@mongodb04:/etc/mongod.conf
2 [root@mongodb04 ~]# vi /etc/mongod.conf #修改IP即可
3 net:
4 port: 27017
5 bindIp: 172.24.8.74
6 [root@mongodb04 ~]# systemctl restart mongod.service
7 [root@mongodb04 ~]# systemctl enable mongod.service
8 [root@mongodb01 ~]# mongo --host 172.24.8.71 -u clusteradmin -p clusteradmin
9 my_rep:PRIMARY> rs.add("172.24.8.74:27017")
5.2 节点删除
1 my_rep:PRIMARY> rs.remove("172.24.8.74:27017")
- 不能修改_id;
- 不能将当前执行rs.reconfig命令的成员的优先级设置为 0;
- 不能将仲裁者成员变为非仲裁者成员,反正亦然;
- 不能将buildIndexes由false改为 true。
5.3 Secondary开放临时读
5.4 节点提权
1 my_rep:SECONDARY> db.serverStatus().repl.primary #查看主节点
2 172.24.8.72:27017
3 [root@mongodb02 ~]# mongo --host 172.24.8.72 -u clusteradmin -p clusteradmin
4 my_rep:PRIMARY> rs.status() #查看当前副本集状态

1 my_rep:PRIMARY> rs.conf()

1 my_rep:PRIMARY> newcfg=rs.conf() #当前conf写入变量
2 my_rep:PRIMARY> newcfg.members[0].priority=2 #修改conf中members序号0,即172.24.8.71优先级为2
3 2
4 my_rep:PRIMARY> rs.reconfig(newcfg #重新载入conf
5 [root@mongodb01 ~]# mongo --host 172.24.8.71 -u clusteradmin -p clusteradmin
6 my_rep:PRIMARY> db.serverStatus().repl.primary #再次登录查看primary节点
7 172.24.8.71:27017
5.5 ARBITER节点添加
1 [root@mongodb01 ~]# scp -rp /etc/mongod.conf root@arbiter:/etc/mongod.conf
2 [root@mongodb04 ~]# vi /etc/mongod.conf #修改IP即可
3 net:
4 port: 27017
5 bindIp: 172.24.8.75
6 [root@mongodb04 ~]# systemctl restart mongod.service
7 [root@mongodb04 ~]# systemctl enable mongod.service
8 [root@mongodb01 ~]# mongo --host 172.24.8.71 -u clusteradmin -p clusteradmin
9 my_rep:PRIMARY> rs.addArb("172.24.8.75:27017")
10 my_rep:PRIMARY> rs.status()

1 my_rep:PRIMARY> rs.conf()

5.6 修改成员状态
1 my_rep:PRIMARY> rs.stepDown()
5.7 锁定主节点
1 my_rep:PRIMARY> newconf=rs.config()
2 my_rep:PRIMARY> newconf.members[1].priority=0
3 my_rep:PRIMARY> newconf.members[1].votes=0
4 my_rep:PRIMARY> rs.reconfig(newconf)
5.8 阻止成员选举
1 my_rep:SECONDARY> rs.freeze(3600) #保持1个小时处于备份节点状态。
2 my_rep:SECONDARY> rs.freeze(0) #再次在备份节点执行且将时间指定为0就是“释放”备份节点。
六 副本集管理
6.1 查看复制情况
1 my_rep:PRIMARY> db.printSlaveReplicationInfo()
2 source: 172.24.8.72:27017
3 syncedTo: Tue May 28 2019 19:43:40 GMT+0800 (CST)
4 0 secs (0 hrs) behind the primary
5 source: 172.24.8.73:27017
6 syncedTo: Tue May 28 2019 19:43:40 GMT+0800 (CST)
7 0 secs (0 hrs) behind the primary
6.2 副本集复制链配置

1 [root@mongodb03 ~]# mongo --host 172.24.8.73 -u clusteradmin -p clusteradmin
2 my_rep:SECONDARY> db.adminCommand({"replSetGetStatus":1})['syncingTo']; #查看备份节点的复制源
3 172.24.8.71:27017
4 my_rep:SECONDARY> db.adminCommand({"replSetSyncFrom":"172.24.8.72:27017"}) #配置复制源
6.3 查看副本集状态
1 my_rep:PRIMARY> rs.status()
6.4 查看副本集配置
1 my_rep:PRIMARY> rs.conf() #查看节点配置
6.5 强制重新配置副本集
6.6 查看副本集log状态
1 my_rep:PRIMARY> rs.printReplicationInfo()
2 configured oplog size: 1194.595947265625MB
3 log length start to end: 14027secs (3.9hrs)
4 oplog first event time: Tue May 28 2019 17:21:54 GMT+0800 (CST)
5 oplog last event time: Tue May 28 2019 21:15:41 GMT+0800 (CST)
6 now: Tue May 28 2019 21:15:48 GMT+0800 (CST)
6.7 查看复制延时
1 my_rep:PRIMARY> rs.printSlaveReplicationInfo()
2 source: 172.24.8.72:27017
3 syncedTo: Tue May 28 2019 21:17:40 GMT+0800 (CST)
4 0 secs (0 hrs) behind the primary
5 source: 172.24.8.73:27017
6 syncedTo: Tue May 28 2019 21:17:40 GMT+0800 (CST)
7 0 secs (0 hrs) behind the primary
8 source: 172.24.8.74:27017
9 syncedTo: Tue May 28 2019 21:17:40 GMT+0800 (CST)
10 0 secs (0 hrs) behind the primary
6.8 副本集信息查看(监控)命令汇总
6.9 其他常见维护命令
1 replSetHO:PRIMARY> rs.help()
2 rs.status() #查看副本集整体健康状态
3 rs.initiate() #使用默认配置初始化副本集
4 rs.initiate(cfg) #使用指定配置,初始化副本集;这是我们使用的命令
5 rs.conf() #从local.system.replset获取副本集当前配置信息
6 rs.reconfig(cfg) #指定配置信息重置副本集;指定第二个参数{force:true},来强制更新
7 rs.add(hostportstr) #使用默认配置,给副本集添加新成员
8 rs.add(membercfgobj) #使用指定配置,给副本集添加新成员
9 rs.addArb(hostportstr) #给副本集添加一个仲裁节点,只投票,不会成为数据节点
10 rs.stepDown([stepdownSecs, catchUpSecs]) #给PRIMARY降权,使之在指定时间内成为SECONDARY,会恢复
11 rs.syncFrom(hostportstr) #使SECONDARY从指定的服务器同步数据
12 rs.freeze(secs) #让自己在指定秒数内不会成为PRIMARY
13 rs.remove(hostportstr) #从副本集删除指定节点
14 rs.slaveOk() #SECONDARY节点默认是不能查询的,需要执行该命令,使之可以查询
15 rs.printReplicationInfo() #查看操作日志以及日志时间
16 rs.printSlaveReplicationInfo() #查看所有SECONDARY延迟情况
17 db.isMaster() #查询当前PRIMARY信息
七 副本集复制功能测试
7.1 授权
1 [root@mongodb01 ~]# mongo --host 172.24.8.71 -u admin -p admin
2 my_rep:PRIMARY> use admin
3 my_rep:PRIMARY> db.grantRolesToUser( "admin",[{ role: "dbOwner",db:"mydb" }])
7.2 插入数据
1 my_rep:PRIMARY> use mydb
2 my_rep:PRIMARY> db.age01.insert({name: 'zhangsan',
3 age: '18',
4 tel: '123456781',
5 love: ['apple','banana']
6 }
7.3 查看同步
1 [root@mongodb02 ~]# mongo --host 172.24.8.72 -u admin -p admin
2 my_rep:SECONDARY> rs.slaveOk()
3 my_rep:SECONDARY> use mydb
4 my_rep:SECONDARY> db.age01.count()
5 1
八 副本集故障转移功能测试
8.1 关闭主节点
1 [root@mongodb01 ~]# mongo --host 172.24.8.71 -u clusteradmin -p clusteradmin
2 my_rep:PRIMARY> rs.status()
3 my_rep:PRIMARY> use admin
4 switched to db admin
5 my_rep:PRIMARY> db.shutdownServer()
6 [root@mongodb02 ~]# mongo --host 172.24.8.72 -u clusteradmin -p clusteradmin #登录任意非关闭节点
7 my_rep:PRIMARY> rs.status()
8 my_rep:PRIMARY> db.serverStatus().repl.primary #查看主节点
9 172.24.8.72:27017
8.2 插入数据
1 [root@mongodb02 ~]# mongo --host 172.24.8.72 -u admin -p admin
2 my_rep:PRIMARY> use mydb
3 db.age01.insertOne({name: 'wanger', age: '15', tel: '123456783', love: ['pear','orange']})
8.3 开启关闭节点
1 [root@mongodb01 ~]# systemctl restart mongod.service
2 [root@mongodb01 ~]# mongo --host 172.24.8.71 -u admin -p admin
3 my_rep:SECONDARY> use mydb
4 switched to db mydb
5 my_rep:SECONDARY> rs.slaveOk()
6 my_rep:SECONDARY> db.age01.find().pretty()

006.MongoDB副本集的更多相关文章
- MongoDB副本集的实现与维护实战
1.建立MongoDB副本集 现利用一台机器完成MongoDB副本集的建立 机器1:127.0.0.1:27017 机器2:127.0.0.1:27018 机器3:127.0.0.1:27019 在D ...
- MongoDB副本集学习(三):性能和优化相关
Read Preferences/读写分离 有时候为了考虑应用程序的性能或响应性,为了提高读取操作的吞吐率,一个常见的措施就是进行读写分离,MongoDB副本集对读写分离的支持是通过Read Pref ...
- MongoDB 副本集的原理、搭建、应用
概念: 在了解了这篇文章之后,可以进行该篇文章的说明和测试.MongoDB 副本集(Replica Set)是有自动故障恢复功能的主从集群,有一个Primary节点和一个或多个Secondary节点组 ...
- MongoDB副本集学习(一):概述和环境搭建
MongoDB副本集概述 以下图片摘自MongoDB官方文档:http://docs.mongodb.org/manual/core/replication-introduction/ Primary ...
- MongoDB副本集学习(二):基本测试与应用
简单副本集测试 这一节主要对上一节搭建的副本集做一些简单的测试. 我们首先进入primary节点(37017),并向test.test集合里插入10W条数据: . rs0:PRIMARY> ;i ...
- MongoDB副本集搭建及备份恢复
一.MongoDB副本集(repl set)介绍 早起版本使用master-slave,一主一从和MySQL类似,但slave在此架构中为只读,当主库宕机后,从库不能自动切换为主: 目前已经淘汰了ma ...
- java程序连接MongoDB副本集测试
三个节点有一个节点挂掉也不会影响应用程序客户端对整个副本集的读写! public class TestMongoDBReplSet { public static void main(String[] ...
- MongoDB副本集的常用操作及原理
本文是对MongoDB副本集常用操作的一个汇总,同时也穿插着介绍了操作背后的原理及注意点. 结合之前的文章:MongoDB副本集的搭建,大家可以在较短的时间内熟悉MongoDB的搭建和管理. 下面的操 ...
- MongoDB副本集的搭建
副本集是mongodb提供的一种高可用解决方案.相对于原来的主从复制,副本集能自动感知primary节点的下线,并提升其中一个Secondary作为Primary. 整个过程对业务透明,同时也大大降低 ...
随机推荐
- webpack 使用style-loader,css-loader添加css样式
// 注意:webpack 默认只能打包处理js类型的文件// 如果要处理非js类型文件,需要手动安装第三方加载器// 1安装npm install style-loader css-loader - ...
- scanf和printf格式化输入输出中非常实用的小技巧
输入输出几乎是每个C程序必须具备的功能,因为有了它们,程序才有了交互性.C提供的输入输出函数除了具有必须的输入输出功能外,还有一些其他实用的小技巧,了解这些小技巧将会为程序带来更友好的用户体验. 一. ...
- Your activation code could not be validated (error 1653219)
很多小伙伴私聊我反应说,完全按照了你的 idea 激活教程走的,可最后还是没能激活成功,提示错误信息为: Your activation code could not be validated (er ...
- 洛谷P5364 [SNOI2017]礼物 题解
传送门 /* 热情好客的小猴子请森林中的朋友们吃饭,他的朋友被编号为 1∼N,每个到来的朋友都会带给他一些礼物:大香蕉.其中,第一个朋友会带给他 11 个大香蕉,之后,每一个朋友到来以后,都会带给他之 ...
- Centos下使用yum命令报错 except KeyboardInterrupt, e: SyntaxError: invalid syntax
使用yum命令报错 File "/usr/bin/yum", line 30 except KeyboardInterrupt, e: ^ SyntaxError: invalid ...
- Ligg.EasyWinApp-101-Ligg.EasyWinForm: Application--启动,传入参数、读取Application级别配置文件、验证密码、软件封面、启动登录、StartForm
首先请在VS里打开下面的文件,我们将对源码分段进行说明: 步骤1:读取debug.ini文件 首先读取当前文件夹(.\Clients\Form)的debug.ini文件,该文件的args用于调试时传参 ...
- 升鲜宝V2.0_杭州生鲜配送行业,升鲜宝供应链B端订货系统使用说明_升鲜宝生鲜供应链管理系统_15382353715_余东升
升鲜宝V2.0_杭州生鲜配送行业,升鲜宝供应链B端订货系统使用说明_升鲜宝生鲜供应链管理系统_15382353715 升鲜宝生鲜配送供应链系统经过这些年的发展,形成一套独特的订 ...
- ViewAnimator
ViewAnimator是一个基类,它继承了FrameLayout,因此它表现出FrameLayout的特征,可以将多View组件叠在一起.ViewAnimator额外增加的功能正如它的名字所暗示的, ...
- tensorflow 神经网络模型概览;熟悉Eager 模式;
典型神经网络模型:(图片来源:https://github.com/madalinabuzau/tensorflow-eager-tutorials) 保持更新,更多内容请关注 cnblogs.com ...
- Excel 2003 与 Excel 2007之间有什么不同?
如果您使用Excel 2003已有数年,您可能会意识到使用更多最新版本的Excel(2007.2010.2013或Excel 2016)的人员或组织的数量正在增加.您甚至可能收到了自己的Excel工作 ...