PostgreSQL repmgr 向何处发送查询
PostgreSQL repmgr where to send queries
我正在使用 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
What do i do when the master is changing to pg-1 or pg-2?
如果您的 python 应用已连接到主控,而主控停止了,您应该捕获相关的异常并重新连接到新的主控。我建议添加重试以重新连接尝试,因为新主 election/manual 升级可能需要时间。当然,如果你的目标是只连接到master,还需要添加一些逻辑来检测应用中的新master。
The way i connect from python app is using the container name - host
=pg-0 What do to when db master host name container changed ?
我能想到的容器主主机名更改的唯一情况是主容器crash/stop。然后新的主容器启动,应用程序可能会按照上面的建议重新连接到它。
通过安装解决了问题:
pip3 install postgres
然后命令:
psycopg2.connect(host="db-0, db-1", user="user", password="password", database="data")
工作正常,但如果主机首先关闭,则没有真正路由到下一个主机。
这是我的解决方法:
它循环查询所有的db container,如果SELECT pg_is_in_recovery();
查询False
中的db returns之一,则表示它是master。
所以我所有的 insert/delete/update 查询都在一个函数中转到这个。 (def db_master
),以及所有其他 "select" 查询进入仅检查连接的不同函数中的相同循环。 (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')
我正在使用 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
What do i do when the master is changing to pg-1 or pg-2?
如果您的 python 应用已连接到主控,而主控停止了,您应该捕获相关的异常并重新连接到新的主控。我建议添加重试以重新连接尝试,因为新主 election/manual 升级可能需要时间。当然,如果你的目标是只连接到master,还需要添加一些逻辑来检测应用中的新master。
The way i connect from python app is using the container name - host =pg-0 What do to when db master host name container changed ?
我能想到的容器主主机名更改的唯一情况是主容器crash/stop。然后新的主容器启动,应用程序可能会按照上面的建议重新连接到它。
通过安装解决了问题:
pip3 install postgres
然后命令:
psycopg2.connect(host="db-0, db-1", user="user", password="password", database="data")
工作正常,但如果主机首先关闭,则没有真正路由到下一个主机。 这是我的解决方法:
它循环查询所有的db container,如果SELECT pg_is_in_recovery();
查询False
中的db returns之一,则表示它是master。
所以我所有的 insert/delete/update 查询都在一个函数中转到这个。 (def db_master
),以及所有其他 "select" 查询进入仅检查连接的不同函数中的相同循环。 (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')