PostgreSQL
September 8, 2022

Добавить реплику кластеру

Для повышения надёжности работы кластера необходимо иметь как минимум одну реплику. В случае обновления мастера или каких-то проблем с мастером происходит либо switchover, либо failover.

Switchover - это мягкое переключение мастера. Мастером становится одна из реплик. А текущий мастер становится репликой. Это управляемый человеком процесс. Производится, например, в случае обновления кластера. Или проектируемого вывода из эксплуатации ВМ, на которой крутится мастер.

Failover - это аварийное переключение мастера. Происходит по многим причинам. Например, в случае:

  • Аппаратных сбоев;
  • Мастер недоступен из-за нагрузки на CPU/RAM.
  • И много других причин...

Тема работы реплики и мастера довольно объёмная поэтому здесь её не рассматриваем. В этой небольшой статье просто добавим реплику в кластер.

Поехали!

Сейчас у нас есть только один хост в кластере и это MASTER:

export POSTGRES=$(yc postgresql cluster get cam-postgres --format=json | jq -r ".id")
export HOST=$(yc postgresql hosts list --cluster-id $POSTGRES --format=json | jq ".[].name" | cut -b 2-42)
export ZONE=ru-central1-b
export SUBNET_ID=$(yc vpc subnet get subnet-b --format json | jq -r '.id')
yc postgresql hosts list --cluster-id $POSTGRES
+-------------------------------------------+----------------------+--------+--------+---------------+-----------+--------------------+
|                   NAME                    |      CLUSTER ID      |  ROLE  | HEALTH |    ZONE ID    | PUBLIC IP | REPLICATION SOURCE |
+-------------------------------------------+----------------------+--------+--------+---------------+-----------+--------------------+
| HOST                                      | POSTGRES             | MASTER | ALIVE  | ru-central1-a | false     |                    |
+-------------------------------------------+----------------------+--------+--------+---------------+-----------+--------------------+

Добавим второй хост, который будет репликой.

yc postgresql host add \
  --cluster-id $POSTGRES \
  --host zone-id=$ZONE,subnet-id=$SUBNET_ID,assign-public-ip,priority=10 \
  --async

Второй хост будет расположен в другой зоне доступности. В зоне ru-central1-b. Это увеличивает отказоустойчивость системы на предмет недоступности одной из зон доступности. Но накладывает дополнительные задержки по сети.
Приоритет обозначает вес реплики. Чем больше вес, тем больше шансов, что именно эта реплика станет мастером. Наименьший приоритет — 0 (по умолчанию), наивысший — 100.
Также на реплику установлен внешний адрес.

Полезные ссылки.

Создали кластер здесь: https://teletype.in/@cameda/Lheee0sIIqV
Информация о хосте кластера тут: https://teletype.in/@cameda/T-niZns6Y3Y
Тестовую БД взял отсюда: https://itdoxy.com/пример-базы-данных-postgresql/
Базу demo добавил тут: https://teletype.in/@cameda/tMfCh9jdzK-
Здесь выдал доп роли для пользователя cameda: https://teletype.in/@cameda/R5_8i_jmacK
Информация про реплики: https://cloud.yandex.ru/docs/managed-postgresql/concepts/replication