备份和还原MongoDB分片集群数据

1.使用mongodump备份小量分片集群数据

如果一个分片集群的数据集比较小,可以直接使用mongodump连接到mongos实例进行数据备份。默认情况下,mongodump到非primary的节点进行数据查询。

如:

mongodump --host 192.168.100.200 --port 28018 -d taiwan_game1 -o .


mongorestore --host 192.168.100.200 --port 28018 taiwan_game1


需要注意的是如果使用mongodump的时候不指定库名或者集合名称,mongodump将直接从config server中获取集合数据和分片集群的元数据

mongodump --host 192.168.100.200 --port 28018

mongodump --host 192.168.100.200 --port 28018 -o .

不能使用--oplog参数从mongos获取数据,否则会报错。

can‘t use ‘local‘ database through mongos

如果要获取集群某一时刻的备份数据,需要停掉整个集群的写操作。


mongodump备份出来的数据不能反映集群中的集合的数据快和数据的分布情况。可以将数据恢复到任何MongoDB实例,或者是单个MongoDB实例,MongoDB Replica Set或者一个新的分片集群。



2.从文件系统快照中备份分片集群数据

如果要备份point-in-time实时集群数据,必须要停止集群中的所有写操作,在生产环境中,只能获取接近实时的数据备份。

1)停掉balancer进程,停止各个shard间数据的均匀分配。

在进行备份之前停掉balancer进程是基本操作,如果在备份的时候没有停掉balancer进程,那么备份出来的数据可能会有重复的或者丢失的情况发生,因为在备份的时候可能会有数据块迁移。

mongos> use config;
switched to db config
mongos> sh.stopBalancer();
Waiting for active hosts...
Waiting for the balancer lock...
Waiting again for active hosts after balancer is off...




2)锁定每个分片中的每个replica set中的一个Secondary成员。所以这时备份的数据可以最接近某一个的实时数据。使用db.fsyncLock()将所有挂起的写操作数据刷新到磁盘然后锁定mongodb实例。


3)备份其中一个config server数据。备份config server的数据就是备份整个集群的元数据。只需要备份其中一个的数据就行,因为每个config server的数据都是一样的。

可以使用以下两种方式备份:

A.创建一个文件系统快照。参见 Backup and Restore with Filesystem Snapshots

B.使用mongodump备份config server数据。

连接到其中一台config server

mongodump --host 192.168.100.65 --port 28018 --oplog  -o .


4)备份锁定的Replica Set成员数据 Backup and Restore with Filesystem Snapshots.

5)解锁被锁定的Replica Set成员。使用db.fsyncUnlock()


6)重新启动balancer进程

mongos> use config;
switched to db config
mongos> sh.setBalancerState(true);



3.

本文出自 “Linux SA John” 博客,请务必保留此出处http://john88wang.blog.51cto.com/2165294/1621654

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。