我正在尝试为postgres数据库设置负载平衡。我们有一个postgres主人和奴隶。我配置了HA代理来实现负载均衡。简单的负载平衡工作正常。
此数据库用于bitbucket。
当bitbucket通过loadbalancer将数据写入数据库时,如果它正在击中master,则可以正常运行,但遇到slave(处于读取模式)时会遇到问题,因为它无法更新数据库。
我怎么能说HAproxy将请求路由到postgres master。
从pg_stat_replication中选择*以在主服务器和从服务器上执行,并根据它将请求路由到流服务器主服务器的输出,有没有什么方法可以使用HAproxy实现它?
谢谢, Karthik
答案 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。