我们如何使用HAproxy实现对postgres master的路由请求

时间:2017-01-10 14:24:28

标签: postgresql haproxy

我正在尝试为postgres数据库设置负载平衡。我们有一个postgres主人和奴隶。我配置了HA代理来实现负载均衡。简单的负载平衡工作正常。

此数据库用于bitbucket。

当bitbucket通过loadbalancer将数据写入数据库时​​,如果它正在击中master,则可以正常运行,但遇到slave(处于读取模式)时会遇到问题,因为它无法更新数据库。

我怎么能说HAproxy将请求路由到postgres master。

从pg_stat_replication中选择*以在主服务器和从服务器上执行,并根据它将请求路由到流服务器主服务器的输出,有没有什么方法可以使用HAproxy实现它?

谢谢, Karthik

1 个答案:

答案 0 :(得分:0)

这可以使用自定义运行状况检查来完成,只有在服务器是主服务器时才能成功。所有其他从属服务器都将被标记下来。

 backend pgsql
   mode tcp
   option tcp-check
   tcp-check send-binary 0000002c # length
   tcp-check send-binary 00030000 # version
   tcp-check send-binary 75736572 # 'user'.bytes.map { |c| c.to_s(16) }
   tcp-check send-binary 00 # string terminator
   tcp-check send-binary 6170706c69636174696f6e # 'application'
   tcp-check send-binary 00 # string terminator
   tcp-check send-binary 6461746162617365 # 'database'
   tcp-check send-binary 00 # string terminator
   tcp-check send-binary 706f737467726573 # 'postgres'
   tcp-check send-binary 00 # string terminator
   tcp-check send-binary 00 # name/value terminator
   tcp-check expect string R
   tcp-check send-binary 51 # 'Q'
   tcp-check send-binary 00000020 # length
   tcp-check send-binary 73656c6563742070675f69735f696e5f7265636f7665727928293b # 'select pg_is_in_recovery();'
   tcp-check send-binary 00 # string terminator
   tcp-check send-binary 58 # 'X'
   tcp-check send-binary 00000004 # length
   tcp-check expect string f
   tcp-check expect string Z
   server pg1 1.2.3.4:5432 check
   server pg2 5.6.7.8:5432 check

' tcp-check''使用Postgres客户端协议发送和接收二进制数据包,该协议在documentation中定义。

此外,您还可以使用二级' readonly'仅在主要失败时使用的后端。这是额外的前端/后端配置。

 frontend pgsql
   mode tcp
   bind *:5432
   acl readonly.pgsql nbsrv(pgsql) eq 0
   use_backend readonly.pgsql if readonly.pgsql
   acl pgsql nbsrv(pgsql) gt 0
   use_backend pgsql if pgsql

 <...primary backend...>

 backend readonly.pgsql
   mode tcp
   option tcp-check
   tcp-check send-binary 0000002c # length
   tcp-check send-binary 00030000 # version
   tcp-check send-binary 75736572 # 'user'.bytes.map { |c| c.to_s(16) }
   tcp-check send-binary 00 # string terminator
   tcp-check send-binary 6170706c69636174696f6e # 'application'
   tcp-check send-binary 00 # string terminator
   tcp-check send-binary 6461746162617365 # 'database'
   tcp-check send-binary 00 # string terminator
   tcp-check send-binary 706f737467726573 # 'postgres'
   tcp-check send-binary 00 # string terminator
   tcp-check send-binary 00 # name/value terminator
   tcp-check expect string R
   tcp-check send-binary 58 # 'X'
   tcp-check send-binary 00000004 # length
   server pg1 1.2.3.4:5432 check
   server pg2 5.6.7.8:5432 check

如果将奴隶标记为“向下”,那么这是值得商榷的。是一个很好的使用HAProxy健康检查。上述方法确实有效,但{H}工具other ways没有HAProxy。