powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Отказоустойчивый кластер на Windows Server 2012
14 сообщений из 14, страница 1 из 1
Отказоустойчивый кластер на Windows Server 2012
    #39628985
Nanodeath
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть два сервера. Данные записываются на мастер и автоматически сливаются на слейв. В случае недоступности мастера (как и где вообще эту недоступность проверять?), слейв должен взять на себя все его обязанности и, когда мастер становится доступен, слить свежеполученные данные на него (и передать управление?).

Основная проблема: ок, слейв переключился в мастер. Но когда мастер вновь поднимется, неизвестно же. То есть на момент запуска сдохшего мастера у нас параллельно два мастера. Как его вовремя задемоутить, чтобы не похерить базу? Запускать при загрузке службу только после проверки роли второго сервера?

Для себя набросал такую схемку:

Мастер недоступен.
1. Слейв переходит в режим мастера.

Когда мастер внезапно становится доступен, он должен перейти в режим слейва.
1. При загрузке ос, проверять статус второго сервера
2. Если второй - слейв (как такое вообще может быть после отказа мастера?), то все ок, ничего не делаем
3. Если второй - мастер:
a. либо переводим удаленно его в слейв, принудительно
b. либо сами становимся слейвом и продолжаем функционировать дальше, потом опять поменялись и т.д. (но как будем определять, к какому подключаться?)

Решил сделать два батника для автоматического разруливания ролей, но пока написание дается туго. Долгое время искал готовые решения, но постепенно пришел к мысли, что их нет (или просто я не знаю). Сервера всего два, ставить пул для автоматического разруливания некуда. Может кто посоветовать годную инфу по теме?
...
Рейтинг: 0 / 0
Отказоустойчивый кластер на Windows Server 2012
    #39629016
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NanodeathСервера всего два, ставить пул для автоматического разруливания некуда.
Следовательно рулить вручную.
Потому что на всего двух хостах от splitbrain не уйти даже теоретически. См теорему CAP.

NanodeathКак его вовремя задемоутить, чтобы не похерить базу? Запускать при загрузке службу только после проверки роли второго сервера?
А если у вас сеть косячит, а сервера не перезапускались?
...
Рейтинг: 0 / 0
Отказоустойчивый кластер на Windows Server 2012
    #39629178
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nanodeath,

А давайте вы мне расскажите про "он должен перейти в режим слейва." - каким образом вы предполагаете это делать и почему оно будет работать.

Ну и второе - какое поведение будет у вашего кластера если сеть между 2 сервами пропадет (например firewall криво кто то настроит)... а связь с приложением останется у обоих.
...
Рейтинг: 0 / 0
Отказоустойчивый кластер на Windows Server 2012
    #39629826
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NanodeathОсновная проблема: ок, слейв переключился в мастер. Но когда мастер вновь поднимется, неизвестно же. То есть на момент запуска сдохшего мастера у нас параллельно два мастера. Как его вовремя задемоутить, чтобы не похерить базу? Запускать при загрузке службу только после проверки роли второго сервера?
Делай мультимастер и проблема решится сама собой.
...
Рейтинг: 0 / 0
Отказоустойчивый кластер на Windows Server 2012
    #39632156
Nanodeath
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Melkij,
>на всего двух хостах от splitbrain не уйти даже теоретически
Слейв - чисто для резерва. То есть когда мастер работает, не используется вообще никак, просто сливает с него данные.

>А если у вас сеть косячит, а сервера не перезапускались?
Сервера будут стоять один над другим и соединены одним кабелем напрямую. Если же клиент не видит оба сервера (через двух провайдеров, что очень маловероятно), данные сохраняются на нем до тех пор, пока один из серверов не станет доступен.
...
Рейтинг: 0 / 0
Отказоустойчивый кластер на Windows Server 2012
    #39632160
Nanodeath
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxim Boguk,

>про "он должен перейти в режим слейва."

Это как раз основная сложность. В ОП-посте примерно расписал, как я себе это представляю, но сам уже понял, что это бред. Один из способов реализации описан здесь: https://habrahabr.ru/post/308950/ Правда, код оттуда не хочет работать с Postgres 10 и/или нерусской виндой/локалью (как писал автор статьи, сам не знаю, причем тут может быть это).

Кратко: переключение слейва в мастер происходит путем переименования recovery.conf на слейве.

