介绍
我在MongoDB World 2015做的演讲“Putting the Go in MongoDB”,重点是关于MongoDB工具的重写,从C ++到Go,这在可用性以及性能方面得到了一些改进,但是这里我只简要的说两个方面的新功能,(planned for the 3.2 release) – 归档和压缩。
在本文中,我将对mongodump和mongorestore提供更详细的归档和压缩特性说明,并探索使用这些特性的可行用例。
概述
一个通常目的的归档一般由一个或多个文件组成。这样例子如磁带归档格式(tar),其中包含按顺序组成的一个或多个文件。归档在执行进程间通信的应用程序中尤其有用,例如,你可以通过远程服务器进行目录的tarball压缩,然后通过SSH,传送到到本机上进行解压:
ssh source.server.com tar c sourceDirectory | tar x
由于归档以顺序的方式创建,接收端将能按顺序接收到发送端按顺序发来的数据。
在3.0中,我们增加了在MongoDB中并发执行备份和恢复多个集合的能力,这可以让你执行备份时,更加充分地利用磁盘I / O。 结果,写入mongodump的备份并不一定以顺序的方式接收。 同样,mongorestore同时读取还原操作集合,它的读取指令也并非是序列性的。
通用归档格式,如tar,只支持连续的文件归档打包。mongodump和mongorestore利用这些备份格式,将得到一个不可接受的性能退化, 由于所有集合的数据将不得不被按顺序写入和读出。为了支持这些工具的并发行为,我们研发了一个特殊的通用备份格式,支持非并发文件的写入。 这个新的归档特性极大了提高了备份和还原操作的效率。
背景
为了按上下文情况进行备份,我们考虑一下你们通常是如何创建备份的。比如,假设你有一个“country”的数据库,其中含有两个集合-“nigeria” and “austria”, 你可能会这样操作:
mongodump --db country
上面的指令读取“country”数据库的所有集合, 然后将其写入“dump”目录。 上面的指令就会产生以下的目录列表:
dump/
└── [4.3M] country
├── [2.1M] austria.bson
├── [ 87] austria.metadata.json
├── [2.1M] nigeria.bson
├── [ 87] nigeria.metadata.json
└── [ 140] system.indexes.bson
1 directory, 5 files
你也可以备份整个服务器-这里的服务器包含两个数据库(country 和product)。
mongodump
├── [5.4M] dump
│ ├── [4.03M] country
│ │ ├── [2.1M] austria.bson
│ │ ├── [ 87] austria.metadata.json
│ │ ├── [2.1M] nigeria.bson
│ │ ├── [ 87] nigeria.metadata.json
│ │ └── [ 140] system.indexes.bson
│ └── [1.1M] product
│ ├── [1.0M] mongodump.bson
│ ├── [ 89] mongodump.metadata.json
│ └── [ 72] system.indexes.bson
2 directories, 8 files
或选择备份单个集合到标准输出,而不是一个目录:
mongodump --db country --collection nigeria --out -
归档支持
在3.2中,我们引入了创建备份的一个附加模式 – “归档”模式,写入所有转储数据,甚至从不同的数据库和集合到单一的输出文件。 使用mongodump创建归档是极为简单的 – 只需要一个附加选项:
mongodump --db country --archive=country.archive
-rw-rw-r-- 1 wisdom wisdom 4.2M Jun 29 11:12 country.archive
上面的指令将在“country.archive”文件中创建“country”的数据库归档。默认情况下,归档被写入到标准输出。不同于目录模式的执行备份,创建目录树,默认归档模式下备份结果就是一个单一的文件, 包含“country”数据库的所有数据-所有集合,索引等。
你也可以备份一个单一的集合或整个服务器的内容:
单一集合:
mongodump --db country --collection nigeria --archive=nga.archive
-rw-rw-r-- 1 wisdom wisdom 2.1M Jun 29 11:15 nga.archive
整个服务器:
mongodump --archive=server.archive
-rw-rw-r-- 1 wisdom wisdom 5.3M Jun 29 11:26 server.archive
在mongodump的这种情况下,归档模式允许多个集合以非连续的方式打包在归档文件内。在mongorestore中,它允许多个集合进行并行恢复。这样,你可以在网络上执行数据迁移,降低磁盘I/O所占空间,享受到充分利用工具和底层存储引擎的并发所带来的好处。
数据迁移
一个新的备份改善的例子, 是mongodump和mongorestore之间的进程间通信 – 特别是能够将数据从一个传到另一个。在以前的版本中,这种支持有限 – 一个时间只能传输一个集合。现在,使用归档就没有这样的限制。这种方式对于数据库服务器出于安全考虑而安装有防火墙的情况下很有用。在这种情况下,一个通常的设计是允许一个或多个服务器方访问数据库。使用归档功能,在SSH上进行数据转移数据,就轻而易举了:
ssh wisdom@proxy.server.com mongodump --host source.server.com --archive | ssh wisdom@target.server.com mongorestore --archive
上面的指令使用SSH方式连接到代理主机(proxy.server.com),访问源服务器(source.server.com),在代理服务器上运行mongodump,为了最终的恢复,将源服务器的发送内容(通过SSH)到目标服务器(target.server.com)。
如果没有归档,通过mongodump完成这些操作的唯一办法就是,先执行备份到磁盘,在将文件复制到目标服务器,然后运行mongorestore。通过备份,一个指令就可以完成- 无需任何附加磁盘I/ O的开销。
压缩支持
除了备份,我们还使用gzip进行压缩。这是通过在mongodump和mongorestore中引入一个新的指令行选项“- -gzip”实现的。 压缩可用于目录以及归档模型下创建的备份,压缩还可以减少磁盘空间使用。
mongodump --db country --gzip
生成:
dump/
└── [568K] country
├── [254K] austria.bson.gz
├── [ 100] austria.metadata.json.gz
├── [254K] nigeria.bson.gz
├── [ 100] nigeria.metadata.json.gz
└── [ 91] system.indexes.bson.gz
1 directory, 5 files
注意,目录模型的归档备份大小-568KB-比没有压缩的备份要小很多-4.3MB.
压缩归档:
mongodump --db country --gzip --archive=country.archive
-rw-rw-r-- 1 wisdom wisdom 509K Jun 29 11:23 country.archive
对于归档来说,数据在写入归档之前需要先压缩。
恢复压缩目录模式备份,你应该运行:
mongorestore --gzip
类似用来恢复归档模式下的压缩备份的命令:
ssh wisdom@proxy.server.com mongodump --host source.server.com --archive --gzip | ssh wisdom@target.server.com mongorestore --archive --gzip
数据迁移不会产生任何磁盘I / O开销,由于压缩,将会使用更少的网络带宽。
总结
归档和压缩特性产生了许多用于进行备份和恢复操作的例子。如果你们正在使用MongoDB工具和其它类型的应用程序,我们也乐于倾听你们的经验及用例。 尽管目前最新版本工具还不文档,不过希望大家先对这些特性体验起来。
注:作为提供共享集群的集群范围快照的唯一备份解决方案,MongoDB Ops Manager和MongoDB Cloud Mannager被推荐用于较大的MongoDB部署。
Comment