PostgreSQL repmgr, куда отправлять запросы - PullRequest
2 голосов
/ 23 октября 2019

Я использую Postgres 11.5 и докер. Я запустил 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

Репликация отлично работает между контейнерами, а также, если я остановлю мастер pg-0, тогда pg-1 \ ​​pg-2 займет место мастера.

Моя проблема в том,если у меня есть приложение python в другом контейнере, который подключается к мастеру db pg-0 Что мне делать, когда мастер меняется на pg-1 или pg-2? Я не хочу, чтобы соединение db пыталось соединиться со всеми 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

Ответы [ 2 ]

2 голосов
/ 30 октября 2019

Решил проблему, установив:

pip3 install postgres

, а затем команду:

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

Работал нормально, но на самом деле не маршрутизировал следующий хост, если сначала хост вышел из строя. Вот мой обходной путь:

Он запрашивает все контейнеры БД в цикле, и если один из БД возвращается в SELECT pg_is_in_recovery(); запросе False, то это означает, что это мастер.

Так что все мои запросы вставки / удаления / обновления идут к этому в функции. (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')
0 голосов
/ 23 октября 2019

Что мне делать, когда мастер меняется на pg-1 или pg-2?

Если ваше приложение python подключено к мастеру и мастер-остановкам, вы должны поймать соответствующее исключение ипереподключиться к новому хозяину. Я бы предложил добавить повторные попытки к попыткам повторного подключения, так как продвижение новых мастеров / ручное продвижение может занять некоторое время. Конечно, нужно добавить некоторую логику для обнаружения нового мастера в приложении, если ваша цель - подключиться только к мастеру.

Способ, которым я подключаюсь из приложения python, использует имя контейнера - хост= pg-0 Что делать, когда изменился главный контейнер имени хоста db?

Единственный случай изменения основного имени хоста контейнера, о котором я могу думать, это аварийный останов / остановка главного контейнера. Затем новый главный контейнер запускается, и приложение может подключиться к нему, как предложено выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...