Postgres Upgrade (Migrate) with minimal downtime

How to upgrade or migrate Postgres database with minimal downtime ( Slony )

Дано: Postgres старой версии и новый Postgres (это может быть другой инстанс с более высокой версией или просто другой сервер)

Требуется обновиться / переехать на новый инстанс/сервер с минимальным временем простоя

Подготовительные работы:

  • у старой БД во всех таблицах должен быть primary key
  • делаем дамп текущей схемы
  • дампим права и юзеров

Установка Slony:


mkdir /var/log/slony && chown %dbuser%:%dbuser% /var/log/slony
wget http://slony.info/downloads/2.2/source/slony1-2.2.4.tar.bz2
tar xjf slony1-2.2.4.tar.bz2
cd slony1-2.2.4
./configure --prefix=/usr/local/postgres-old/ --with-perltools=/usr/local/postgres-old/slony --with-pgconfigdir=/usr/local/postgres-old/bin
make clean
make
make install

Повторяем ./configure , поменяв postgres-old на postgres-new

Переименовываем файл /usr/local/postgres-old/etc/slon_tools.conf-sample в /usr/local/postgres-old/etc/slon_tools.conf и начинаем редактировать

add_node(node => 1, // конфиг старого сервера
host => '',
dbname => '',
port => ‘’,
user => '',
password => '');

Аналогично добавляем новый сервер.

Прописываем репликационный набор.

$SLONY_SETS = {
"set1" => {
"set_id" => 1,
"table_id" => 1,
"sequence_id" => 1,
"pkeyedtables" => [ tables list ],
“sequences” => [ sequence list ]}};

table/sequence list — список таблиц/секвенций, которые мы будем переносить.
Запросы для получения списков:

SELECT table_name
FROM information_schema.tables
WHERE table_type = ‘BASE TABLE’
AND table_schema = ‘public’
ORDER BY table_type, table_name;

SELECT c.relname FROM pg_class c WHERE c.relkind = ‘S’;

 

Инициализируем кластер Slony

/usr/local/postgres-old/slony/slonik_init_cluster > /tmp/init.txt
cat /tmp/init.txt | /usr/local/postgres-old/bin/slonik

Запускаем демона Slony

/usr/local/postgres-old/slony/slon_start 1 - подключаем демона к первой ноде
/usr/local/postgres-new/slony/slon_start 2 - подключаем демона ко второй ноде

Создаем набор репликации

/usr/local/postgres-old/slony/slonik_create_set set1 > /tmp/createset.txt
cat /tmp/createset.txt | /usr/local/postgres-old/bin/slonik

Подписываем вторую ноду на репликацию c первой ноды

/usr/local/postgres-old/slony/slonik_subscribe_set 1 2 > /tmp/subscribe.txt ( 1 - id набора, 2 - номер ноды)
cat /tmp/subscribe.txt | /usr/local/postgres-old/bin/slonik

Смотрим логи /var/log/slony/nodeX

После завершения репликации когда необходимо переключить приложение выполняем следующие пункты:
— Останавливаем приложение
— Останавливаем старый инстанс БД
— Меняем в postgresql.conf нового инстанса порт, запускаем новую БД
— Останавливаем slony демонов из п. 2.9 (можно kill)
— Подключаемся к новому инстансу БД и выполняем
drop schema _replication cascade;

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *