我正在研究 FreeBSD,以便为数据库服务器提供更全面的备份和灾难恢复策略。理想情况下,我想模仿谷歌对“持久磁盘”的做法https://developers.google.com/compute/docs/disks#snapshots
我希望对 FreeBSD 有更多了解的人可以验证这些想法/问题:
- 我读到过 FreeBSD 可以即时拍摄磁盘快照,因此如果我们的数据库触发一致状态(阻止所有写入并将缓冲区刷新到磁盘),我会假设我可以每小时拍摄一次快照,并且服务不会中断超过几秒钟。这是真的吗?
有没有办法轻松拍摄快照并将其备份到异地?是否可以逐步完成以节省实际使用的磁盘空间?
如果需要回滚,通常需要多长时间?回滚也是即时的吗?
谢谢!
答案1
我建议你使用带 ZFS 的 FreeBSD。请参阅 FreeBSD 手册中有关 ZFS 的部分,网址为https://www.freebsd.org/doc/handbook/filesystems-zfs.html. 而且 FreeBSD 10 相对于早期版本来说有一些重大的改进。
ZFS 可以即时拍摄磁盘快照,而不会造成任何明显的服务中断。许多商店使用 MySQL 和 Postgres 数据库来实现这一点。Oracle 数据库管理员使用 Oracle Solaris 和 ZFS 来实现这一点。
ZFS 快照可以回滚。
您可以使用常规备份软件备份 .zfs/snapshot 目录。我听说过有人为此使用zfs send
和zfs receive
,但我们无法让它工作。理论上,您可以执行类似操作zfs send snapshot.today | mybackupsoftware --hostname backup.offsite.example.org
并将图像存储在异地。
zfs send [-vR] [-[iI] snapshot] snapshot
Creates a stream representation of the second snapshot, which is
written to standard output. The output can be redirected to a file
or to a different system (for example, using ssh(1).
zfs receive [-vnF] filesystem|volume|snapshot
Creates a snapshot whose contents are as specified in the stream
provided on standard input
答案2
FreeBSD 可以做 UFS 快照(过程如下所述在手册中)。许多操作(包括我的操作)都利用了这一点,方法是让数据库静止(我们对从属数据库进行完全关闭),制作快照,然后重新激活数据库。
然后可以使用常规备份工具(在我们的例子中是 Bacula)安装和备份快照。
(有关 UFS 的更多精彩内容,看这里)。
我看到的最大的缺点是 UFS 快照不能(轻易)回滚 - 我知道的最有效的技术是从快照中 rsync 数据(这效率不高由于 UFS 快照的性质,它们可能不太有用(这可能有点难以掌握),但对于制作备份来说,它们通常没问题。
正如 Stefan 指出的那样ZFS 可能是更好的选择。
对于数据库之类的东西,ZFS 比 UFS 有许多优势(例如,如果分区空间不够,可以快速轻松地向分区添加更多磁盘空间,以及 ZFS 发送/接收功能,用于移动快照)。
ZFS 的另一个优点是快照实际上是“免费的”(ZFS 是一个非覆盖文件系统,因此它所做的只是不会重用快照中的任何扇区 - UFS 需要在快照存在时进行一些额外的簿记),并且您可以根据需要使它们可写。
我能想到的 ZFS 的唯一缺点是它占用大量内存,尤其是与 UFS 相比。你需要考虑这一点(以及有关调整 ZFS 的信息) 然后再投入生产。