9.6 运行pgpool和流复制
pgpool也可以和除了语句级别的复制之外的流复制一起使用。一个完美的方案是使用PostgreSQL的板载复制和仅仅使用pgpool的负载均衡与连接池。
实际上,这样做是非常有好处的,因为您没有必要担心函数的副作用或潜在的其他问题。PostgreSQL的事务日志总是正确的,并且它被认为是终极法则。
在流复制没引入到PostgreSQL内核之前,pgpool的语句级的复制是一个复制数据的很好的功能。
除此之外,这对只有一个master来说也是非常有益的。原因很简单。如果您只有一个master,面临不一致是很困难的。此外,pgpool将创建完整的副本,以便无论如何都要使数据被复制。如果数据必须最终在两个服务器上,这绝对没有完成--在这种情况下,写到两个节点将不会使事情有任何较好的扩展。
在没有复制的情况下,您如何运行pgpool?这个过程基本上是相当的简单:
• 设置 PostgreSQL 流复制 (同步或异步)。
• 把连接池配置中的replication_mode设置为 off。
• 设置 master_slave 为 on.
• 设置 master_slave_sub_mode 为 stream.
• 按本章的描述启动 pgpool 。
在基本的设置中,pgpool将假设节点号为0的节点为master。所以,您必须确保您的两个节点在配置中按正确的顺序被列出。
对于一个基本的设置,这些配置的小的改变是相当完美的。
9.6.1 为master/slave模式优化pgpool配置
pgpool为您的需要提供了一系列的参数来调整配置。我们必须要考虑的最重要的事情之一是PostgreSQL支持同步和异步复制。为什么这是相关的呢?好,让我们假设一个简单的场景。有人想注册一个网站:
• 一个写请求出现。pgpool将调度您到0号节点,因为我们面临一个写操作。
• 用户点击“保存”按钮。
• 用户将到达下一个页面;一个读请求将被发出
° 如果我们最终在0号节点上,我们就没有问题—数据预期将在那里。
° 如果我们最终在1号节点上,我们可能看不到数据在这个节点上,如果我们正在使用异步复制。如果在本例中,您在使用同步复制,理论上也会有一个小窗口。
这会导致客户端奇怪的行为。一个典型的奇怪案例行为将是:一个用户创建一个个人资料。在这种情况下,写一行数据。在下一刻,用户想要访问他或她的个人资料,并检查数据。如果他或她碰巧从副本中读,数据可能还没有在那里。如果您是在写一个网络应用程序,您必须把这件事保存在您的脑海里。
为了展开这个问题,您有两个选择:
• 同步复制,它是很昂贵的
• 在连接池配置中设置 delay_threshold
delay_threshold定义了slave能够接收读请求所允许的最大延迟时间。该设置在XLOG内部采用变化的字节来定义。因此,如果您把设置为1024,slave只允许滞后master1KB 的XLOG。否则,它将不会接收到请求。
当然,除非这被设置为0,slave返回太老的数据,使它完全不可能是是很难的,但是一个合理的设置可以使它非常不可能。在许多实际的应用中,这可能是足够的。
pgpool如何知道slave滞后多久?答案是,这很容易配置:
• sr_check_period: 这个变量定义了,系统应该多久检查一次哪些XLOG位置,以弄清楚是否是延迟太高或太低。
• sr_check_user: 通过流连接到primary来检查当前XLOG的位置的用户名。
• sr_check_password: 此用户的密码。
[如果您真的想确保负载均衡会为您提供最新的数据,使用同步复制是必要的,尽管它是昂贵。]