PostgreSQL libpq的客户端故障转移和负载均衡

打印 上一主题 下一主题

主题 1561|帖子 1561|积分 4685

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
什么是libpq

libpq是应用步伐使用PostgreSQL的C接口。libpq是一个库函数的集合,它们答应客户端步伐传递查询给PostgreSQL后端服务器并且接收这些查询的结果。libpq也是许多其他PostgreSQL应用接口的底层引擎,包括为 C++、Perl、Python、Tcl 和 ECPG编写的接口。
类似于Redis或者Mongodb的客户端,libpq自身可以实现客户端的故障转移,也就是说,PostgreSQL可用数据库集群故障转移之后,客户端也能探测到数据库的身份的变化,无须修改毗连字符串的情况下实现“主动故障转移”。

libpq客户端故障转移和负载均衡


libpq的主动故障转移,是根据毗连信息中的par_session_attrs来实现的,可以分为以下几种情况:
1,target_session_attrs="read-write"或者“primary”
  数据库毗连总是会去找主节点,如果主节点宕机切故障转移到其他节点,毗连会毗连到新的主节点
2,target_session_attrs=“read-only”
  数据库毗连总是会去找standby节点,如果standby节点宕机,则毗连失败
3,target_session_attrs=“prefer-standby”
  数据库毗连总是会去找standby节点,如果standby节点宕机,可以毗连到可用的主节点
4,target_session_attrs=“any”
  理论上来说会去毗连集群中的恣意一个节点,现实测试发现他只会去毗连standby节点,如果standby节点宕机,才归去连主节点,如果standby节点正常之后,又只会连standby节点
5,load_balance_hosts='random',
  oad_balance_hosts='random'是PostgreSQL 16中的一个增强特性,可以在毗连串里设置load_balance_hosts为random
  当设置了load_balance_hosts为random之后,在target_session_attrs=“any”的情况下,会随机毗连集群中的全部节点。
测试代码如下
  1. import psycopg2
  2. import time
  3. def get_conn_by_attrs(par_session_attrs):
  4.     conn = psycopg2.connect(host="192.168.152.100,192.168.152.101,192.168.152.102",#集群节点IP
  5.                             port="****",
  6.                             database="postgres",
  7.                             user="postgres",
  8.                             password="******",
  9.                             #load_balance_hosts='random',
  10.                             target_session_attrs=par_session_attrs)
  11.     with conn.cursor() as cur:
  12.         cur.execute("select inet_server_addr();")
  13.         var = cur.fetchall()
  14.         print(var)
  15.     time.sleep(1)
  16.     conn.close()
  17. if __name__ == "__main__":
  18.     while 1 > 0:
  19.         try:
  20.             #测试不同target_session_attrs获取连接的差异
  21.             #get_conn_by_attrs(par_session_attrs="read-write")
  22.             #get_conn_by_attrs(par_session_attrs="primary")
  23.             #get_conn_by_attrs(par_session_attrs="read-only")
  24.             #get_conn_by_attrs(par_session_attrs="prefer-standby")
  25.             get_conn_by_attrs(par_session_attrs="any")
  26.         except Exception as err:
  27.             print(err)
  28.             time.sleep(3)
复制代码
 
客户端故障转移解决了什么问题

1,客户端也能探测到数据库的身份变化之后,实现“主动故障转移”的方式毗连到目标节点,应用步伐端不必要做任何修改
2,主动实现负载均衡
因此,是否还有必要使用第三方proxy之类的中心件?
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

南七星之家

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表