Для обратного переключения на мастер, когда он снова доступен, чистим на нем папку data (сначала может забекапить?) и делаем pg_basebackup на мастере, чтобы получить все данные, записанные на слейв во время простоя. Затем переименовываем файл recovery.whatever на слейве обратно в recovery.conf. Вроде правильно.
Проблема еще - на чем писать этот скрипт? В Power Shell и языке batch-файлов я полный ноль, на С# только формошлепил. Даже если напишу, не факт, что сама идея работоспособна. Готовых решений, помимо приведенного с хабра, не нашел, третьего сервера мне не дадут.

Граничные случаи пока не рассматриваю, надо сделать, чтоб хоть как-то работало. Если мне, джуну без опыта настройки чего-либо сложнее wi-fi роутера, дали такое задание, то, думаю, они понимают, на что идут.
...
Рейтинг: 0 / 0
Отказоустойчивый кластер на Windows Server 2012
    #39632162
Nanodeath
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov, спасибо, подумаю. Запросов на изменение практически нет, только на добавление. Основное требование - чтобы ни одна транзакция не была потеряна.
...
Рейтинг: 0 / 0
Отказоустойчивый кластер на Windows Server 2012
    #39632167
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NanodeathDimitry Sibiryakov, спасибо, подумаю. Запросов на изменение практически нет, только на добавление. Основное требование - чтобы ни одна транзакция не была потеряна.

Это еще и приводит к вопросу синхронной репликации.
Такие задачи и требования - они не для junior :).

Ну и такие вещи обычно руками failover/failback делают.


--
Maxim Boguk
dataegret.ru
...
Рейтинг: 0 / 0
Отказоустойчивый кластер на Windows Server 2012
    #39633670
Nanodeath
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Короче, накатал я 3 скрипта для "ручного" фейловера (надо бы два, но это потом).
Встречайте!
1. slave-become-master.bat

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
:: make slave work as a master

net stop postgresql-x64-10

type NUL > "C:\Program Files\PostgreSQL\10\data\startmaster"
ren "C:\Program Files\PostgreSQL\10\data\recovery.conf" "recovery.done"

net start postgresql-x64-10



2. slave-become-slave-again.bat

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
:: make slave work as a master

net stop postgresql-x64-10

type NUL > "C:\Program Files\PostgreSQL\10\data\startmaster"
ren "C:\Program Files\PostgreSQL\10\data\recovery.conf" "recovery.done"

net start postgresql-x64-10



И, наконец, моя гордость (актуальная версия сейчас не доступна, там я еще дополнительно пересоздаю слот репликации и меняю postgres.conf на обоих серваках): master-suicide.bat

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
net stop postgresql-x64-10

rmdir /s /q "C:\Program Files\PostgreSQL\10\data"
mkdir "C:\Program Files\PostgreSQL\10\data"

pg_basebackup -h <ip слейва> -D "C:\Program Files\PostgreSQL\10\data" -U postgres

net start postgresql-x64-10



После запуска скрипта служба postgresql больше не запускается, пока я не переустановлю Postgres.
Третий день бьюсь над этой проблемой, уже почти на пороге суицида.
...
Рейтинг: 0 / 0
Отказоустойчивый кластер на Windows Server 2012
    #39633710
gav21
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NanodeathКороче, накатал я 3 скрипта для "ручного" фейловера (надо бы два, но это потом).
Встречайте!
1. slave-become-master.bat

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
:: make slave work as a master

net stop postgresql-x64-10

type NUL > "C:\Program Files\PostgreSQL\10\data\startmaster"
ren "C:\Program Files\PostgreSQL\10\data\recovery.conf" "recovery.done"

net start postgresql-x64-10



2. slave-become-slave-again.bat

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
:: make slave work as a master

net stop postgresql-x64-10

type NUL > "C:\Program Files\PostgreSQL\10\data\startmaster"
ren "C:\Program Files\PostgreSQL\10\data\recovery.conf" "recovery.done"

net start postgresql-x64-10



И, наконец, моя гордость (актуальная версия сейчас не доступна, там я еще дополнительно пересоздаю слот репликации и меняю postgres.conf на обоих серваках): master-suicide.bat

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
net stop postgresql-x64-10

rmdir /s /q "C:\Program Files\PostgreSQL\10\data"
mkdir "C:\Program Files\PostgreSQL\10\data"

