对于如何备份mongodb副本集感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍mongodb备份,并为您提供关于006.MongoDB副本集、21.26mongodb副本集介绍、mongodb
对于如何备份mongodb副本集感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍mongodb 备份,并为您提供关于006.MongoDB副本集、21.26mongodb 副本集介绍、mongodb 副本集搭建、 21.35mongodb 副本集测试、21.33 mongodb副本集介绍、21、23 mongodb副本集介绍的有用信息。
本文目录一览:- 如何备份mongodb副本集(mongodb 备份)
- 006.MongoDB副本集
- 21.26mongodb 副本集介绍、mongodb 副本集搭建、 21.35mongodb 副本集测试
- 21.33 mongodb副本集介绍
- 21、23 mongodb副本集介绍
如何备份mongodb副本集(mongodb 备份)
如何解决如何备份mongodb副本集?
我有一个 mongodb(副本集),我想转储这个数据库,我知道我可以用一个简单的 cli 命令转储一个 mongodb,它在这里工作。但是我正在尝试使用相同的命令来转储副本集,我应该使用相同的命令吗?
mongodump -h "example-shard01:27017,example-shard02:27017,example-shard03:27017" --username=myusername --password=mypass --out=/destination
解决方法
您需要在连接字符串 URI 中指定副本集。类似这样:
"example-shard01:27017,example-shard02:27017,example-shard03:27017/?replicaSet=myRepl"
您的主机名有点奇怪,它们看起来更像是分片集群中的分片。不要混合它们。
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()

