gpt4 book ai didi

python-3.x - PostgreSQL repmgr 向何处发送查询

转载 作者:行者123 更新时间:2023-11-29 12:07:00 25 4
gpt4 key购买 nike

我正在使用 Postgres 11.5 和 docker。我已经启动了 3 个容器 - 1 个主容器和 2 个从容器。

pg-0 大师:

docker run --detach --name pg-0 \
--network my-network \
--env REPMGR_PARTNER_NODES=pg-0,pg-1,pg-2 \
--env REPMGR_NODE_NAME=pg-0 \
--env REPMGR_NODE_NETWORK_NAME=pg-0 \
--env REPMGR_PRIMARY_HOST=pg-0 \
--env REPMGR_PASSWORD=repmgrpass \
--env POSTGRESQL_PASSWORD=secretpass \
bitnami/postgresql-repmgr:latest

pg-1 从机:

docker run --detach --name pg-1 \
--network my-network \
--env REPMGR_PARTNER_NODES=pg-0,pg-1,pg-2 \
--env REPMGR_NODE_NAME=pg-1 \
--env REPMGR_NODE_NETWORK_NAME=pg-1 \
--env REPMGR_PRIMARY_HOST=pg-0 \
--env REPMGR_PASSWORD=repmgrpass \
--env POSTGRESQL_PASSWORD=secretpass \
bitnami/postgresql-repmgr:latest

pg-2 奴隶:

docker run --detach --name pg-2 \
--network my-network \
--env REPMGR_PARTNER_NODES=pg-0,pg-1,pg-2 \
--env REPMGR_NODE_NAME=pg-2 \
--env REPMGR_NODE_NETWORK_NAME=pg-2 \
--env REPMGR_PRIMARY_HOST=pg-0 \
--env REPMGR_PASSWORD=repmgrpass \
--env POSTGRESQL_PASSWORD=secretpass \
bitnami/postgresql-repmgr:latest

容器之间的复制工作正常,如果我停止 master pg-0然后 pg-1\​​ pg-2 接管成为 master。

我的问题是,如果我在连接到 db pg-0 master 的不同容器上有 python 应用程序master换成pg-1或者pg-2怎么办?我不希望数据库连接尝试连接到所有 3 个服务器,我相信有更好的方法。

我从 python 应用程序连接的方式是使用容器名称 - host =pg-0当 db master 主机名容器更改时怎么办?

编辑:这是我在 API 中尝试的

>>> psycopg2.connect(host="db-0, db-1", user="user", password="password", database="data")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python3.7/site-packages/psycopg2/__init__.py", line 126, in connect
conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
psycopg2.OperationalError: could not translate host name "db-0, db-1" to address: Temporary failure in name resolution

我的包是psycopg2-2.8.4,用的是python3.7

最佳答案

通过安装解决了问题:

pip3 install postgres

然后命令:

psycopg2.connect(host="db-0, db-1", user="user", password="password", database="data")

工作正常,但如果主机首先关闭,则不会真正路由到下一个主机。这是我的解决方法:

它循环查询所有的db容器,如果其中一个db在SELECT pg_is_in_recovery();查询返回False,那么说明它是master。

所以我所有的插入/删除/更新查询都在一个函数中转到这个。 (def db_master),以及所有其他“选择”查询进入仅检查连接的不同函数中的相同循环。 (def db):

import psycopg2

hosts = ["db-0", "db-1"]

for i in hosts:
conn = psycopg2.connect(
dbname='data', user='user', host=i, password='password')
cur = conn.cursor()
cur.execute("SELECT pg_is_in_recovery();")
result = cur.fetchall()[0][0]
if result is False:
master = i
conn = psycopg2.connect(
dbname='data', user='user', host=master, password='password')

关于python-3.x - PostgreSQL repmgr 向何处发送查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58526404/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com