pg_basebackup -h <ip слейва> -D "C:\Program Files\PostgreSQL\10\data" -U postgres

net start postgresql-x64-10



После запуска скрипта служба postgresql больше не запускается, пока я не переустановлю Postgres.
Третий день бьюсь над этой проблемой, уже почти на пороге суицида.


1,2 - зачем вы стопите службу и руками переименовываете?
pg_ctl promote (или подсовывание триггер файла) при работающем сервере, самостоятельно промоутит до мастера, и переименует файл в recovery.done
3. - ошибки из лога покажите
...
Рейтинг: 0 / 0
Отказоустойчивый кластер на Windows Server 2012
    #39633775
Nanodeath
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
gav21,

1 и 2 вышли одинаковыми, сорян. Во 2м, конечно же, удаляется триггер-файл и recovery.done переименовывается обратно в recovery.conf. pg_ctl promote на что-то ругался.

С простым созданием-удалением триггер файла без остановки сервиса были проблемы. Самая необъяснимая из них: на каком-то этапе файл recovery просто исчезал. По-моему, для его восстановления я поначалу даже создавал файл-бекап.

Назовем для простоты упавший мастер сервером 1, а слейв, который принял на его обязанности - сервером 2.

Доступа к серверу, как и к логам, у меня сейчас нет, но основная ошибка была связана с существующим слотом репликации (на сервере 2), приходилось удаленно сносить его, а по завершении восстановления БД создавать, опять же, удаленно с сервера 1. Но, насколько помню, на сервере 1 даже при ручном повторении всех действий для подключения слейва убивался постгрес.

Спасибо за поддержку, в понедельник будет более точная информация.
...
Рейтинг: 0 / 0
Отказоустойчивый кластер на Windows Server 2012
    #39636108
Nanodeath
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Новая версия !!!

!master-make-slave.bat
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
@chcp 866
cls
echo off

(
echo select pg_drop_replication_slot('slot_1'^^^);
) | psql -h <slave-ip> -p 5432 -U postgres

net stop postgresql-x64-10

rmdir /s /q "C:\Program Files\PostgreSQL\10\data"
mkdir "C:\Program Files\PostgreSQL\10\data"

pg_basebackup -h <slave-ip> -D "C:\Program Files\PostgreSQL\10\data" -U postgres

copy "C:\Program Files\PostgreSQL\10\data\postgresql.conf.slave" "C:\Program Files\PostgreSQL\10\data\postgresql.conf"

(
echo select pg_create_physical_replication_slot('slot_1'^^^);
) | psql -h <slave-ip> -p 5432 -U postgres

net start postgresql-x64-10

if NOT %ERRORLEVEL%==0 goto error
echo ok
pause

:error
echo There was a problem starting postgresql service
pause



Ошибки в аттаче. Делаю все как по инструкции, но в конце всех манипуляций служба не запускается. Печаль...
...
Рейтинг: 0 / 0
Отказоустойчивый кластер на Windows Server 2012
    #39636493
gav21
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nanodeath,

лога ошибок все так же не видать
...
Рейтинг: 0 / 0
Отказоустойчивый кластер на Windows Server 2012
    #39637127
Nanodeath
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
gav21,

Вот сегодняшние логи (одинаковые на обоих серверах, ибо папка data удаляется, а потом pg_basebackup). Не думаю, что в них есть что-то полезное, но рад буду ошибаться.

Могу выложить только конфиги еще.

postgresql.conf на мастере
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
wal_level = hot_standby
archive_mode = off
#max_replication_slots = 1
max_wal_senders = 2

wal_receiver_status_interval = 0
hot_standby = off
hot_standby_feedback = off



postgresql.conf на слейве (разница в последних двух строчках)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
wal_level = hot_standby
archive_mode = off
#max_replication_slots = 1
max_wal_senders = 2

wal_receiver_status_interval = 0
hot_standby = on
hot_standby_feedback = on



recovery.conf
Код: sql
1.
2.
3.
4.
standby_mode = on
primary_conninfo = 'host=<master-ip, меняется при фейловере> port=5432 user=postgres'
primary_slot_name = slot_1
trigger_file = startmaster



Не знаю, короче. В понедельник сервера уже надо отвозить, а фейловер сейчас делается полной ручной настройкой с нуля и восстановлением из бэкапов.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Отказоустойчивый кластер на Windows Server 2012
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]