Если вы управляете базой данных на PostgreSQL и нуждаетесь в надёжной, масштабируемой репликации с минимальным временем отката, slon2.c, это то, что вам нужно. Этот модуль, часть системы SLON-I, позволяет реплицировать данные между узлами без полного дампа, с минимальным влиянием на производительность. Подходит для кластеров с до 16 узлами, работает с PostgreSQL 9.4 и новее. Все, что нужно, настроить логическое декодирование и запустить слоник-скрипты.
Даже если вы раньше работали с pg_dump или логическими репликациями через BDR, slon2.c остаётся одним из самых стабильных решений для средних и крупных систем. Главное, не забыть про параметр wal_level = logical, иначе все просто не заработает.
Что понадобится
- PostgreSQL версии 9.4 или выше
- Доступ к postgresql.conf и pg_hba.conf
- Установленный slonik (входит в состав SLON-I)
- Права суперпользователя в PostgreSQL
- Доступ к серверу через SSH (если настройка в удаленном окружении)
Настройка slon2.c: пошагово
- Убедитесь, что в postgresql.conf установлено wal_level = logical. Без этого логическое декодирование отключено. Перезапустите PostgreSQL после изменения.
- Включите подключение для репликации в pg_hba.conf. Добавьте строку вида:
host replication slon_user 192.168.1.100/32 md5
где 192.168.1.100, IP узла-реплики. Не забудьте перезагрузить конфиг. - Создайте пользователя для репликации. В psql выполните:
CREATE USER slon_user WITH REPLICATION PASSWORD 'strong_pass';
Создайте базу данных, которая будет реплицироваться. Имейте в виду: slon2.c не реплицирует DDL-изменения автоматически. Структура базы должна синхронизироваться вручную - Настройте слоник-скрипт. Пример минимального slonik-файла (slonik_setup.sql):
init cluster (id=1, name='main_cluster');
init node (id=1, name='node1', host='localhost', port=5432);
create node (id=2, name='node2', host='192.168.1.100', port=5432);
define replication (id=1, name='replication1', origin=1, destination=2);
Запустите:slonik -d postgres -U slon_user -H localhost < slonik_setup.sql - Запустите slon процесс на каждом узле. Команда:
slon -d postgres -U slon_user -H localhost -D 1
Убедитесь, что slon запущен в фоне. Проверьте логи: /var/log/postgresql/slon.log. - Настройте таблицы для репликации. В slonik-скрипте добавьте:
create subscription (id=1, origin=1, node=2, table='public.users');
Только явно перечисленные таблицы будут реплицироваться. Если забыть, данные не придут.
Вот прям: если вы пропустите шаг с wal_level = logical, ничего не заработает. Проверьте что он стоит именно в logical, а не replica. Один из самых частых сбоев, неправильная настройка pg_hba.conf. Проверяйте IP, порт, и что пользователь имеет права на подключение
Для тех, кто ищет альтернативу, slon5.oo или slon10.cc что лучше для просмотра сериала Оленька?, это не то же самое. Но если у вас есть вопросы по работе с другими слоновыми версиями, смотри там. А здесь, только чистая настройка.
Частые ошибки и советы
- Не поддерживает автоматическую обработку конфликтов. Если на двух узлах изменили одну и ту же строку, конфликт останется. Решайте вручную.
- Сеть падает, репликация останавливается. Нет автоматического переподключения. Проверяйте состояние через
slonik show status - Нельзя реплицировать схему автоматически. Если добавили новую таблицу, нужно добавить ее в слоник-скрипт вручную.
- Максимум 16 узлов в кластере. Превышение, ошибка при создании.
- Работает только на совместимых версиях PostgreSQL. Смешивание 10 и 13, не пройдет. Проверяйте совместимость протокола.
Если все настроено, проверьте, что данные приходят. Включите логирование в postgresql.conf:log_statement = 'mod'
и смотрите, что в логах появляется LOG: replication: replayed 1000 rows
Все, что нужно, сделать. Все что может пойти не так, устранить. Используйте slon2.c, если нужна надежная, контролируемая репликация на уровне таблиц. Это не волшебство, но, работает.
Чек-лист перед запуском
- ✅ wal_level = logical
- ✅ pg_hba.conf разрешает подключение
- ✅ slon_user с правами REPLICATION
- ✅ slonik-скрипт включает все нужные таблицы
- ✅ slon запущен на обоих узлах
Ну, и не забудьте, если что-то не работает, смотрите логи. Часто все просто в них
