Репликация В Postgresql 8.X: Упрощаем Работу Со Slony



Предисловие Добрый день.

Так исторически сложилось, что Postgresql из коробки 8-я ветка (а светлое будущее с 9-й веткой в стабильной еще не наступило) не имеет системы репликации.

Поэтому для этих целей был написан внешний инструмент — Slony1.



Как это работает

.

Работает это довольно просто: демон slon подключается к серверу Postgresql, цепляется за триггеры и ждет, пока произойдет какое-то событие, изменяющее содержимое базы данных.

Еще есть slonik — утилита настройки, использующая конфиги в STDIN и несколько других управляющих утилит для различных целей.

В рамках репликации, когда речь идет о Postgresql, обычно используются следующие термины:

  • Узел — это пара сервер-база.

    То есть, например, если у вас несколько баз данных, участвующих в репликации на одном сервере, это не один узел, а несколько.

  • Кластер — это группа узлов.

    Здесь, я считаю, все просто: хозяин и раб(ы).

  • Таблицы – здесь все еще проще.

    :)

  • Последовательности — это счетчики таблиц.

  • Сеты – набор столов и прилавков.

    Для каждой базы создается отдельный набор.

После успешной настройки Slony создает в базе данных, подлежащей репликации, схему _cluster (где «кластер» — имя кластера, указанное в конфиге), а в ней несколько его таблиц.

Назначение таблиц можно найти в выключенный.

документация или с помощью psql. Так что если вдруг в процессе настройки вы столкнетесь с трудностями, а после перезагрузки получите сообщение типа «данный узел/кластер/таблица уже есть в списке», возможно, вас спасет сброс схемы.

Также необходимо знать, что репликации подлежат только те таблицы, которые имеют первичный ключ.

Главная неприятная особенность слона, для меня, заключалась в том, что он не умеет делать реплику всех таблиц в базе данных — обязательно нужно перечислять одну за другой.

Когда в вашей базе данных > 50 таблиц, написание конфигов становится чрезвычайно утомительной задачей.

Для этих целей я написал скрипт, размещенный ниже.

Самые любознательные из вас наверняка видели подобные манасы и, возможно, думают, что этот пост — очередной дубль.

Нет это не правда.

Вся мана, которую я видел, предлагала скормить конфиг напрямую в слоник через STDIN. При таком подходе система будет работать, но (по крайней мере, в случае с Debian/Ubuntu) возникнут две проблемы:

  1. скрипт инициализации не будет работать
  2. Вспомогательные утилиты Elephant работать не будут.
Правильный подход — сохранить Perl-подобную конфигурацию в /etc/slony1/slon_tools.conf (пример можно найти в ls /usr/share/doc/slony1-bin/examples/slon_tools.conf-sample.gz), а в /etc/default/slony1 — номера узлов, которые живут на этой машине и будут запускаться скриптом инициализации.

Как я уже говорил, первый конфиг представляет собой Perl-скрипт и входит в скрипт slon_start. Вообще, ручная настройка в этом посте не обсуждается — там лишь рассказывается, где можно найти примеры.



Подготовка.

Будем считать, что база данных у вас уже есть, а также настроенный Postgresql, в нем есть таблицы с первичным ключом и вы готовы приступить к его настройке.

Заранее оговорюсь, что всё делалось на разных версиях серверной Ubuntu, в Дебиане будет примерно одинаково, но что будет в других дистрибутивах, я не знаю.

Итак, нам нужны пакеты postgresql-8.3-slony1 и slony1-bin. Желательно, чтобы оба пакета были из второй ветки (так стабильнее).



Настройка серверов

Во-первых, в postgresql.conf вам нужно раскомментировать строку, содержащую «listen_addresses», и заменить localhost на IP-адрес интерфейса, обращенного к подчиненному устройству.

Также можно вместо адреса поставить '*' — тогда сервер будет ждать соединений на всех интерфейсах.

Далее в pg_hba.conf (также в /etc/postgresql) вам нужно добавить строку типа

host all all 192.168.1.0/24 md5

, где вместо 192.168.0.0/24 нужно указать сеть или IP слейва.

Далее то же самое делаем на слейве, указывая IP мастера.

Далее перезапускаем Postgresql на ведущем и ведомом устройствах, чтобы он подхватил новые настройки.

Нам также нужно будет создать суперпользователя pg на обеих машинах:

createuser -sP slony



Скрипт

Чтобы не увеличивать размер поста в несколько раз, скрипт удален.

здесь .

Заранее скажу, что я не претендую на премию за красоту кода — наоборот, он был написан на коленке в свободное время.

Еще немаловажно то, что это работает. Теперь я расскажу вам, что он делает. Для нормальной работы вам потребуется запустить его от имени пользователя root или через sudo (поскольку там su используется в пользователе postgres, а также запись в /etc и выполнение init-скриптов) также желательно (выполнить два последних этапа ), чтобы слейв разрешил root получить к нему доступ по ssh (желательно с ключом, потому что вводить пароль быстро надоест).

Также необходим пакет libdbd-pg-perl. Текущая версия не принимает параметры из командной строки (хотя должна), поэтому после запуска вы вступите в диалог со скриптом.

Итак, алгоритм работает пошагово:

1. Опрос пользователя на предмет названия кластера и реквизитов master/slave.
Если вы допустили ошибку, это не имеет значения; в случае проблем с подключением к базе данных скрипт предложит ввести данные еще раз.

Имя кластера произвольное.



2. Диалог выбора базы данных.

Здесь все просто.

Скрипт запрашивает у сервера доступные базы данных и предлагает выбрать те, которые необходимо реплицировать.

Чтобы выбрать (или отменить выбор) базу, необходимо ввести ее номер.

Вы можете выбрать все со звездочкой.

По завершении нажмите Enter.

3. Добавление таблиц/последовательностей.

Имея список выбранных баз данных, скрипт собирает из них список таблиц.

В список добавляются все таблицы и последовательности, находящиеся в выбранных базах данных.



4. Перенос структуры базы данных с мастера на слейв.

Удаленные createb и createlang выполняются последовательно.

Далее локальный pg_dump -s после чего структура передается по ssh на слейв.



5.Непосредственное формирование конфига и его отправка.

Все необходимые данные есть, теперь конфиг генерируется и, если вы root, помещается в /etc/slony1 (в том числе и на слейве), редактируется /etc/default/slony1 (указывает какие ноды нужно запускать).



6. Запуск демона
Ну вот и все.

Остаётся только запустить.

:) P.S. Я надеюсь, что это будет кому-то полезно; Если у вас есть вопросы или вдруг что-то работает не так, пожалуйста, пишите в комментариях.

Теги: #linux #postgresql #настройка Linux #perl #ubuntu #Debian #elephants

Вместе с данным постом часто просматривают: