MongoDB副本集和备份
一、MongoDB副本集
数据库服务器出现故障的场景会有很多,网络故障、硬件级别的磁盘故障、停机维护等等,为了防范此类故障对业务带来的损失,通常都需要给数据库服务器一定 程度上的冗余能力。
MongoDB 跟 MySQL 一样也会面临这些问题,因此需要通过 MongoDB 的复制功能来为 MongoDB 增加可用性。
MongoDB 最常用的复制便是 Replica Set,即"副本集"或"复制集",在该文档中统称为副本集。
副本集中也有类似主从的角色概念,但是 MongoDB 副本集中的主节点叫 Primary,从节点叫 Secondary。
二、副本集原理
Primary 节点将数据修改操作记录到本地的 oplog(操作日志,在 local 库下)中,Secondary 节点定期到 Primary 节点获取这些操作,然后对自己的数据副本执 行这些操作,从而保证 Secondary 与 Primary 数据一致。
在 MongoDB 副本集中,Secondary 会不间断的通过心跳来探测 Primary 是否正常,当 Primary 不可用时,各 Secondary 之间会触发选举操作,通过优先级来 选举出一个 Secondary 做为新的 Primary,这个过程是无需人工干预的。
三、副本集特性
集特性
多个 MongoDB 实例建立的集群
任何节点都可以作为 Primary
所有写操作都走 Primary
自动故障转移
自动恢复
四、 搭建 MongoDB 副本集
1.环境描述
192.174.1.11
192.174.1.4
192.174.1.8
2.MongoDB 使用的版本
3.添加配置文件
比之前的配置文件,多加一个 replication.replSetName 的选项,指定副本集名称即可。 同一个副本集的副本集名称(replSetName)一定要一样,这里副本集名称是 test。
4.启动
mongod -f /data/mongodb/27017/mongod.conf
5.互相访问查看是否能连接
mongo 192.174.1.8:27017
mongo 192.174.1.4:27017
mongo 192.174.1.11:27017
6.初始化集群
在192.174.1.11上登录 MongoDB,准备创建并初始化集群。 定义变量,首先指定 id,id 就是副本集名称,members 里面是一组数组,数组中是各 MongoDB 实例的地址和监听端口
7. 打开 admin 库,使用 rs.initiate 方法,引用刚刚定义的变量 config,来初始化集群
use admin
rs.initiate(config)
当副本集创建并初始化完成后,终端提示符会由">"变成"test:PRIMARY>",tset 是副本集名称,PRIMARY 代表当前实例为 Primary 主节点。
一个 MongoDB 副 本集中只有一个 Primary,其它都是 Secondary。并且只有 Primary 能写入数据,Secondary 只能读但不能写。
8.当副本集初始化完成后,还需要在 Secondary 上声明自己是从节点,才能查看数据
test:SECONDARY> rs.slaveOk() \* 在192.174.1.4上 *\
test:SECONDARY> rs.slaveOk() \* 在192.174.1.8上 *\
9.查看 Secondary 延迟情况
test:SECONDARY> rs.printSlaveReplicationInfo()
10.查看集群状态
test:PRIMARY> rs.status()
11.验证是否搭建成功:
1.在主设备创建数据
2.从设备查看
1.4设备
1.11设备
五、 副本集的优先级
MongoDB 副本集的中,Secondary 会不断检测 Primary 的健康状况,一旦 Primary 故障,各 Secondary 会根据优先级来选举一个新的 Primary。
在没有指定优 先级的情况下,各实例的优先级为 1。在优先级一样的情况下,无法预料到到底哪个 Secondary 会成为 Primary。
获取副本集的配置信息,各实例的优先级默认为 1
1. 设置各实例的优先级,只有在 Primary 上可以更改优先级配置。
根据 rs.config().members 中的输出,各实例的索引号从 0 开始,每次递增 1,类似数组。
conf.members[0].priority=10
2.更新 MongoDB 副本集的配置
rs.reconfig(conf)
3.查看各实例当前的优先级
rs.config().members
六、Auto failover
MongoDB 的副本集当 Primary 挂了,会挑选其中的一台 Secondary 升为主
挑选其中一台 Secondary 升级为 Primary 的条件是剩下的集群台数>=2,
如果集群只剩下一个实例的话,会抛出异常 当前的 Primary 是 192.174.1.11,现在关闭 192.174.1.11
七、副本集的伸缩
1.从 MongoDB 副本集中移除实例,不可移除 Primary
use admin
rs.remove("192.174.1.4:27017")
查看验证是否还存在
使用 rs.status()查看
进入1.4设备查看
2.新增副本
新增一台 172.240.24.188:27017 实例,将其进入副本集,
注意配置文件中的副本集名称要保持一致 replSetName: test MongoDB 副本集里添加实例和移除实例都非常方便,
往 MongoDB 副本集添加实例数据能够自动同步,无需人工干预 添加实例。数据是自动同步,rs.add 的优先权重默认是 1
use admin
rs.add('192.174.1.4:27017')
查看是否切换回来
八、MongoDB 的数据备份与恢复
1.数据备份操作
在实际的应用场景中,经常需要对业务数据进行备份以做容灾准备,
mongodb 提供了备份和恢复的功能,
分别是 MongoDB 下载目录下的 mongodump 和 mongorestore 文件 ,具体的备份命令格式如下:
>mongodump -h dbhost -d dbname -o dbdirectory
-h:MongDB 所在服务器地址,例如:127.0.0.1,当然也可以指定端口号:127.0.0.1:27017
-d:需要备份的数据库实例,例如:kaiye
-o:备份的数据存放位置,例如:/data/mongodbackup/,
当然该目录需要提前建立,在备份完成后,系统自动在 dump 目录下建立一个备份的 db 名称的目录,这个目录里面存放该数据库实例的备份数据。
示例:
mongodump -h localhost:27017 -d kaiye -o /data/mongodbackup/
首先创建备份文件夹
mkdir /data/backup
mkdir {full,db,coll}
1.全备份
mongodump -h 127.0.0.1:27017 -o /data/backup/full/
2.备份指定库
mongodump -h 127.0.0.1:27017 -d mytest -o /data/backup/db/
3.备份指定集合
mongodump -h 127.0.0.1:27017 -d youtest -c test -o /data/backup/coll/
2.数据恢复操作
当在实际应用中,由于机器故障或人工手抖误删了数据库的话,这个时候就需要将备份的数据进行恢复了,
恢复 数据的命令格式如下:
>mongorestore -h dbhost -d dbname -directoryperdb dbdirectory
-h:MongoDB 所在服务器地址
-d:需要恢复的数据库实例,
例如:test,当然这个名称也可以和备份时候的不一样,比如 test -directoryperdb:备份数据所在位置,
例如:/data/mongodbackup/,记住备份的数据所在目录需要时备份目录 +"\"+需要恢复的数据库名称
1.恢复全库
mongorestore -h 127.0.0.1:27017 /data/backup/full/
查看是否恢复回来
2.恢复指定库
mongorestore -h 127.0.0.1:27017 -d mytest /data/backup/db/mytest/
查看是否恢复成功
3.恢复指定集合
mongorestore -h 127.0.0.1:27017 -d youtest /data/backup/coll/youtest/test.bson
查看是否导入成功