|
Отказоустойчивый кластер на Windows Server 2012
|
|||
---|---|---|---|
#18+
Есть два сервера. Данные записываются на мастер и автоматически сливаются на слейв. В случае недоступности мастера (как и где вообще эту недоступность проверять?), слейв должен взять на себя все его обязанности и, когда мастер становится доступен, слить свежеполученные данные на него (и передать управление?). Основная проблема: ок, слейв переключился в мастер. Но когда мастер вновь поднимется, неизвестно же. То есть на момент запуска сдохшего мастера у нас параллельно два мастера. Как его вовремя задемоутить, чтобы не похерить базу? Запускать при загрузке службу только после проверки роли второго сервера? Для себя набросал такую схемку: Мастер недоступен. 1. Слейв переходит в режим мастера. Когда мастер внезапно становится доступен, он должен перейти в режим слейва. 1. При загрузке ос, проверять статус второго сервера 2. Если второй - слейв (как такое вообще может быть после отказа мастера?), то все ок, ничего не делаем 3. Если второй - мастер: a. либо переводим удаленно его в слейв, принудительно b. либо сами становимся слейвом и продолжаем функционировать дальше, потом опять поменялись и т.д. (но как будем определять, к какому подключаться?) Решил сделать два батника для автоматического разруливания ролей, но пока написание дается туго. Долгое время искал готовые решения, но постепенно пришел к мысли, что их нет (или просто я не знаю). Сервера всего два, ставить пул для автоматического разруливания некуда. Может кто посоветовать годную инфу по теме? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2018, 12:20 |
|
Отказоустойчивый кластер на Windows Server 2012
|
|||
---|---|---|---|
#18+
NanodeathСервера всего два, ставить пул для автоматического разруливания некуда. Следовательно рулить вручную. Потому что на всего двух хостах от splitbrain не уйти даже теоретически. См теорему CAP. NanodeathКак его вовремя задемоутить, чтобы не похерить базу? Запускать при загрузке службу только после проверки роли второго сервера? А если у вас сеть косячит, а сервера не перезапускались? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2018, 12:33 |
|
Отказоустойчивый кластер на Windows Server 2012
|
|||
---|---|---|---|
#18+
Nanodeath, А давайте вы мне расскажите про "он должен перейти в режим слейва." - каким образом вы предполагаете это делать и почему оно будет работать. Ну и второе - какое поведение будет у вашего кластера если сеть между 2 сервами пропадет (например firewall криво кто то настроит)... а связь с приложением останется у обоих. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2018, 14:39 |
|
Отказоустойчивый кластер на Windows Server 2012
|
|||
---|---|---|---|
#18+
NanodeathОсновная проблема: ок, слейв переключился в мастер. Но когда мастер вновь поднимется, неизвестно же. То есть на момент запуска сдохшего мастера у нас параллельно два мастера. Как его вовремя задемоутить, чтобы не похерить базу? Запускать при загрузке службу только после проверки роли второго сервера? Делай мультимастер и проблема решится сама собой. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.04.2018, 13:37 |
|
Отказоустойчивый кластер на Windows Server 2012
|
|||
---|---|---|---|
#18+
Melkij, >на всего двух хостах от splitbrain не уйти даже теоретически Слейв - чисто для резерва. То есть когда мастер работает, не используется вообще никак, просто сливает с него данные. >А если у вас сеть косячит, а сервера не перезапускались? Сервера будут стоять один над другим и соединены одним кабелем напрямую. Если же клиент не видит оба сервера (через двух провайдеров, что очень маловероятно), данные сохраняются на нем до тех пор, пока один из серверов не станет доступен. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2018, 07:22 |
|
Отказоустойчивый кластер на Windows Server 2012
|
|||
---|---|---|---|
#18+
Maxim Boguk, >про "он должен перейти в режим слейва." Это как раз основная сложность. В ОП-посте примерно расписал, как я себе это представляю, но сам уже понял, что это бред. Один из способов реализации описан здесь: https://habrahabr.ru/post/308950/ Правда, код оттуда не хочет работать с Postgres 10 и/или нерусской виндой/локалью (как писал автор статьи, сам не знаю, причем тут может быть это). Кратко: переключение слейва в мастер происходит путем переименования recovery.conf на слейве. Для обратного переключения на мастер, когда он снова доступен, чистим на нем папку data (сначала может забекапить?) и делаем pg_basebackup на мастере, чтобы получить все данные, записанные на слейв во время простоя. Затем переименовываем файл recovery.whatever на слейве обратно в recovery.conf. Вроде правильно. Проблема еще - на чем писать этот скрипт? В Power Shell и языке batch-файлов я полный ноль, на С# только формошлепил. Даже если напишу, не факт, что сама идея работоспособна. Готовых решений, помимо приведенного с хабра, не нашел, третьего сервера мне не дадут. Граничные случаи пока не рассматриваю, надо сделать, чтоб хоть как-то работало. Если мне, джуну без опыта настройки чего-либо сложнее wi-fi роутера, дали такое задание, то, думаю, они понимают, на что идут. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2018, 07:48 |
|
Отказоустойчивый кластер на Windows Server 2012
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, спасибо, подумаю. Запросов на изменение практически нет, только на добавление. Основное требование - чтобы ни одна транзакция не была потеряна. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2018, 08:00 |
|
Отказоустойчивый кластер на Windows Server 2012
|
|||
---|---|---|---|
#18+
NanodeathDimitry Sibiryakov, спасибо, подумаю. Запросов на изменение практически нет, только на добавление. Основное требование - чтобы ни одна транзакция не была потеряна. Это еще и приводит к вопросу синхронной репликации. Такие задачи и требования - они не для junior :). Ну и такие вещи обычно руками failover/failback делают. -- Maxim Boguk dataegret.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
18.04.2018, 08:27 |
|
Отказоустойчивый кластер на Windows Server 2012
|
|||
---|---|---|---|
#18+
Короче, накатал я 3 скрипта для "ручного" фейловера (надо бы два, но это потом). Встречайте! 1. slave-become-master.bat Код: sql 1. 2. 3. 4. 5. 6. 7. 8.
2. slave-become-slave-again.bat Код: sql 1. 2. 3. 4. 5. 6. 7. 8.
И, наконец, моя гордость (актуальная версия сейчас не доступна, там я еще дополнительно пересоздаю слот репликации и меняю postgres.conf на обоих серваках): master-suicide.bat Код: sql 1. 2. 3. 4. 5. 6. 7. 8.
После запуска скрипта служба postgresql больше не запускается, пока я не переустановлю Postgres. Третий день бьюсь над этой проблемой, уже почти на пороге суицида. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2018, 12:02 |
|
Отказоустойчивый кластер на Windows Server 2012
|
|||
---|---|---|---|
#18+
NanodeathКороче, накатал я 3 скрипта для "ручного" фейловера (надо бы два, но это потом). Встречайте! 1. slave-become-master.bat Код: sql 1. 2. 3. 4. 5. 6. 7. 8.
2. slave-become-slave-again.bat Код: sql 1. 2. 3. 4. 5. 6. 7. 8.
И, наконец, моя гордость (актуальная версия сейчас не доступна, там я еще дополнительно пересоздаю слот репликации и меняю postgres.conf на обоих серваках): master-suicide.bat Код: sql 1. 2. 3. 4. 5. 6. 7. 8.
После запуска скрипта служба postgresql больше не запускается, пока я не переустановлю Postgres. Третий день бьюсь над этой проблемой, уже почти на пороге суицида. 1,2 - зачем вы стопите службу и руками переименовываете? pg_ctl promote (или подсовывание триггер файла) при работающем сервере, самостоятельно промоутит до мастера, и переименует файл в recovery.done 3. - ошибки из лога покажите ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2018, 12:48 |
|
Отказоустойчивый кластер на Windows Server 2012
|
|||
---|---|---|---|
#18+
gav21, 1 и 2 вышли одинаковыми, сорян. Во 2м, конечно же, удаляется триггер-файл и recovery.done переименовывается обратно в recovery.conf. pg_ctl promote на что-то ругался. С простым созданием-удалением триггер файла без остановки сервиса были проблемы. Самая необъяснимая из них: на каком-то этапе файл recovery просто исчезал. По-моему, для его восстановления я поначалу даже создавал файл-бекап. Назовем для простоты упавший мастер сервером 1, а слейв, который принял на его обязанности - сервером 2. Доступа к серверу, как и к логам, у меня сейчас нет, но основная ошибка была связана с существующим слотом репликации (на сервере 2), приходилось удаленно сносить его, а по завершении восстановления БД создавать, опять же, удаленно с сервера 1. Но, насколько помню, на сервере 1 даже при ручном повторении всех действий для подключения слейва убивался постгрес. Спасибо за поддержку, в понедельник будет более точная информация. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2018, 14:04 |
|
Отказоустойчивый кластер на Windows Server 2012
|
|||
---|---|---|---|
#18+
Новая версия !!! !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.
Ошибки в аттаче. Делаю все как по инструкции, но в конце всех манипуляций служба не запускается. Печаль... ... |
|||
:
Нравится:
Не нравится:
|
|||
25.04.2018, 15:34 |
|
Отказоустойчивый кластер на Windows Server 2012
|
|||
---|---|---|---|
#18+
Nanodeath, лога ошибок все так же не видать ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2018, 07:17 |
|
Отказоустойчивый кластер на Windows Server 2012
|
|||
---|---|---|---|
#18+
gav21, Вот сегодняшние логи (одинаковые на обоих серверах, ибо папка data удаляется, а потом pg_basebackup). Не думаю, что в них есть что-то полезное, но рад буду ошибаться. Могу выложить только конфиги еще. postgresql.conf на мастере Код: sql 1. 2. 3. 4. 5. 6. 7. 8.
postgresql.conf на слейве (разница в последних двух строчках) Код: sql 1. 2. 3. 4. 5. 6. 7. 8.
recovery.conf Код: sql 1. 2. 3. 4.
Не знаю, короче. В понедельник сервера уже надо отвозить, а фейловер сейчас делается полной ручной настройкой с нуля и восстановлением из бэкапов. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2018, 08:45 |
|
|
start [/forum/topic.php?fid=53&msg=39636493&tid=1995801]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
35ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
50ms |
get tp. blocked users: |
1ms |
others: | 278ms |
total: | 408ms |
0 / 0 |