我们经常在办公室里解决这个问题,问题不断出现。您如何处理 PostgreSQL 复制?我什至不一定要谈论高级集群,只是简单地使用 Master-Slave、Master-MultiSlave 和 Master-Master。我发现为 MySQL 设置它通常非常简单。故障转移即使不是完美的也很简单,尤其是配置起来很容易。我们玩过 Slony,但它有点过于亲力亲为(模式更改需要干预,新数据库需要干预等)。PGPool2 非常好,直到一个节点出现故障,我们找不到一种优雅的方式(除了将所有内容都关闭并重新设置下降的节点)来使复制恢复同步。基本上这就是我通常要寻找的东西:
- 易于设置(我会接受困难的设置,但易于扩展)
- 简单的故障转移
- 恢复掉下的节点只需要时间(即像 mysql。服务器出现故障,您将其启动,然后等待复制赶上)
- 架构更改不会破坏复制
- 向服务器添加新数据库是无缝的(即像 mysql 一样,您可以复制整个 DB 服务器,因此在主服务器上创建一个新数据库,它会自动传播到从服务器)
MySQL 可以很好地处理其中的大部分,但我对 PostgreSQL 有一定的喜爱。此外,在某些情况下,它是我们唯一的选择,我们希望将复制添加到组合中。您目前正在使用什么,您对您的解决方案有何看法?我保证,这不是 MySQL 与 PostgreSQL 的对比,因为这不是我想要开始的。:)
简短的回答 - 如果您需要在线只读从属服务器,那么 PostgreSQL 还没有这样的解决方案。
PostgreSQL 9.0 (Spring/Summer 2010) 中目前在这个领域正在进行两个主要的开发项目,即:
http://wiki.postgresql.org/wiki/NTT's_Development_Projects
http://wiki.postgresql.org/wiki/Hot_Standby
两者的结合旨在实现 MySQL 样式复制的易用性减去 MySQL 的错误/问题以及用户从 PostgreSQL 了解的可靠性。
所有这一切都是由 2008 年 PostgreSQL 核心团队的清单启动的:
http://archives.postgresql.org/pgsql-hackers/2008-05/msg00913.php
迄今为止,拥有最大用户群的 PostgreSQL 复制解决方案是 Slony-I(写入成本更高,架构更改繁琐)、WAL shipping/walmgr(奴隶不能在线使用)和 Skype/Skytools 的 pgQ/londist(比完成的解决方案更多的工具/构建块)。
我在 Log Shipping、walmgr 和 Slony-I 上写了一些东西,见
http://blogs.amd.co.at/mt/mt-search.cgi?blog_id=1&tag=pgrep&limit=20了解更多信息。
并将另一种解决方案放入环中:rubyrep。
要与您的要求进行比较:
是的,这实际上是 rubyrep 的主要重点。
是的。事实上 rubyrep 进行主-主复制——要进行故障转移,根本不需要任何操作。只需开始使用其他数据库。
是的。
对于非主键更改,复制甚至不必停止(但要确保双方同时更改架构)
要添加/删除表,只需重新启动复制守护程序。仅更改表的主键列需要一些努力。
这仅以有限的方式支持:每个 rubyrep setup 一次只复制一个数据库。(但是为多个数据库设置复制非常容易。)
您没有提到将热读取从属设备作为要求,因此我将建议将 Heartbeat 与共享存储或 DRBD 一起使用。它只是做正确的事,管理轻而易举。它是旧版 Microsoft SQL Server 集群的 Linux 等价物。一个节点是活动的,另一个节点是被动的,而数据在两者之间共享。您不必担心基于 SQL 的复制,因为它都是在块级别的较低级别处理的。
说真的,如果您不需要读取从站,这是迄今为止最好的解决方案。WAL 存档的东西充其量是 hokey,如果您中断服务器重新启动的运输过程,您必须重新设置所有内容。slony 和 londiste 不切芥末。如果你想留在主要的源代码树上而不是商业化,Heartbeat 是你最好的选择。
根据您的要求,PITR 似乎是解决您的问题的最简单方法:
在线备份和时间点恢复 (PITR)
你没有说你需要查询从服务器,所以 PITR 可能是对的。
它是 8.0 版 PostgreSQL 的标准部分,因此您可能已经拥有启动和运行它所需的一切。
如果您发现指令过于冗长,请查看SkyTools WalMgr,它将创建/故障转移到热备用数据单命令任务的过程。
对于更复杂的复制场景,我有很好的 Slony-1 体验,但 PostgreSQL 有很多不错的复制/HA 选项可用。
如果您想要异步主/从复制,请考虑 Londiste(Skype 的 skytools 包的一部分)wiki.postgresql.org/wiki/Londiste_Tutorial
它很容易安装,添加新数据库很容易,复制只是“赶上”。
故障转移不是内置的。您将需要更改应用程序连接字符串或在另一层软件后面混淆数据库连接。
一些架构更改很容易。其他的就更难了。这取决于您的应用程序。skytools 的下一个版本(ver 3.0)应该处理 DDL 并包含使故障转移更容易的设施。
在发现 Slony 使用起来太痛苦后,我们搬到了 Londist。
在这里查看讨论,也许这会有所帮助:
http://blog.endpoint.com/2009/05/competitors-to-bucardo-version-1.html
和
Bucardo 第一版的竞争对手,位于页面下方:
http://www.planetpostgresql.org/
确实没有任何免费/开源的方式来提供您正在寻找的东西。如果您想要如此交钥匙的东西,请查看各种第三方商业复制解决方案。
现在,可以使用写入头日志 (WAL) 传送来使用 Postgres 滚动您自己的复制:
这基本上是您可以将辅助节点置于连续恢复模式并每隔{小间隔}将事务日志导入其中的地方。Postgres 配置具有“存根”,允许您在完成 WAL 的 Postgres 时执行某些操作,所以不,这就是该设置的前提——利用这些“存根”。
但是,这不允许您进行主-主和/或循环复制。
无论如何,它绝对适用于冗余,但我不会称其为“简单设置”、“简单故障转移”、“无缝”或类似的名称。
除了“添加新数据库”之外,您还可以尝试 Mammoth Replicator ( https://projects.commandprompt.com/public/replicator )。它是开源的,易于设置并支持故障转移。主要限制是单一数据库和无法复制 DDL 更改,两者都在 TODO 列表中。
我目前正在研究钨复制器,我离任何明确的结论还很远,但可能值得一看。
www.continuent.com
Postgres-R看起来很有希望,但我不知道该项目是否仍然存在。