MongoDB的副本集and备份恢复

数据库服务器出现故障的场景会有很多,网络故障、硬件级别的磁盘故障、停机维护等等,为了防范此类故障对业务带来的损失,通常都需要给数据库服务器一定程度上的冗余能力。 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 副本集

环境描述
地址规划

mongo185 172.240.24.185: 27017
mongo186 172.240.24.186: 27017
mongo187 172.240.24.187: 27017

编辑各实例配置文件

比之前的配置文件,多加一个 replication.replSetName 的选项,指定副本集名称即可。
同一个副本集的副本集名称(replSetName)一定要一样,这里副本集名称是 test。

同一个副本集的副本集名称(replSetName)一定要一样,这里副本集名称是 test。
vim /data/mongodb/27017/mongod.conf

systemLog:
destination: file
logAppend: true
path: /data/mongodb/27017/mongodb.log
storage:
dbPath: /data/mongodb/27017/
journal:enabled: true
processManagement:
fork: true
pidFilePath: /data/mongodb/27017/mongod.pid
timeZoneInfo: /usr/share/zoneinfo
net:
port: 27017
bindIp: 0.0.0.0
replication:
replSetName: test

mongod -f /data/mongodb/27017/mongod.conf

各实例相互访问,验证是否正常通信

mongo 172.240.24.185:27017
mongo 172.240.24.186:27017
mongo 172.240.24.187:27017

初始化集群
在 mongo185 上登录 MongoDB,准备创建并初始化集群。
定义变量,首先指定 id, id 就是副本集名称, members 里面是一组数组,数组中是各 MongoDB 实例的地址和监听端口

 config = { _id:"test", members:[
	{_id:0,host:"172.240.24.185:27017"},
	{_id:1,host:"172.240.24.186:27017"},
	{_id:2,host:"172.240.24.187:27017"}]
}

打开 admin 库,使用 rs.initiate 方法,引用刚刚定义的变量 config,来初始化集群

 admin
 rs.initiate( config )

当副本集创建并初始化完成后,终端提示符会由">“变成"test:PRIMARY>”, tset 是副本集名称, PRIMARY 代表当前实例为 Primary 主节点。一个 MongoDB 副本集中只有一个 Primary,其它都是 Secondary。并且只有 Primary 能写入数据, Secondary 只能读但不能写。
当副本集初始化完成后,还需要在 Secondary 上声明自己是从节点,才能查看数据

test:SECONDARY> rs.slaveOk()    * 在 mongo186 上 *\
test:SECONDARY> rs.slaveOk()    * 在 mongo187 上 *\

查看 Secondary 延迟情况

test:SECONDARY> rs.printSlaveReplicationInfo()

查看集群状态
查看副本集状态

test:PRIMARY> rs.status()
test:SECONDARY> rs.status()
test:SECONDARY> rs.status()

验证数据复制

登录到 Primary
mongo 172.240.24.185:27017
写入一些数据
在各 Secondary 上查看数据是否同步
查看各 Secondary 的延迟情况

副本集的优先级

MongoDB 副本集的中, Secondary 会不断检测 Primary 的健康状况,一旦 Primary 故障,各 Secondary 会根据优先级来选举一个新的 Primary。在没有指定优先级的情况下,各实例的优先级为 1。在优先级一样的情况下,无法预料到到底哪个 Secondary 会成为 Primary。

设置各实例的优先级,只有在 Primary 上可以更改优先级配置。根据 rs.config().members 中的输出,各实例的索引号从 0 开始,每次递增 1,类似数组。

test:PRIMARY> conf.members[0].priority = 10
test:PRIMARY> conf.members[1].priority = 5
test:PRIMARY> conf.members[2].priority = 2

更新 MongoDB 副本集的配置

test:PRIMARY> rs.reconfig(conf)

查看各实例当前的优先级

test:PRIMARY> rs.config().members

Auto failover

MongoDB 的副本集当 Primary 挂了,会挑选其中的一台 Secondary 升为主。
挑选其中一台 Secondary 升级为 Primary 的条件是剩下的集群台数>=2, 如果集群只剩下一个实例的话, 会抛出异常
当前的 Primary 是 mongo185,现在关闭 mongo185

mongo186 的优先级是 5, mongo187 的优先级是 2。因此 mongo186 被提升为 Primary

副本集的伸缩

新增一台 172.240.24.188:27017 实例, 将其进入副本集, 注意配置文件中的副本集名称要保持一致 replSetName: testMongoDB 副本集里添加实例和移除实例都非常方便, 往 MongoDB 副本集添加实例数据能够自动同步,无需人工干预添加实例。 数据是自动同步, rs.add 的优先权重默认是 1

test:PRIMARY> use admin
test:PRIMARY> rs.add('172.240.24.188:27017')
从 MongoDB 副本集中移除实例,不可移除 Primary
test:PRIMARY> use admin
test:PRIMARY> rs.remove('172.240.24.188:27017')

副本集经过添加删除后顺序会乱,设置权重需要注意。
获取到后,需要注意每个实例的位置

test:PRIMARY> rs.config()

MongoDB 的数据备份与恢复

数据备份操作

在实际的应用场景中,经常需要对业务数据进行备份以做容灾准备, 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/

数据恢复操作
当在实际应用中,由于机器故障或人工手抖误删了数据库的话,这个时候就需要将备份的数据进行恢复了,恢复数据的命令格式如下:

mongorestore -h dbhost -d dbname -directoryperdb 

-h: MongoDB 所在服务器地址
-d:需要恢复的数据库实例,例如: test,当然这个名称也可以和备份时候的不一样,比如 test
-directoryperdb:备份数据所在位置,例如: /data/mongodbackup/,记住备份的数据所在目录需要时备份目录+""+需要恢复的数据库名称

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值