Репликация — механизм синхронизации бд с ее копиями
Имеется 2 вида репликации
Синхронная репликация
Существует лишь одна версия данных на серверах
Недостатком обновления реплик является повышенная нагрузка при выполнении транзакций
Возможны проблемы с доступностью данных
Асинхронная репликация
Обновления реплик распространяются в промежутке времени, а не в рамках транзакции
Т.е. происходит задержка, в течение которой реплики становятся идентичными
В течении этого промежутка может наблюдаться рассинхрон данных на репликах
Журнал транзакций
При выполнении обработки команды, изменяющей данные в БД, PostgreSQL записывает данные на диск
Это необходимо для сохранения в случае отказа
Посмотреть директорию сервера:
$ psql
postgres=# show all;
postgres=# show data_directory;
Идентичные данные записываются в 2 места:
Файлы данных например в /var/lib/postgresql/<version>/main/base (таблицы, индексы, временные таблицы и др.)
Журнал транзакций например в /var/lib/postgresql/<version>/main/pg_wal (информация о последних изменениях)
Потоковая репликация (Streaming Replication)
Работает поверх трансляции журналов или без трансляции журналов
Дает возможность непрерывно отправлять и применять WAL записи на slave-сервера для создания копии master
Простой, надежный, используется в большинстве высоконагруженных приложений
Поддерживает асинхронный или синхронный механизмы репликации
По умолчанию репликация асинхронная
Нюансы:
репликация только всего инстанса PostgreSQL
master может обслуживать большое количество slave ввиду минимальной нагрузки
нельзя реплицировать определенную БД
Пример настройки
Разрешить порт postgres 5432 с мастера для репликации:
$ sudo firewall-cmd --permanent --zone=trusted --add-source=192.168.1.10/32
$ sudo firewall-cmd --permanent --zone=trusted --add-port=5432/tcp
$ sudo firewall-cmd --reload
Создим роль для репликации:
postgres=# CREATE USER walstreamer REPLICATION;
Мастер 192.168.1.10
$ vi /var/lib/pgsql/13/data/pg_hba.conf
...
local replication all peer
host replication all 127.0.0.1/32 scram-sha-256
host replication all ::1/128 scram-sha-256
host replication postgres 192.168.1.15/32 trust
host replication walstreamer 192.168.1.15/32 trust
Пример настройки, в файле найдете комментарии к опциям:
$ vi /var/lib/pgsql/13/data/postgresql.conf
...
listen_addresses = '*'
logging_collector = on
log_directory = '/var/log'
log_filename = 'postgresql.log'
log_rotation_size = 300MB
client_min_messages = notice
log_min_messages = warning
log_min_error_statement = error
log_checkpoints = on
log_connections = on
log_disconnections = on
log_hostname = on
log_line_prefix = '%t'
wal_level = replica
wal_log_hints = on
max_wal_senders = 5
max_replication_slots = 1
wal_keep_size = 100
archive_mode = on
hot_standby = on
...
Самостоятельно прочитайте и поймите, за что отвечают опции выше
Создадим log_filename и дадим права пользователю postgres:
$ touch /var/log/postgresql.log
$ chmod a-r,u+r /var/log/postgresql.log
$ chown postgres:postgres /var/log/postgresql.log
$ vi /var/lib/pgsql/13/data/pg_hba.conf
...
local replication all peer
host replication all 127.0.0.1/32 scram-sha-256
host replication all ::1/128 scram-sha-256
host replication postgres 192.168.1.10/32 trust
host replication walstreamer 192.168.1.10/32 trust
Создание точной копии с master на slave с помощью pg_basebackup:
$ pg_basebackup -h 192.168.1.10 -U postgres -p 5432 -D /var/lib/pgsql/13/backups -Fp -Xs -P -R
Файл standby.signal должен существовать в резервном каталоге данных
Определяет состояние сервера как slave, создается автоматически, если указана опция -R
Узнать состояние репликации:
$ psql -c "SELECT * from pg_stat_replication";
$ psql -c "SELECT * from pg_stat_database_conflicts";
Комментарии пользователей
Эту новость ещё не комментировалиНаписать комментарий
Анонимам нельзя оставоять комментарии, зарегистрируйтесь!