PostgreSQL Replication之第九章 与pgpool一起工作(6)

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: 此用户的密码。

[如果您真的想确保负载均衡会为您提供最新的数据,使用同步复制是必要的,尽管它是昂贵。]

上一篇:关于Solr的使用总结的心得体会


下一篇:OpenGL多视口