9.7 处理故障转移和高可用
可以使用pgpool来解决的一些明显的问题是高可用性和故障转移。一般来讲,有使用pgpool或者不使用pgpool可以用来处理这些问题的各种方法。
9.7.1 使用PostgreSQL流和Linux HA
使用pgpool解决高可用性的最简单的方法是和Linux HA一起使用PostgreSQL的板载工具。在这种情况下,在我们的世界中,最好的方法是不使用语句级别的复制运行pgpool和使用PostgreSQL的流复制来同步数据。
pgpool可以被配置来做负载均衡,并自动发送写请求到第一个节点,发送读请求到第二个节点。
在故障转移时会发生什么情况呢?让我们假设master会崩溃。在这种情况下,Linux HA 会触发故障转移,并移动master的IP地址到slave。然后,slave可以被Linux HA提升为新的master(如果这是需要的话)。然后,pgpool将只会面对一个故障的数据库连接并重新开始并重新连接。
当然,我们也可以使用londiste或一些其它技术,例如Slony复制数据。然而,对于典型的案例,流复制就够了。
[ 在您的pgpool设置中,如果您想使用一个较新版本的PostgreSQL更新所有的节点,Slony 和 skytools 是完美的工具。您可以建立Slony或londiste 副本,然后只是暂停简单的操作(保持同步)并切换您的IP地址到运行新版本的主机。]
时间经验表明,使用PostgreSQL板载和操作系统级别的工具是一个简单,重要,可靠的处理故障转移的好方法。
9.7.2 pgpool的高可用和故障转移的机制
除了流复制和Linux HA,您也可以使用pgpool 提供的机制来处理故障转移。本节将使用pgpool提供的这些方法。
您必须要做的第一件事情是把故障转移命令添加到您的池配置中。下面是一个例子:
failover_command = '/usr/local/bin/pgpool_failover_streaming.sh %d %H
每当pgpool检查到一个节点故障,它将执行我们在池配置中的脚本,并根据我们的规定作出反应。理论上讲,这个故障转移脚本将写一个触发文件—这个触发问题然后可以在slave系统上被看到,并把它转化为master。
在slave上的recovery.conf 文件可能看起来是这样的:
standby_mode = 'on'
primary_conninfo = 'host=master_host user=postgres'
trigger_file = '/tmp/trigger_file0'
该trigger_file 每隔5秒被检查一次。一旦发生了故障转移,pgpool会把第二个服务器作为新的master。
在故障转移之后合乎逻辑的下一步是将一个新的服务器一引入到系统中。
最简单,最可靠的方法是:
• 设置流复制
• 等待服务器重新同步
• 简单地中断写入
• 使用 pcp_attach_node 添加新的节点
• 恢复写入
总体而言,这将只需要几秒钟的服务终端。
[ 理论上,在pgool的世界里,服务中断不是必须的,确保不存在一丝引起不一致的的方法,关闭写入操作几秒钟可能是值得的。在绝大多数情况下,这会是可以忍受的。]
9.8 总结
pgpool是一个已经被广泛使用于复制和故障转移的工具。它提供了许多的功能,包括负载均衡,连接池,和复制。pgpool在语句级别复制数据,并和PostgreSQL板载的工具例如,流复制 整合在一起。
在下一章中,我们将深入Slony并学习逻辑复制。我们将讨论软件体系架构并看看在一个大的服务器集群中如何使用Slony来复制数据。