PostgreSQL 9.1中的自动故障转移


18

如何在PostgreSQL 9.1中设置两个相同的服务器以进行自动故障转移。

操作系统


从源代码编译的Centos 5 PostgreSQL 9.1
postgres用户帐户在两台机器上都存在,并且具有ssh无密码密钥来连接到两台机器。

我当前的设置:

主服务器配置:

postgresql.conf:

listen_address = '*'
wal_level = hot_standby
max_wal_senders = 3
checkpoint_segments = 16    
wal_keep_segments = 8 
archive_mode = on    
archive_command = 'cp "%p" /opt/pgsql91/archive/"%f"'  

pg_hba.conf:

 host  replication   all   10.0.66.1/32      trust
 host  replication   all   10.0.66.2/32      trust

备用服务器

postgresql.conf和pg_hba.conf与主服务器上配置的相同。

recovery.conf:

 standby_mode = 'on'
 primary_conninfo = 'host=10.0.66.1'
 trigger_file = '/opt/pgsql91/data/trigger.txt'

多亏了hzRoot,我现在了解了如何将服务器从备用服务器切换到主服务器。

使用以下命令,我可以将新的从属服务器与新的主服务器同步,然后获得复制备份并运行。

在新的主服务器上(10.0.66.2)

  1. su-postgres
  2. 触摸/ opt / pgsql91 / data /中的trigger.txt
  3. recovery.conf变为recovery.done
  4. psql -c“; SELECT pg_start_backup('backup',true)”;
  5. rsync -a -v -e ssh / opt / pgsql91 / data / 10.0.66.1:/opt/pgsql91/data/-排除postmaster.pid
  6. psql -c“; SELECT pg_stop_backup()”;

在新的从属服务器上(10.0.66.1)

  1. 创建recovery.conf:cp recovery.done至recovery.conf
  2. vi recovery.conf更改IP地址:primary_conninfo ='host = 10.0.66.2'
  3. 开始PostgreSQL

所以我的问题是:

  1. 这是切换角色的正确方法吗?
  2. 是否有人自动化了此过程,如果是,您做了什么?
  3. 如果启用了同步复制,我注意到新的主服务器将不会提交任何事务,因为它正在等待从属服务器响应。但是没有从属服务器,因为另一个服务器旧的主服务器已关闭。这是正确的还是我需要在新的从属服务器关闭时临时禁用同步复制?

1.是的,正确2.可能最好不要自动化该过程。3.因此,您至少需要2个从属设备和1个主设备。因为正如您所说的同步。复制至少需要2个节点才能推送提交同步。如果只有一个主节点,你将无法提交..
sftsz

新主服务器上不需要执行步骤4、5和6,因为好了,您首先要进行复制。其次,如果主机死了并且脱机怎么办-您将无法连接到它。通常在加入复制池的新从节点上执行步骤4、5和6。
埃里克

在我玩这个游戏时,@ Eric需要执行步骤4、5、6才能使旧主机恢复工作状态。使备用数据库成为新的主数据库将立即产生新的WAL条目,因此现在比旧的主数据库高1个条目。在待机模式下启动旧主机会向我抛出错误,因此我确实必须对旧主机进行步骤4,5,6才能将其与新主机同步(通过使用pg_basebackup,它可以从新主机流式传输整个xlog -替换postgres> = 9.1中的步骤4、5、6(我认为)。我是正确的还是做错了什么,这应该没有必要吗?
达利波·菲卢斯(Dalbor Filus),

Answers:


8

查看repmrg

repmgr是一组开源工具,可帮助DBA和系统管理员管理PostgreSQL数据库集群。

通过利用PostgreSQL 9中引入的Hot Standby功能,repmgr大大简化了对具有高可用性和可伸缩性要求的数据库的设置和管理过程。

repmgr通过以下方式简化了管理和日常管理,提高了生产率并降低了PostgreSQL集群的总体成本:

  • 监视复制过程;允许DBA发出高
  • 可用性操作,例如切换和故障转移。

它有两件事:

  1. repmgr:在群集上执行任务然后退出的命令程序
  2. repmgrd:管理和监视守护程序,监视守护程序并可以自动执行远程操作。

对于自动故障转移,repmgrd可以解决问题,它不是网络中的SPOF,例如pgPool。但是,监视所有重传并在发生故障后将其重新备份仍然很重要。

2.0版即将发布,包括RPM。


您好弗兰克,谢谢您的回答。我还没有听说过repmrg,我一定会尝试一下。
Craig Efrein

再次问好,弗兰克,谢谢您的指正,这正是我想要的。我终于有机会今天尝试一下。
Craig Efrein

4

在您的recovery.conf文件中,您应该添加一条线,告诉postgres从主服务器故障转移到从服务器。您应该添加

trigger_file = '/any/file/to/trigger'

在给定路径上创建此文件时。节点将改变。(文件不包含任何东西,仅是触发器)

您可以找到有关流复制的其他信息

另一方面,也许可以通过一些技巧使其自动创建,但是使用监视工具和手动进行故障转移会更好。


感谢您的答复。我可能要过几天才能进行测试,但我一定会回复您。
Craig Efrein 2012年

我将给您+1的trigger_file答案,这有助于我极大地简化流程。并不是完全的答案,而是如何完全自动化该过程。我注意到的另一件事是,当主服务器停机时,事务将无法完成,因为它正在等待主服务器进行确认。这是通过使用异步复制解决
克雷格Efrein

太棒了 我对PostgreSQL的复制实现缺乏灵活性提出了很多批评,但这是一种处理故障转移的好方法。
亚伦·布朗

1
但是,即使主服务器本身仍在运行(它有两个主服务器),它也会接管主服务器角色。这不是由postgres本身自动化的。
达利博尔·菲罗斯(Dallib Filus),

0

有没有人考虑为此使用pgpool-II?

http://pgpool.projects.postgresql.org/contrib_docs/simple_sr_setting/index.html

我为PostgreSQL设置了复制。看来棘手的部分发生在老主人回来时。

从我所读的内容来看,pgpool似乎可以使大多数自动化。但是我不确定是否利用PostgreSQL 9.1中已经存在的复制功能。


1
pgPool是一个单点故障,当出现故障时,您会丢失所有内容。
Frank Heikens

1
谢谢您的回答。我在CentOS和Debian上都尝试了PGPool II,但结果却不尽相同,最终放弃了。
Craig Efrein

1
为什么不将pgpool II与HAproxy一起使用?有了心跳和浮动ip监听?
mikiemorales 2014年

仅作历史参考,pgpool-ii当前也未在Windows上运行。
将于
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.