我希望对多个虚拟机(比如 20-50 个)上的 postgres 数据进行非常频繁的备份(每小时一次)到同一个存档服务器。
如果需要,这里有更多数据:理想情况下,系统应支持位于所有虚拟机上的 80 到 200 个数据库的负载。数据库大小从小型(10MB - 100MB)到中型(500MB - 2GB),由百分之一的表组成,这些表中的一小部分很容易包含几千行到大约一百万行。对数据库的更改通常是新记录、一些更新,而不是删除。带宽将是 100Mbits/s。
由于我已经使用增量备份(rsync
)对标准文件系统进行了此操作,因此我想知道是否可以使用 postgres 数据库备份实现类似的操作。
我有几种可能的选择:
- 我可以选择将数据库放在可快照文件系统上(
aufs
docker 风格,,,ZFS
但btrfs
其中一些似乎确实会减慢 postgres 的速度)。 - 如果有必要,我准备使用 WAL
- 如果有必要的话,最好只在数据库级别进行备份。因为我不需要备份整个 postgres 数据,只需要备份客户数据库。
- 我在 postgres 服务器上有一些磁盘空间可以保存中间备份。
- 我可以在 VM 端承受一些合理的 CPU 工作负载,但宁愿在备份服务器上尽量减少它,因为它会增加需要备份的数据库数量。
- 我并不是真的在寻找连续备份或 PITR 恢复选项。我的备份服务器有一个基于文件的系统 (brfs),可以高效地定期对备份进行快照。这就足够了。
我想过:
rsync
在 SQL 中与本地服务器结合使用pg_dump
,但我不确定应该使用哪种不同的格式来保持最高效率。- 使用可快照文件系统,允许在块级别发送二进制差异(btrfs 和 ZFS 擅长此道),无论是否使用本地转储(关于要使用的备份格式的相同问题)。
- 我了解到了pg_rman,我真的不知道它是否可以依赖,而且设置和各种过程似乎比 稍微繁琐一些
pg_dump
。它是否支持仅进行增量备份?我们可以在备份方面有一个实用的格式吗?
除了增量备份之外,还有其他方法可以达到小带宽吗?
所以...我怎样才能在 Postgres 备份场景中最小化带宽?
答案1
您正在尝试使用一个尴尬的解决方案来解决一个实践性很强的问题(在真实的数据库系统中);对于大多数有小型数据库系统背景的人来说,这是可以理解的(我自己也用 MySQL 做过非常类似的事情,并艰难地度过了带宽爆发的后果)。
您应该使用 PostgreSQL 的复制功能;请参阅http://www.postgresql.org/docs/9.3/interactive/high-availability.html
答案2
以 sql 格式进行转储。在本地虚拟机上保留一个完整副本,假设每天刷新一次。然后转储新副本并从完整副本中进行差异处理。每天复制一次完整副本,其他时间只进行差异处理。要恢复,您必须使用差异修补完整副本并执行 sql 文件。