原文出处:https://www.cnblogs.com/itzgr/p/10983794.html
21.26mongodb 副本集介绍、mongodb 副本集搭建、 21.35mongodb 副本集测试
mongodb 副本集介绍
- MongoDB 早期版本使用 master-slave,一主一从和 MySQL 主从基本是一致的,但 salve 在此架构中为只读,当主库宕机后,从库不能自动切换为主.
- 目前已经淘汰 master-salve 模式,改为副本集,副本集架构也是为了实现 MongoDB 的高可用,这种模式下有一个主(primary),和多个从(secondary)只读,支持他们设置权重,当主宕机后,权重最高的从切换为主.
- 在此架构中还可以建立一个仲裁(arbiter)的角色,它只负责裁决,而不存储数据.
- 在此架构中读写数据都是在主上,要想实现负载均衡的目的需要手动指定读库的目标 server.
MongoDB 副本集架构图
原理很简单一个 primary,secondary 至少是一个,也可以是多个 secondary,除了多个 secondary 之外,还可以加一个 Arbiter,Arbiter 叫做仲裁,当 Primary 宕机后,Arbiter 可以很准确的告知 Primary 宕掉了,但可能 Primary 认为自己没有宕掉,这样的话就会出现脑裂,为了防止脑裂就增加了 Arbiter 这个角色,尤其是数据库坚决不能出现脑裂的状态,脑裂会导致数据会紊乱,数据一旦紊乱恢复就非常麻烦.
变迁图
说明:Primary 宕机后,其中 secondary 就成为一个新的 Primary,另外一个 secondary 依然是 secondary 的角色。对于 MySQL 主从来讲,即使做一主多从,万一 master 宕机后,可以让从成为新的主,但这过程是需要手动的更改的。但是在 MongoDB 副本集架构当中呢,它完全都是自动的,rimary 宕机后,其中 secondary 就成为一个新的 Primary,另外一个 secondary 可以自动识别新的 primary.
mongodb 副本集搭建
准备三台机器: 192.168.193.130 (primary)
192.168.193.131 (secondary)
192.168.193.132 (secondary)
三台机器都需要安装 MongoDB,primary 已安装过,两台 secondary 需要安装,因步骤一样,在此不做演示.
编辑三台机器的配置文件
[root@aminglinux-130 ~]# vim /etc/mongod.conf
# network interfaces
net:
port: 27017
bindIp: 127.0.0.1,192.168.193.130 # Listen to local interface only, comment to listen on all interfaces.
"/etc/mongod.conf" 44L, 784C
说明:做副本集 bindIp 要监听本机 IP 和内网 IP
#replication: //把#去掉,并增两行
replication:
oplogSizeMB: 20 //前面两个空格
replSetName;aminglinux //定义副本集的名字 前面两个空格
重启 MongoDB 服务:
[root@aminglinux-130 ~]# systemctl restart mongod
启动从主机
[root@aminglinux-131 ~]# vim /etc/mongod.conf
net:
port: 27017
bindIp: 127.0.0.1,192.168.193.131 # Listen to local interface only, comment to listen on all interfaces.
说明:做副本集 bindIp 要监听本机 IP 和内网 IP
#replication: //把#去掉,并增两行
replication:
oplogSizeMB: 20
replSetName: aminglinux //定义副本集的名字
重启 MongoDB 服务:
[root@aminglinux-131 ~]# systemctl restart mongod
[root@aminglinux-131 ~]# ps aux |grep mongod
mongod 3111 2.2 3.9 1018232 39316 ? Sl 16:23 0:21 /usr/bin/mongod -f /etc/mongod.conf
root 3282 0.0 0.0 112704 660 pts/0 R+ 16:39 0:00 grep --color=auto mongod
启动从主机
[root@aminglinux-132 ~]# vim /etc/mongod.conf
#replication: //把#去掉,并增两行
replication:
oplogSizeMB: 20
replSetName: aminglinux //定义副本集的名字
[root@aminglinux-132 ~]# systemctl restart mongod
[root@aminglinux-132 ~]# ps aux |grep mongod
mongod 3246 60.0 3.7 1018232 37532 ? Sl 16:44 0:42 /usr/bin/mongod -f /etc/mongod.conf
root 3292 0.0 0.0 112720 980 pts/0 R+ 16:45 0:00 grep --color=auto mongod
连接 MongoDB --Primary 机器
[root@aming-130 ~]# mongo
MongoDB shell version v3.4.9
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.9
Server has startup warnings:
2017-10-20T17:18:53.740+0800 I CONTROL [initandlisten]
2017-10-20T17:18:53.740+0800 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database.
2017-10-20T17:18:53.740+0800 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted.
2017-10-20T17:18:53.740+0800 I CONTROL [initandlisten]
2017-10-20T17:18:53.740+0800 I CONTROL [initandlisten]
2017-10-20T17:18:53.740+0800 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is ''always''.
2017-10-20T17:18:53.740+0800 I CONTROL [initandlisten] ** We suggest setting it to ''never''
2017-10-20T17:18:53.740+0800 I CONTROL [initandlisten]
2017-10-20T17:18:53.740+0800 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is ''always''.
2017-10-20T17:18:53.740+0800 I CONTROL [initandlisten] ** We suggest setting it to ''never''
2017-10-20T17:18:53.740+0800 I CONTROL [initandlisten]
置副本集
说明:在哪台机器上执行这一步,那么哪台机器就会成为 primary
> config={_id:"aminglinux",members:[{_id:0,host:"192.168.193.130:27017"},{_id:1,host:"192.168.193.131:27017"},{_id:2,host:"192.168.193.132:27017"}]}
{
"_id" : "aminglinux",
"members" : [
{
"_id" : 0,
"host" : "192.168.193.130:27017"
},
{
"_id" : 1,
"host" : "192.168.193.131:27017"
},
{
"_id" : 2,
"host" : "192.168.193.132:27017"
}
]
}
>
config={_id:"aminglinux" --> aminglinux(副本集的名字)
members --> 指定成员
rs.initiate (config) --> 初始化
> rs.initiate()?
{ "ok" : 1 }
rs.status () --> 查看副本集状态
说明:可以看到 192.168.193.130 显示:"stateStr" : "PRIMARY"
192.168.193.131 和 192.168.193.132 分别显示: "stateStr" : "SECONDARY"
aminglinux:OTHER> rs.status()
{
"set" : "aminglinux",
"date" : ISODate("2019-05-14T10:54:40.893Z"),
"myState" : 1,
"term" : NumberLong(1),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"heartbeatIntervalMillis" : NumberLong(2000),
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1557831277, 1),
"t" : NumberLong(1)
},
"appliedOpTime" : {
"ts" : Timestamp(1557831277, 1),
"t" : NumberLong(1)
},
"durableOpTime" : {
"ts" : Timestamp(1557831277, 1),
"t" : NumberLong(1)
}
},
"members" : [
{
"_id" : 0,
"name" : "192.168.193.130:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 319,
"optime" : {
"ts" : Timestamp(1557831277, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2019-05-14T10:54:37Z"),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "could not find member to sync from",
"electionTime" : Timestamp(1557831175, 2),
"electionDate" : ISODate("2019-05-14T10:52:55Z"),
"configVersion" : 1,
"self" : true,
"lastHeartbeatMessage" : ""
}
],
"ok" : 1
}
annalinux:PRIMARY> rs.status()
{
"set" : "annalinux",
"date" : ISODate("2019-05-14T11:05:12.553Z"),
"myState" : 1,
"term" : NumberLong(1),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"heartbeatIntervalMillis" : NumberLong(2000),
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1557831909, 1),
"t" : NumberLong(1)
},
"appliedOpTime" : {
"ts" : Timestamp(1557831909, 1),
"t" : NumberLong(1)
},
"durableOpTime" : {
"ts" : Timestamp(1557831909, 1),
"t" : NumberLong(1)
}
},
"members" : [
{
"_id" : 0,
"name" : "192.168.193.131:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 953,
"optime" : {
"ts" : Timestamp(1557831909, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2019-05-14T11:05:09Z"),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "",
"electionTime" : Timestamp(1557831527, 2),
"electionDate" : ISODate("2019-05-14T10:58:47Z"),
"configVersion" : 1,
"self" : true,
"lastHeartbeatMessage" : ""
}
],
"ok" : 1
}
annalinux:OTHER> rs.status()
{
"set" : "annalinux",
"date" : ISODate("2019-05-14T11:06:48.154Z"),
"myState" : 1,
"term" : NumberLong(1),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"heartbeatIntervalMillis" : NumberLong(2000),
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1557832006, 1),
"t" : NumberLong(1)
},
"appliedOpTime" : {
"ts" : Timestamp(1557832006, 1),
"t" : NumberLong(1)
},
"durableOpTime" : {
"ts" : Timestamp(1557832006, 1),
"t" : NumberLong(1)
}
},
"members" : [
{
"_id" : 0,
"name" : "192.168.193.132:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 654,
"optime" : {
"ts" : Timestamp(1557832006, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2019-05-14T11:06:46Z"),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "could not find member to sync from",
"electionTime" : Timestamp(1557832004, 2),
"electionDate" : ISODate("2019-05-14T11:06:44Z"),
"configVersion" : 1,
"self" : true,
"lastHeartbeatMessage" : ""
}
],
"ok" : 1
}
21.33 mongodb副本集介绍
21.33 mongodb副本集介绍
MongoDB副本集:
早期版本使用master-slave,一主一从和MySQL类似,但slave在此架构中为只读,当主库宕机后,从库不能自动切换为主
目前已经淘汰master-slave模式,改为副本集,这种模式下有一个主(primary),和多个从(secondary),只读。支持给它们设置权重,当主宕掉后,权重最高的从切换为主
在此架构中还可以建立一个仲裁(arbiter)的角色,它只负责裁决,而不存储数据
再此架构中读写数据都是在主上,要想实现负载均衡的目的需要手动指定读库的目标server
副本集架构图:
副本集primary宕机示意图:
21.34 mongodb副本集搭建
三台机器: 192.168.133.130(primary) 192.168.133.132(secondary) 192.168.133.133(secondary)
编辑三台机器的配置文件,更改或增加:
replication://把此行前面的#删除
##oplog大小
oplogSizeMB: 20//前面有两个空格
##复制集名称
replSetName: aminglinux//前面有两个空格
分别重启三台机器服务
连接主,在主上运行命令mongo
>use admin
>config={_id:"aminglinux",members:[{_id:0,host:"192.168.133.130:27017"},{_id:1,host:"192.168.133.132:27017"},{_id:2,host:"192.168.133.133:27017"}]}
>rs.initiate(config)
rs.status() //查看状态
如果两个从上的状态为"stateStr" : "STARTUP", 则需要进行如下操作
> var config={_id:"aminglinux",members:[{_id:0,host:"192.168.133.130:27017"},{_id:1,host:"192.168.133.132:27017"},{_id:2,host:"192.168.133.133:27017"}]}
>rs.reconfig(config)
此时再次查看rs.status()会发现从的状态变为SECONDARY
> use admin
switched to db admin
> config={_id:"aminglinux",members:[{_id:0,host:"192.168.60.11:27017"},{_id:1,host:"192.168.60.12:27017"},{_id:2,host:"192.168.60.13:27017"}]}
{
"_id" : "aminglinux",
"members" : [
{
"_id" : 0,
"host" : "192.168.60.11:27017"
},
{
"_id" : 1,
"host" : "192.168.60.12:27017"
},
{
"_id" : 2,
"host" : "192.168.60.13:27017"
}
]
}
>
> rs.initiate(config)
{ "ok" : 1 } ##是1 就对了;
aminglinux:PRIMARY> rs.status() ##查看状态;
{
"set" : "aminglinux",
"date" : ISODate("2017-10-19T19:41:16.726Z"),
"myState" : 1,
"term" : NumberLong(1),
"heartbeatIntervalMillis" : NumberLong(2000),
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1508442074, 1),
"t" : NumberLong(1)
},
"appliedOpTime" : {
"ts" : Timestamp(1508442074, 1),
"t" : NumberLong(1)
},
"durableOpTime" : {
"ts" : Timestamp(1508442074, 1),
"t" : NumberLong(1)
}
},
"members" : [
{
"_id" : 0,
"name" : "192.168.60.11:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 2851,
"optime" : {
"ts" : Timestamp(1508442074, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2017-10-19T19:41:14Z"),
"electionTime" : Timestamp(1508439306, 1),
"electionDate" : ISODate("2017-10-19T18:55:06Z"),
"configVersion" : 6,
"self" : true
},
{
"_id" : 2,
"name" : "192.168.60.12:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 75,
"optime" : {
"ts" : Timestamp(1508442074, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1508442074, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2017-10-19T19:41:14Z"),
"optimeDurableDate" : ISODate("2017-10-19T19:41:14Z"),
"lastHeartbeat" : ISODate("2017-10-19T19:41:16.633Z"),
"lastHeartbeatRecv" : ISODate("2017-10-19T19:41:14.635Z"),
"pingMs" : NumberLong(0),
"syncingTo" : "192.168.60.11:27017",
"configVersion" : 6
},
{
"_id" : 3,
"name" : "192.168.60.13:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 0,
"optime" : {
"ts" : Timestamp(1508442074, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1508442074, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2017-10-19T19:41:14Z"),
"optimeDurableDate" : ISODate("2017-10-19T19:41:14Z"),
"lastHeartbeat" : ISODate("2017-10-19T19:41:16.630Z"),
"lastHeartbeatRecv" : ISODate("2017-10-19T19:41:16.645Z"),
"pingMs" : NumberLong(0),
"syncingTo" : "192.168.60.11:27017",
"configVersion" : 6
}
],
"ok" : 1
}
21.35 mongodb副本集测试
MongoDB副本集测试:
主上建库,建集合
>use mydb
>db.acc.insert({AccountID:1,UserName:"123",password:"123456"})
>show dbs
从上查看
>show dbs
若出现错误Error: listDatabases failed:{ "note" : "from execCommand", "ok" : 0, "errmsg" : "not master" },需要执行
>rs.slaveok()
aminglinux:PRIMARY> use mysql ##在从上面创建mysql
switched to db mysql
aminglinux:PRIMARY> db.acc.insert({AccountID:1,UserName:"123",password:"123456"})
##创建一个集合acc,并插入数据
WriteResult({ "nInserted" : 1 })
aminglinux:PRIMARY> show dbs;
db1 0.000GB
local 0.000GB
mysql 0.000GB
##接下来我们等了60.12secondary查看同步
aminglinux:SECONDARY> show dbs
2017-10-19T20:47:39.795+0800 E QUERY [thread1] Error: listDatabases failed:{
"ok" : 0,
"errmsg" : "not master and slaveOk=false", ##这里无法查看
"code" : 13435,
"codeName" : "NotMasterNoSlaveOk"
} :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
Mongo.prototype.getDBs@src/mongo/shell/mongo.js:62:1
shellHelper.show@src/mongo/shell/utils.js:769:19
shellHelper@src/mongo/shell/utils.js:659:15
@(shellhelp2):1:1
aminglinux:SECONDARY> rs.slaveOk() ##执行这个,让slave可以查看;
aminglinux:SECONDARY> show dbs
db1 0.000GB
local 0.000GB
mysql 0.000GB
副本集更改权重模拟主宕机:
默认三台机器权重都为1,如果任何一个权重设置为比其他的高,则该台机器马上切换为primary角色,所以我们预设三台机器的权重分别为:130:3,132:2,133:1
在主上执行
cfg = rs.conf()
cfg.members[0].priority = 3
cfg.members[1].priority = 2
cfg.members[2].priority = 1
rs.reconfig(cfg)
这样的话,第二个节点将会成为候选主节点。
主上执行 iptables -I INPUT -p tcp --dport 27017 -j DROP
aminglinux:PRIMARY> rs.config() ##查看配置,priority是其权重
{
"_id" : "aminglinux",
"version" : 6,
"protocolVersion" : NumberLong(1),
"members" : [
{
"_id" : 0,
"host" : "192.168.60.11:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 2,
"host" : "192.168.60.12:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 3,
"host" : "192.168.60.13:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
}
],
"settings" : {
"chainingAllowed" : true,
"heartbeatIntervalMillis" : 2000,
"heartbeatTimeoutSecs" : 10,
"electionTimeoutMillis" : 10000,
"catchUpTimeoutMillis" : 60000,
"getLastErrorModes" : {
},
"getLastErrorDefaults" : {
"w" : 1,
"wtimeout" : 0
},
"replicaSetId" : ObjectId("59e8f4ffee48611ad04ee633")
}
}
[root@Dasoncheng ~]# iptables -I INPUT -p tcp --dport 27017 -j DROP
##在primary上面执行这条命令,drop掉27017端口的通信;在其他副本集查看状态
aminglinux:PRIMARY> rs.status() ##60.12已经成为primary了;
{
"set" : "aminglinux",
"date" : ISODate("2017-10-19T13:04:55.021Z"),
"myState" : 1,
"term" : NumberLong(2),
"heartbeatIntervalMillis" : NumberLong(2000),
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1508443618, 5),
"t" : NumberLong(2)
},
"appliedOpTime" : {
"ts" : Timestamp(1508443618, 5),
"t" : NumberLong(2)
},
"durableOpTime" : {
"ts" : Timestamp(1508443618, 5),
"t" : NumberLong(2)
}
},
"members" : [
{
"_id" : 0,
"name" : "192.168.60.11:27017",
"health" : 0,
"state" : 8,
"stateStr" : "(not reachable/healthy)",
"uptime" : 0,
"optime" : {
"ts" : Timestamp(0, 0),
"t" : NumberLong(-1)
},
"optimeDurable" : {
"ts" : Timestamp(0, 0),
"t" : NumberLong(-1)
},
"optimeDate" : ISODate("1970-01-01T00:00:00Z"),
"optimeDurableDate" : ISODate("1970-01-01T00:00:00Z"),
"lastHeartbeat" : ISODate("2017-10-19T13:04:50.892Z"),
"lastHeartbeatRecv" : ISODate("2017-10-19T13:04:54.910Z"),
"pingMs" : NumberLong(1),
"lastHeartbeatMessage" : "Couldn''t get a connection within the time limit",
"configVersion" : -1
},
{
"_id" : 2,
"name" : "192.168.60.12:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 6295,
"optime" : {
"ts" : Timestamp(1508443618, 5),
"t" : NumberLong(2)
},
"optimeDate" : ISODate("2017-10-19T20:06:58Z"),
"electionTime" : Timestamp(1508443618, 2),
"electionDate" : ISODate("2017-10-19T20:06:58Z"),
"configVersion" : 6,
"self" : true
},
{
"_id" : 3,
"name" : "192.168.60.13:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 1591,
"optime" : {
"ts" : Timestamp(1508443618, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1508443618, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2017-10-19T20:06:58Z"),
"optimeDurableDate" : ISODate("2017-10-19T20:06:58Z"),
"lastHeartbeat" : ISODate("2017-10-19T13:04:53.973Z"),
"lastHeartbeatRecv" : ISODate("2017-10-19T13:04:53.173Z"),
"pingMs" : NumberLong(1),
"syncingTo" : "192.168.60.11:27017",
"configVersion" : 6
}
],
"ok" : 1
}
##在这里呢,因为权重都为1 所有选择primary具有随机性;我们这里设置权重来指定
aminglinux:PRIMARY> cfg=rs.conf() ##设置一个变量,下面为设置权重
aminglinux:PRIMARY> cfg.members[0].priority = 3
3
aminglinux:PRIMARY> cfg.members[1].priority = 2
2
aminglinux:PRIMARY> cfg.members[2].priority = 1
1
aminglinux:PRIMARY> rs.reconfig(cfg) ##重新加载配置
{ "ok" : 1 }
2017-10-19T21:10:12.635+0800 I NETWORK [thread1] trying reconnect to 127.0.0.1:27017 (127.0.0.1) failed
2017-10-19T21:10:12.638+0800 I NETWORK [thread1] reconnect 127.0.0.1:27017 (127.0.0.1) ok
aminglinux:SECONDARY> rs.config() ##我们可以看到,60.12已经变成secondary了;
{
"_id" : "aminglinux",
"version" : 7,
"protocolVersion" : NumberLong(1),
"members" : [
{
"_id" : 0,
"host" : "192.168.60.11:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 3,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 2,
"host" : "192.168.60.12:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 2,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 3,
"host" : "192.168.60.13:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
}
],
"settings" : {
"chainingAllowed" : true,
"heartbeatIntervalMillis" : 2000,
"heartbeatTimeoutSecs" : 10,
"electionTimeoutMillis" : 10000,
"catchUpTimeoutMillis" : 60000,
"getLastErrorModes" : {
},
"getLastErrorDefaults" : {
"w" : 1,
"wtimeout" : 0
},
"replicaSetId" : ObjectId("59e8f4ffee48611ad04ee633")
}
}
小提示:这是副本集的操作; rs.slaveOk();--sencondary机器授权查询
rs.isMaster()--查看副本集状态
rs.status()--查看副本集状态
rs.remove("localhost:20001");--删除节点 在主服务器执行
rs.add("localhost:20001");--增加节点
rs.initiate(config_rs1);--Initializes a new replica set.
rs.reconfig(config_rs1);--Re-configures a replica set by applying a new replica set configuration object.
rs.的命令官网
http://docs.mongodb.org/manual/reference/method/js-replication/
Replica Set官网说明:
http://docs.mongodb.org/manual/core/replica-set-architecture-three-members/
21、23 mongodb副本集介绍
早期版本使用master-slave,一主一从和MySQL类似,但slave在此架构中为只读,当主库宕机后,从库不能自动切换为主
目前已经淘汰master-slave模式,改为副本集,这种模式下有一个主(primary),和多个从(secondary),只读。支持给它们设置权重,当主宕掉后,权重最高的从切换为主
在此架构中还可以建立一个仲裁(arbiter)的角色,它只负责裁决,而不存储数据
再此架构中读写数据都是在主上,要想实现负载均衡的目的需要手动指定读库的目标server
今天关于如何备份mongodb副本集和mongodb 备份的讲解已经结束,谢谢您的阅读,如果想了解更多关于006.MongoDB副本集、21.26mongodb 副本集介绍、mongodb 副本集搭建、 21.35mongodb 副本集测试、21.33 mongodb副本集介绍、21、23 mongodb副本集介绍的相关知识,请在本站搜索。
本文标签: