首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PostgreSQL repmgr发送查询的位置

PostgreSQL repmgr发送查询的位置
EN

Stack Overflow用户
提问于 2019-10-23 15:32:52
回答 2查看 577关注 0票数 2

我用的是Postgres 11.5和码头。我已经启动了3个容器-一个主人和两个奴隶。

pg-0大师:

代码语言:javascript
复制
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奴隶:

代码语言:javascript
复制
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奴隶:

代码语言:javascript
复制
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

复制在容器之间运行良好,如果我停止主pg-0,那么pg-1 \ pg-2将接管主程序。

我的问题是,如果在连接到dbpg-0的不同容器上有python应用程序,那么当主程序更改为pg-1或pg-2时,怎么办?我不希望db连接试图连接到所有3台服务器,我相信还有更好的方法。

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

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

代码语言:javascript
复制
>>> 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

我的包裹是心理学2-2.8.4,使用python3.7

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-10-30 16:25:35

通过安装:

代码语言:javascript
复制
pip3 install postgres

然后命令:

代码语言:javascript
复制
psycopg2.connect(host="db-0, db-1", user="user", password="password", database="data")

工作良好,但没有真正路由到下一个主机,如果第一个主机是坏的。这是我的解决办法:

它在一个循环中查询所有db容器,如果其中一个db在SELECT pg_is_in_recovery();查询False中返回,则意味着它是主数据库。

因此,我所有的insert/delete/update查询都在一个函数中转到这个位置。(def db_master)和所有其他"select“查询转到不同函数中的同一个循环,该函数只检查连接。(def db):

代码语言:javascript
复制
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')
票数 2
EN

Stack Overflow用户

发布于 2019-10-23 16:28:49

当主人改变为pg-1或pg-2时,我该做什么?

如果您的python应用程序连接到主站和主站,您应该捕获相关的异常并重新连接到新的主服务器。我建议增加重试,以重新连接尝试,因为新的主选举/手动推广可能需要时间。当然,如果您的目标是只连接到master,则应该添加一些逻辑来检测应用程序中的新主人。

从python应用程序连接的方式是使用容器名称- host =pg-0,当db主主机名容器更改时,会做什么?

我能想到的容器主主机名更改的唯一情况是主容器崩溃/停止。然后,新的主容器上升,应用程序可以重新连接到上面建议的它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58526404

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档