PostgreSQL/Cluster: различия между версиями
Нет описания правки |
м (GordeevMaksim переименовал страницу ALT Linux Wiki:PostgreSQL/Cluster в PostgreSQL/Cluster) |
||
(не показаны 24 промежуточные версии этого же участника) | |||
Строка 1: | Строка 1: | ||
{{stub}} | {{stub}} | ||
= Конфигурация стенда = | |||
<source> | <source lang="text"> | ||
alt-node-1 192.168.170.40/24 | alt-node-1 192.168.170.40/24 | ||
alt-node-2 192.168.170.41/24 | alt-node-2 192.168.170.41/24 | ||
alt-node-3 192.168.170.42/24 | alt-node-3 192.168.170.42/24 | ||
</source> | </source> | ||
<source> | <source lang="text"> | ||
master 192.168.170.32/24 | master 192.168.170.32/24 | ||
</source> | </source> | ||
Строка 16: | Строка 16: | ||
Дальнейшие операции должны быть выполнены для каждой ноды кластера. | Дальнейшие операции должны быть выполнены для каждой ноды кластера. | ||
<source> | <source lang="sh"> | ||
cat >> /var/resolv/etc/hosts << EOF | cat >> /var/resolv/etc/hosts << EOF | ||
192.168.170.40 alt-node-1 | 192.168.170.40 alt-node-1 | ||
Строка 24: | Строка 24: | ||
</source> | </source> | ||
= Важные требования (типичные фиксы) = | |||
1. Часы у нод кластера должны идти правильно и синхронно | 1. Часы у нод кластера должны идти правильно и синхронно | ||
Строка 36: | Строка 36: | ||
Команда исправления: | Команда исправления: | ||
<source lang="sh"> | <source lang="sh"> | ||
rm /etc/ | rm /etc/hosts && ln -v /var/resolv/etc/hosts /etc/hosts; | ||
</source> | |||
= Установка пакетов базы данных = | |||
<source lang="sh"> | |||
apt-get update && apt-get install postgresql13 postgresql13-server postgresql13-contrib; | |||
</source> | |||
= Необходимое исправления для работоспособности PosgreSQL = | |||
<source lang="sh"> | |||
usermod --home '/var/lib/pgsql' --shell '/bin/sh' postgres; | |||
</source> | </source> | ||
= | = Установка пакетов кластера = | ||
<source lang="sh"> | <source lang="sh"> | ||
apt-get update && apt-get install pacemaker pcs fence-agents-virsh resource-agents-paf corosync resource-agents; | |||
</source> | |||
= Примерная настройка кластера = | |||
== Установка пароля для пользователя hacluster == | |||
<source lang="sh"> | |||
passwd hacluster | |||
<source lang="sh">passwd hacluster</source> | </source> | ||
Пароль: <code>hacluster</code> | Пароль: <code>hacluster</code> | ||
== Включение демона == | |||
<source lang="sh">systemcctl enable --now pcsd</source> | <source lang="sh"> | ||
systemcctl enable --now pcsd; | |||
<source lang="sh">pcs cluster destroy --all;</source> | </source> | ||
== Разрушить кластер == | |||
<source lang="">systemctl enable --now corosync.service pacemaker.service</source> | <source lang="sh"> | ||
pcs cluster destroy --all; | |||
</source> | |||
<source lang="sh">pcs host auth -u hacluster alt-node-1 alt-node-2 alt-node-3;</source> | == Добавить сервисы кластера в автозапуск == | ||
<source lang="sh"> | |||
systemctl enable --now corosync.service pacemaker.service | |||
</source> | |||
== Сборка нод в кластер == | |||
=== Аутентификация на нодах кластера === | |||
<source lang="sh"> | |||
pcs host auth -u hacluster alt-node-1 alt-node-2 alt-node-3; | |||
</source> | |||
пароль для пользователя <code>hacluster</code>, который использован ранее:<code>hacluster</code> | пароль для пользователя <code>hacluster</code>, который использован ранее:<code>hacluster</code> | ||
=== Сборка нод в кластер === | |||
<source lang="sh"> | <source lang="sh"> | ||
pcs cluster setup \ | pcs cluster setup \ | ||
Строка 70: | Строка 88: | ||
transport udpu; | transport udpu; | ||
</source> | </source> | ||
=== Запуск кластера === | |||
<source lang="sh">pcs cluster start --all --wait=60;</source> | <source lang="sh"> | ||
pcs cluster start --all --wait=60; | |||
<source lang="sh">pcs status --full;</source> | </source> | ||
=== Просмотр полного статуса кластера === | |||
<source lang="sh">pcs cluster enable --all;</source> | <source lang="sh"> | ||
pcs status --full; | |||
<source lang="sh">corosync-cmapctl | grep members;</source> | </source> | ||
=== Включить кластер === | |||
<source lang="sh"> | |||
pcs cluster enable --all; | |||
</source> | |||
=== Просмотр статуса участников кластера === | |||
<source lang="sh"> | |||
corosync-cmapctl | grep members; | |||
</source> | |||
= Настройка HA cluster PostgreSQL = | |||
== Временное отключение кластеризации для начальной настройки == | |||
<source lang="sh"> | <source lang="sh"> | ||
pcs property set stonith-enabled=false; | pcs property set stonith-enabled=false; | ||
pcs property set symmetric-cluster=false; | pcs property set symmetric-cluster=false; | ||
</source> | </source> | ||
== Инициализация базы данных == | |||
Работы '''только''' на <code>alt-node-1</code> | Работы '''только''' на <code>alt-node-1</code> | ||
<source lang="sh">/etc/init.d/postgresql initdb;</source> | <source lang="sh"> | ||
<source lang="sh">cat >> /var/lib/pgsql/data/postgresql.conf << EOF | /etc/init.d/postgresql initdb; | ||
</source> | |||
<source lang="sh"> | |||
cat >> /var/lib/pgsql/data/postgresql.conf << EOF | |||
listen_addresses = '*' | listen_addresses = '*' | ||
primary_conninfo = 'host=192.168.170.32 port=5432 user=repli application_name=altserver1' | primary_conninfo = 'host=192.168.170.32 port=5432 user=repli application_name=altserver1' | ||
wal_keep_size = 100 | wal_keep_size = 100 | ||
max_wal_senders = 10 | max_wal_senders = 10 | ||
EOF</source> | EOF | ||
</source> | |||
<source lang="sh"> | <source lang="sh"> | ||
Строка 100: | Строка 130: | ||
host replication all 0.0.0.0/0 trust | host replication all 0.0.0.0/0 trust | ||
host all all 0.0.0.0/0 trust | host all all 0.0.0.0/0 trust | ||
EOF</source> | EOF | ||
</source> | |||
<source lang="sh">ip addr add 192.168.170.32/24 dev ens192</source> | <source lang="sh"> | ||
ip addr add 192.168.170.32/24 dev ens192; | |||
</source> | |||
<source lang="sh">systemctl start postgresql; sleep 5; systemctl status postgresql</source> | <source lang="sh"> | ||
systemctl start postgresql; sleep 5; systemctl status postgresql; | |||
</source> | |||
Создать учетную запись <code>hacluster</code> с паролем <code>hacluster</code> (для PostgreSQL) | Создать учетную запись <code>hacluster</code> с паролем <code>hacluster</code> (для PostgreSQL) | ||
<source lang="sh"> | <source lang="sh"> | ||
createuser -U postgres repli -P --replication | createuser -U postgres repli -P --replication; | ||
</source> | </source> | ||
Строка 118: | Строка 153: | ||
<source lang="sh"> | <source lang="sh"> | ||
chown postgres: ~postgres/.pgpass && chmod 600 ~postgres/.pgpass | chown postgres: ~postgres/.pgpass && chmod 600 ~postgres/.pgpass; | ||
</source> | |||
== Создание реплик == | |||
Работы '''только''' на <code>alt-node-2</code> и <code>alt-node-3</code> | |||
<source lang="sh"> | |||
su - postgres -s /bin/sh -c 'pg_basebackup --host 192.168.170.32 --username repli --pgdata /var/lib/pgsql/data/ --progress'; | |||
</source> | |||
== Подготовка к кластеризации == | |||
<source lang="sh"> | |||
sed -e "s/\(primary_conninfo = .* application_name=\).*'/\1$(hostname -s)'/" -i /var/lib/pgsql/data/postgresql.conf; | |||
sed -e "s/\(altserver1\)\(\s*reject\)/$(hostname -s)\2/" -i /var/lib/pgsql/data/pg_hba.conf; | |||
touch /var/lib/pgsql/data/standby.signal; | |||
chown postgres:postgres -R /var/lib/pgsql; | |||
</source> | |||
<source lang="sh"> | |||
systemctl start postgresql; sleep 5; systemctl status postgresql; | |||
</source> | |||
== Проверка статуса реплик == | |||
на '''только''' на <code>alt-node-1</code> | |||
<source lang="sh"> | |||
psql -U postgres -xc "TABLE pg_stat_replication"; | |||
</source> | |||
== Отключение автозапуска сервиса PostgreSQL == | |||
на '''всех''' трех нодах ( <code>alt-node-1</code> <code>alt-node-2</code> <code>alt-node-3</code>) | |||
<source lang="sh"> | |||
systemctl disable --now postgresql; | |||
</source> | |||
== Убрать временно назначенный master IP == | |||
на '''только''' на <code>alt-node-1</code> | |||
<source lang="sh"> | |||
ip addr del 192.168.170.32/24 dev ens192 | |||
</source> | |||
= Настройка ресурсов кластера = | |||
<source lang="sh"> | |||
pcs property set stonith-enabled=false ; | |||
pcs property set symmetric-cluster=false ; | |||
pcs resource create \ | |||
pgsql ocf:heartbeat:pgsql \ | |||
master_ip='192.168.170.32' \ | |||
node_list='alt-node-1 alt-node-2 alt-node-3' \ | |||
rep_mode='sync' \ | |||
restart_on_promote='false' \ | |||
pgctl='/usr/bin/pg_ctl' \ | |||
pgdata='/var/lib/pgsql/data' \ | |||
psql'=/usr/bin/psql'; | |||
pcs resource promotable pgsql \ | |||
promoted-max=1 \ | |||
promoted-node-max=1 \ | |||
target-role=Started \ | |||
clone-max=3 \ | |||
clone-node-max=1 \ | |||
notify=true; | |||
pcs resource create \ | |||
vip-master ocf:heartbeat:IPaddr2 \ | |||
ip=192.168.170.32 cidr_netmask=24 nic=ens192; | |||
pcs resource group \ | |||
add master-group \ | |||
vip-master; | |||
pcs constraint colocation \ | |||
add master pgsql-clone \ | |||
with master-group; | |||
pcs constraint order \ | |||
promote pgsql-clone \ | |||
then \ | |||
start master-group \ | |||
symmetrical=false \ | |||
score=INFINITY; | |||
pcs constraint order \ | |||
demote pgsql-clone \ | |||
then stop master-group \ | |||
symmetrical=false \ | |||
score=0; | |||
pcs property set \ | |||
symmetric-cluster=true; | |||
</source> | </source> | ||
== Принудительный отладочный "промоут" == | |||
<source lang="sh"> | |||
pcs resource debug-promote pgsql; | |||
</source> | |||
== Просмотр полного статуса кластера == | |||
<source lang="sh"> | |||
pcs status --full; | |||
</source> | |||
= Документация = | |||
* [https://clusterlabs.org/pacemaker/doc/ Pacemaker] - Официальная документация | |||
* [https://wiki.clusterlabs.org/wiki/PgSQL_Replicated_Cluster PgSQL Replicated Cluster] - Пример настройки HA cluster PostgreSQL | |||
* [https://wiki.clusterlabs.org/wiki/PostgresHowto Postgres Howto] - еще один пример настройки | |||
[[Категория:СУБД]] | |||
{{Category navigation|title=HOWTO|category=HOWTO|sortkey={{SUBPAGENAME}}}} |
Текущая версия от 15:28, 7 апреля 2023
Конфигурация стенда
alt-node-1 192.168.170.40/24
alt-node-2 192.168.170.41/24
alt-node-3 192.168.170.42/24
master 192.168.170.32/24
IP-адреса нод кластера; alt-node-1
, alt-node-2
, alt-node-3
;
IP-адрес который назначается "мастер-ноде" кластера БД: master
;
Дальнейшие операции должны быть выполнены для каждой ноды кластера.
cat >> /var/resolv/etc/hosts << EOF
192.168.170.40 alt-node-1
192.168.170.41 alt-node-2
192.168.170.42 alt-node-3
EOF
Важные требования (типичные фиксы)
1. Часы у нод кластера должны идти правильно и синхронно
Команда синхронизации часов:
ntpdate -s pool.ntp.org;
2. /etc/hosts
должен быть hardlink`ом на /var/resolv/etc/hosts
Команда исправления:
rm /etc/hosts && ln -v /var/resolv/etc/hosts /etc/hosts;
Установка пакетов базы данных
apt-get update && apt-get install postgresql13 postgresql13-server postgresql13-contrib;
Необходимое исправления для работоспособности PosgreSQL
usermod --home '/var/lib/pgsql' --shell '/bin/sh' postgres;
Установка пакетов кластера
apt-get update && apt-get install pacemaker pcs fence-agents-virsh resource-agents-paf corosync resource-agents;
Примерная настройка кластера
Установка пароля для пользователя hacluster
passwd hacluster
Пароль: hacluster
Включение демона
systemcctl enable --now pcsd;
Разрушить кластер
pcs cluster destroy --all;
Добавить сервисы кластера в автозапуск
systemctl enable --now corosync.service pacemaker.service
Сборка нод в кластер
Аутентификация на нодах кластера
pcs host auth -u hacluster alt-node-1 alt-node-2 alt-node-3;
пароль для пользователя hacluster
, который использован ранее:hacluster
Сборка нод в кластер
pcs cluster setup \
sng-cluster \
alt-node-1 addr=$(grep alt-node-1 /etc/hosts | cut -d ' ' -f 1) \
alt-node-2 addr=$(grep alt-node-2 /etc/hosts | cut -d ' ' -f 1) \
alt-node-3 addr=$(grep alt-node-3 /etc/hosts | cut -d ' ' -f 1) \
transport udpu;
Запуск кластера
pcs cluster start --all --wait=60;
Просмотр полного статуса кластера
pcs status --full;
Включить кластер
pcs cluster enable --all;
Просмотр статуса участников кластера
corosync-cmapctl | grep members;
Настройка HA cluster PostgreSQL
Временное отключение кластеризации для начальной настройки
pcs property set stonith-enabled=false;
pcs property set symmetric-cluster=false;
Инициализация базы данных
Работы только на alt-node-1
/etc/init.d/postgresql initdb;
cat >> /var/lib/pgsql/data/postgresql.conf << EOF
listen_addresses = '*'
primary_conninfo = 'host=192.168.170.32 port=5432 user=repli application_name=altserver1'
wal_keep_size = 100
max_wal_senders = 10
EOF
cat >> /var/lib/pgsql/data/pg_hba.conf << EOF
host replication all $(hostname -s) reject
host replication all 127.0.0.0/8 reject
host replication all 0.0.0.0/0 trust
host all all 0.0.0.0/0 trust
EOF
ip addr add 192.168.170.32/24 dev ens192;
systemctl start postgresql; sleep 5; systemctl status postgresql;
Создать учетную запись hacluster
с паролем hacluster
(для PostgreSQL)
createuser -U postgres repli -P --replication;
cat > ~postgres/.pgpass << EOF
192.168.170.32:5432:replication:repli:hacluster
EOF
chown postgres: ~postgres/.pgpass && chmod 600 ~postgres/.pgpass;
Создание реплик
Работы только на alt-node-2
и alt-node-3
su - postgres -s /bin/sh -c 'pg_basebackup --host 192.168.170.32 --username repli --pgdata /var/lib/pgsql/data/ --progress';
Подготовка к кластеризации
sed -e "s/\(primary_conninfo = .* application_name=\).*'/\1$(hostname -s)'/" -i /var/lib/pgsql/data/postgresql.conf;
sed -e "s/\(altserver1\)\(\s*reject\)/$(hostname -s)\2/" -i /var/lib/pgsql/data/pg_hba.conf;
touch /var/lib/pgsql/data/standby.signal;
chown postgres:postgres -R /var/lib/pgsql;
systemctl start postgresql; sleep 5; systemctl status postgresql;
Проверка статуса реплик
на только на alt-node-1
psql -U postgres -xc "TABLE pg_stat_replication";
Отключение автозапуска сервиса PostgreSQL
на всех трех нодах ( alt-node-1
alt-node-2
alt-node-3
)
systemctl disable --now postgresql;
Убрать временно назначенный master IP
на только на alt-node-1
ip addr del 192.168.170.32/24 dev ens192
Настройка ресурсов кластера
pcs property set stonith-enabled=false ;
pcs property set symmetric-cluster=false ;
pcs resource create \
pgsql ocf:heartbeat:pgsql \
master_ip='192.168.170.32' \
node_list='alt-node-1 alt-node-2 alt-node-3' \
rep_mode='sync' \
restart_on_promote='false' \
pgctl='/usr/bin/pg_ctl' \
pgdata='/var/lib/pgsql/data' \
psql'=/usr/bin/psql';
pcs resource promotable pgsql \
promoted-max=1 \
promoted-node-max=1 \
target-role=Started \
clone-max=3 \
clone-node-max=1 \
notify=true;
pcs resource create \
vip-master ocf:heartbeat:IPaddr2 \
ip=192.168.170.32 cidr_netmask=24 nic=ens192;
pcs resource group \
add master-group \
vip-master;
pcs constraint colocation \
add master pgsql-clone \
with master-group;
pcs constraint order \
promote pgsql-clone \
then \
start master-group \
symmetrical=false \
score=INFINITY;
pcs constraint order \
demote pgsql-clone \
then stop master-group \
symmetrical=false \
score=0;
pcs property set \
symmetric-cluster=true;
Принудительный отладочный "промоут"
pcs resource debug-promote pgsql;
Просмотр полного статуса кластера
pcs status --full;
Документация
- Pacemaker - Официальная документация
- PgSQL Replicated Cluster - Пример настройки HA cluster PostgreSQL
- Postgres Howto - еще один пример настройки