Часть 1. Введение.
Часть 2. Репликация. Repmgr.
Часть 3. Auto-failover. Демоны repmgr.
Часть 4. Высокая доступность. Бэкапирование. Демоны repmgr. Barman.
Часть 5. Тестирование. Ansible. Вместо послесловия.
В этой части мы настроим мастер (db1) и резервный (db2) серверы репликации с использованием repmgr.
Для начала, создайте пользователя БД repmgr на сервере db1.
su - postgres createuser -s repmgr psql -c "alter user repmgr with password 'hdf456hw';" createdb repmgr -O repmgr psql -c 'alter user repmgr set search_path TO repmgr, "$user", public;'
Подготовьте экземпляры PostgreSQL для репликации. Добавьте следующие строки в конфиг на серверах db1 и db2./etc/postgresql/11/main/postgresql.conf
listen_addresses = '*' max_wal_senders = 5 wal_keep_segments = 5 wal_level = replica fsync = on wal_log_hints = on archive_mode = on archive_command = '/bin/true' hot_standby = on shared_preload_libraries = 'repmgr'
listen_addresses = ‘*’ позволяет прослушивать входящие соединения на всех адресах и интерфейсах, включая localhost и адрес OpenVPN сервера. Это означает, что сервер открыт для прослушивания соединений и из интернета. Это не критично для тестовой среды, потому что файл pg_hba ограничивает соединения к экземпляру по диапазонам IP. Но для рабочей среды это еще одна точка для DDOS, поэтому, пожалуйста, всегда используйте фаерволл, например iptables, и строго относитесь к прослушивающим интерфесам.
max_wal_senders = 5 устанавливает как много процессов отправки WAL может создасться. Нам нужно всего лишь два — один для резервного сервера и второй для сервера бэкапирования. Я устанавливаю 5 на случай, если мы захотим расширить кластер или один из процессов зависнет попахивает нелогичностью.
wal_keep_segments = 5 устанавливает как много старых, в данный момент ненужных WAL гарантированно хранится на сервере. Резервный сервер использует полный бэкап мастера плюс недостающие WAL(получаемые с мастера онлайн) для развертывания. Если ваша система находится под нагрузкой, нужно оставить немного для получения резервным.
wal_level = replica — записывает достаточно информации в WAL чтобы репликация запустилась.
fsync = on — гарантирует запись данных на диск при коммите.
wal_log_hints = on — в числе прочих, позволяет использовать утилиту pg_rewind для быстрого возврата сервера в строй.
archive_mode = on и archive_command = ‘/bin/true’ — включает архивирование WAL и просто удаляет WAL. Нам не нужно локальное архивирование WAL, т.к. мы вскоре настроим потоковую репликацию используя barman.
hot_standby = on — включает горячий режим резервного сервера.
Теперь нам нужно разрешить repmgr подключаться к экземплярам БД без пароля. Добавьте следующие строки в начало файла pg_hba.conf на серверах db1 и db2./etc/postgresql/11/main/pg_hba.conf
local replication repmgr md5 host replication repmgr 127.0.0.1/32 md5 host replication repmgr 10.8.1.1/32 md5 host replication repmgr 10.8.2.1/32 md5 local repmgr repmgr md5 host repmgr repmgr 127.0.0.1/32 md5 host repmgr repmgr 10.8.1.1/32 md5 host repmgr repmgr 10.8.2.1/32 md5
ВАЖНО. Repmgr — суперюзер. Не используйте метод авторизации trust, который представлен во многих инструкциях в интернете. Это небезопасно, т.к. любой пользователь ОС на представленных серверах сможет залогиниться без пароля и наворотить.
Перезапустите PostgreSQL.
systemctl restart postgresql
Добавьте файл pgpass на обоих серверах. Так repmgr сможет подключаться к БД без пароля.
su - postgres echo "*:*:*:repmgr:hdf456hw" > ~/.pgpass chmod 600 ~/.pgpass
Создайте конфиг repmgr на сервере db1./etc/repmgr.conf
node_id=1 node_name=db1 conninfo='host=10.8.1.1 user=repmgr dbname=repmgr connect_timeout=2' data_directory='/var/lib/postgresql/11/main' pg_bindir=/usr/lib/postgresql/11/bin/ service_start_command='sudo pg_ctlcluster 11 main start' service_stop_command='sudo pg_ctlcluster 11 main stop' service_restart_command='sudo pg_ctlcluster 11 main restart' service_reload_command='sudo pg_ctlcluster 11 main reload' log_facility=LOCAL0
Создайте конфиг repmgr на сервере db2./etc/repmgr.conf
node_id=2 node_name=db2 conninfo='host=10.8.2.1 user=repmgr dbname=repmgr connect_timeout=2' data_directory='/var/lib/postgresql/11/main' pg_bindir=/usr/lib/postgresql/11/bin/ service_start_command='sudo pg_ctlcluster 11 main start' service_stop_command='sudo pg_ctlcluster 11 main stop' service_restart_command='sudo pg_ctlcluster 11 main restart' service_reload_command='sudo pg_ctlcluster 11 main reload' log_facility=LOCAL0
Дистрибутивы на базе Debian используют утилиту pg_ctlcluster для контроля экземпляров PostgreSQL. Мы должны позволить юзеру postgres выполнять их без пароля. Добавьте следующий файл в sudoers./etc/sudoers.d/pg_sudoers
Defaults:postgres !requiretty postgres ALL = NOPASSWD: /usr/bin/pg_ctlcluster
Превратите db1 в мастер.
su - postgres repmgr -f /etc/repmgr.conf primary register
Проверьте, что db1 работает как мастер.
repmgr -f /etc/repmgr.conf cluster show
Превратите db2 в резервный сервер.
su - postgres sudo pg_ctlcluster 11 main stop rm -r /var/lib/postgresql/11/main #переместите, а не удаляйте, если нужно repmgr -h 10.8.1.1 -U repmgr -d repmgr -f /etc/repmgr.conf standby clone -F sudo pg_ctlcluster 11 main start repmgr standby register
Проверьте, что кластер репликации работает в норме.
repmgr -f /etc/repmgr.conf cluster show
Пока что репликация асинхронна. Мы сделаем её синхронной, когда установим barman.
Также, вам никто не мешает переключать серверы кластера вручную уже сейчас. Мы автоматизируем этот процесс в следующей части.