PostgreSQL/Cluster: различия между версиями

Материал из ALT Linux Wiki
Нет описания правки
м (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/hostsln && -v /var/resolv/etc/hosts /etc/hosts;
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">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 lang="sh">
apt-get update && apt-get install pacemaker pcs fence-agents-virsh resource-agents-paf corosync resource-agents;
</source>


== Установка пакетов кластера ==
= Примерная настройка кластера =
<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">
=== Установка пароля для пользователя hacluster ===
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>
== Настройка HA cluster PostgreSQL ==
=== Включить кластер ===
=== Временное отключение кластеризации для начальной настройки ===
<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

Stub.png
Данная страница находится в разработке.
Эта страница ещё не закончена. Информация, представленная здесь, может оказаться неполной или неверной.

Конфигурация стенда

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;

Документация