我正在研究 PostgreSQL 复制解决方案。我知道这些解决方案有两种
- 低级别——涉及流日志传输、PostgreSQL 9.x 中可用的热备份功能
- 高级 - 在 SQL 查询级别工作的 Slony、Londiste
我的数据库不是很忙也不是很大(至少现在是这样)。但我想避免因 Amazon EC2 故障(例如最近发生的故障)而导致停机。我的解决方案是在不同的可用区中维护一个从服务器,它将与我的主数据库实例保持同步。这样我就可以在 master 宕机时故障转移到它。需要考虑的一点是,这将需要从主服务器到从服务器的连续数据复制,这将是跨 EC2 可用性区域的网络流量。它不是免费的。现在每 GB 花费 1 美分,但在阅读 PostgreSQL 说明书中的一些计算后,我了解到即使数据库流量很低,成本也会增长得非常高。例如,在“PostgreSQL 9 Administration Cookbook”的“Hot physical backup and continuous archiving”一章中,我读到了:
如果 archive_timeout 设置为 30 秒,我们将每天生成最少 2*60*24 = 2880 个文件,每个文件大小为 16 MB,因此每天总体积为 46 GB(最小)
[而且我假设数据库上的流量最少]
我唯一的要求是,在主服务器上执行的每个写入 SQL 查询都应该在从服务器上重播。如果这是在事件回调上完成的,那将是完美的,因为只有当数据库被修改时,主从之间才会有数据传输,而不是每 30 秒左右,即使没有对数据库进行更改也是如此。
因此,我认为 Londiste 可能是适合我的解决方案,但我不能 100% 确定它是这样工作的。
你有什么建议?
经过一周的研究,我相信PostgreSQL 实例
Streaming Log Shipping
的Hot Standby
配置可以满足我即时复制(数据丢失的最小窗口)和低网络流量的需求。我已经写了一篇关于如何设置它的详细博客文章。可能还有其他解决方案,使用像 pgpool 这样的第三方工具,但我并没有取得太大的成功。
看看pgpool。我们在我的工作中将它用于生产,到目前为止我们非常满意。您显然仍想进行备份,因为它不能保护您免受 SQL 查询错误的影响,但它可以很好地完成同步/复制工作。