Основы postgres
некоторая инфа по популярной бд
Репликация PostgreSQL представляет из себя способ реализации отказоустойчивого кластера. Инструкция написана на примере PostgreSQL 14, но она также будет работать для PostgreSQL более ранних версий (до 10).
Логическая репликация добавлена в PostgreSQL с версии 10. Она позволяет:
Для начала, готовим наши серверы к настройке кластера.
На всех серверах должна быть установлена PostgreSQL версии 10 и выше. Пример установки в инструкции PostgreSQL на CentOS.
При использовании брандмауэра, необходимо открыть TCP-порт 5432 — он используется сервером postgresql.
а) Если управление выполняется с помощью Firewalld:
firewall-cmd --permanent --add-port=5432/tcp
firewall-cmd --reload
б) Если используем Iptables:
iptables -I INPUT -p tcp --dport 5432 -j ACCEPT
Для сохранения правил можно использовать iptables-persistent:
apt install iptables-persistent
netfilter-persistent save
в) Если используем UFW:
ufw allow 5432/tcp
Если активирована система безопасности SELinux (по умолчанию в системах Red Hat / CentOS / Fedora), отключаем ее:
setenforce 0
sed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config
Если необходимо, чтобы SELinux работал, настраиваем его.
В данной статье мы будем настраивать серверы с IP-адресами 192.168.1.10(первичный или master) и 192.168.1.11 (вторичный или slave). Реплицировать будет базу с названием db_test.
Переходим на сервер, с которого будем реплицировать данные (мастер) и выполняем следующие действия.
Смотрим расположение конфигурационного файла postgresql.conf командой:
su - postgres -c "psql -c 'SHOW config_file;'"
В моем случае система вернула строку:
/var/lib/pgsql/14/data/postgresql.conf
Открываем конфигурационный файл postgresql.conf.
vi /var/lib/pgsql/14/data/postgresql.conf
* мы открываем файл, который получили sql-командой SHOW config_file;.
Редактируем следующие параметры:
listen_addresses = 'localhost, 192.168.1.10'
...
wal_level = logical
* где
Смотрим расположение конфигурационного файла pg_hba.conf:
su - postgres -c "psql -c 'SHOW hba_file;'"
В моем случае ответ такой:
/var/lib/pgsql/14/data/pg_hba.conf
Открываем его:
vi /var/lib/pgsql/14/data/pg_hba.conf
Добавляем строки:
host db_test postgres 192.168.1.11/32 trust
host postgres postgres 192.168.1.11/32 trust
* данной настройкой мы разрешаем подключение к базам данных postgresи db_test пользователю postgres с сервера 192.168.1.11.
Перезапускаем службу postgresql:
systemctl restart postgresql
Обратите внимание, что название для сервиса в системах Linux может различаться, например:
systemctl restart postgresql-14
Мастер настроен — переходим к вторичному серверу.
Смотрим расположение конфигурационного файла postgresql.conf командой:
su - postgres -c "psql -c 'SHOW config_file;'"
Открываем конфигурационный файл postgresql.conf.
vi /var/lib/pgsql/14/data/postgresql.conf
* мы открываем файл, который получили sql-командой SHOW config_file;.
Редактируем параметр wal_level:
wal_level = logical
Перезапускаем службу postgresql:
systemctl restart postgresql
Обратите внимание, что название для сервиса в системах Linux может различаться, например:
systemctl restart postgresql-14
Входим под пользователем postgres:
su - postgres
Реплицируем на вторичный сервер базы postgres и db_test:
$ pg_dumpall --database=postgres --host=192.168.1.10 --no-password --globals-only --no-privileges | pg_dump --dbname db_test --host=192.168.1.10 --no-password --create --schema-only | psql
Вторичный сервер готов к репликации.
Теперь настраиваем логику. На стороне мастера мы создаем публикацию, а на стороне слейва — подписку. Рассмотрим пример.
Заходим в postgresql и подключаемся к базе db_test:
su - postgres -c "psql db_test"
Создадим публикацию базы:
=# CREATE PUBLICATION db_test_pub FOR ALL TABLES;
* мы создали публикацию с названием db_test_pub для базы db_test (мы к ней подключены) и всех таблиц.
Если нам нужно создать подписку для некоторых таблиц, то вводим:
=# CREATE PUBLICATION db_test_pub FOR TABLE users, objects, projects;
* в данном примере мы сделаем публикацию для базы db_test и таблиц users, objects, projects.
Идем на слейв.
Заходим в postgresql:
psql
И подключаемся к базе:
=# \c db_test
Создаем подписку:
=# CREATE SUBSCRIPTION db_test_sub CONNECTION 'host=192.168.1.10 dbname=db_test' PUBLICATION db_test_pub;
* где:
Убедимся, что репликация работает. Статус работы репликации можно посмотреть следующими командами.
а) На мастере:
=# SELECT * FROM pg_stat_replication;
А данной командой можно посмотреть настройки публикации:
=# \dRp+
Чтобы увидеть задержки, используем запрос:
=# SELECT slot_name, confirmed_flush_lsn, pg_current_wal_lsn(), (pg_current_wal_lsn() - confirmed_flush_lsn) AS lsn_distance FROM pg_replication_slots;
* значение lsn_distance — показатель задержки. Чем оно меньше, тем лучше.
б) На слейве:
=# SELECT * FROM pg_stat_subscription;
Сведения о подписке смотрим командой:
=# \dRs+
Рассмотрим некоторые команды, которые могут оказаться полезными.
1. Удалить публикацию.
Для удаления публикации используем команду:
=# DROP PUBLICATION <имя публикации>
Например:
=# DROP PUBLICATION db_test_pub;
2. Обновить публикацию.
Обновить публикацию можно с помощью команды:
=# ALTER PUBLICATION <имя публикации>
Например:
=# ALTER PUBLICATION db_test_pub ADD TABLE builds;
* в данном примере мы добавили к публикации таблицу builds.