我对使用Filesystem Snapshots备份有一些疑问。 我只是想知道只拍快照就等于备份?这是因为快照是以mongo方式指向磁盘块的指针(写入时复制) 如果原始光盘坏了,则无法恢复。
所以问题是,如果我们想要备份,只需要文件系统快照还是我们需要另外实现?
答案 0 :(得分:2)
文件系统快照本身肯定不足以备份您的数据。使用文件系统快照时,这不会帮助您处理损坏的磁盘等。因此,您需要将快照中的数据移动到其他位置。
创建快照时,应用于原始数据文件的更改将填充剩余空间,以防LVM快照甚至只显示明确分配的空间。因此,您需要在处理备份并将其存储在远程位置所需的时间内至少按照您编写的数量配置磁盘。
注意在以下描述中,为简洁起见,大多数安全注意事项都被搁置。您必须应用适合您数据的安全措施,例如在使用第一种方法时使用stunnel加密数据传输。
这是我倾向于做的事情,以便尽可能低地过度配置磁盘大小,CPU和RAM,同时仍然能够创建快照并正确使用它们。请注意,这是一种糟糕的解决方案(当预算非常紧张时),你真的应该仔细考虑这个解决方案是否适合你。
我通常有一台廉价的VM作为备份系统,附带一些大的,廉价的,慢的(ish)存储。在那个VM上,我打开一个监听netcat,通过某种压缩器输出它的输出。我使用自己的snap,这是一个利用snappy compression algorithm的粗略实现。原因是snappy针对速度而不是大小进行了优化,这就是我对此感兴趣以减少从MongoDB服务器获取快照所需的时间。
nc -l <internalIp> <somePort> | snap > /mnt/datastore/backup-$(date +%Y-%m-%dT%T%Z).tar.sz
确保只收听内部IP或通过防火墙限制访问的IP。
接下来,我在我进行备份的MongoDB服务器上安装了我的快照(如何做到这一点)。然后我跳转到我挂载快照的目录(包含数据文件夹的目录)并在其上运行tar
,将输出汇总到另一个netcat
,将焦油数据发送到监听的netcat备份服务器
tar -cv <directory> | nc <internalIpOfBackupServer> <listeningPort>
这基本相同,但它使用ssh而不是nc
:
tar -cv <directory> | ssh user@backupserver "snap > /mnt/datastore/backup-$(date +%Y-%m-%dT%T%Z).tar.sz"
我们正在为这里的安全交易速度。这种方法需要相当长的时间,并且需要更多资源来备份您的备份。
您确实希望快照在另一台服务器上尽快移动和存档,以便您可以销毁快照并返回正常操作。这样,您可以将必要的资源过度配置减少到最低限度。由于RAM是任何MongoDB部署中非常宝贵的资源,因此您希望在不同的计算机上完成压缩。
如果备份计算机存在空间问题,您可以立即使用gzip
或bzip2
代替snap
(降低备份的速度),或者备份完成后,您可以在备份计算机上执行以下操作:
snap -c -u yourBackup.tar.sz | bzip2 -v9 > yourBackup.tar.bz2
rm yourBackup.tar.sz