21 Занятие 21: Отказоустойчивые решения / Кластер multimaster
Эта страница извлечена из официального PDF в нативный Markdown. Текст слайдов, код и комментарии сохранены в порядке чтения; исходные PDF и HTML остаются эталоном макета. HTML source: pgpro_21_multimaster.html Archive: PGPRO-handouts-16.zip Страниц PDF: 27
Page 1: Отказоустойчивые решения / Кластер multimaster
Авторские права
© Postgres Professional, 2023–2026 Авторы: Алексей Береснев, Илья Баштанов, Павел Толмачев, Игорь Гнатюк Фото: Олег Бартунов (монастырь Пху и пик Бхрикути, Непал)
Использование материалов курса
Некоммерческое использование материалов курса (презентации, демонстрации) разрешается без ограничений. Коммерческое использование возможно только с письменного разрешения компании Postgres Professional. Запрещается внесение изменений в материалы курса.
Обратная связь
Отзывы, замечания и предложения направляйте по адресу: edu@postgrespro.ru
Отказ от ответственности
Компания Postgres Professional не несет никакой ответственности за любые повреждения и убытки, включая потерю дохода, нанесенные прямым или непрямым, специальным или случайным использованием материалов курса. Компания Postgres Professional не предоставляет каких-либо гарантий на материалы курса. Материалы курса предоставляются на основе принципа «как есть» и компания Postgres Professional не обязана предоставлять сопровождение, поддержку, обновления, расширения и изменения.
Page 2: Темы
- Возможности и ограничения
- Архитектура и принцип работы
- Распределенные транзакции
- Поколения узлов
- Проверка состояния узлов
- Отказ узла
- Режим 2+1
Page 3: Возможности
Синхронный симметричный кластер
- на всех узлах одинаковые данные, все узлы ведущие
- Распределенные транзакции
- все узлы работают как единая СУБД с ACID-гарантиями
- Отказоустойчивость и высокая доступность
- Масштабируемость чтения
Комментарии преподавателя
Расширение multimaster позволяет преобразовать сервер в синхронный симметричный кластер без разделения ресурсов — данные будут одинаковы на всех узлах кластера, клиенты могут читать и писать данные на любой из узлов. В кластере поддерживаются распределенные транзакции, дающие обычные гарантии ACID, поэтому приложения могут работать с кластером как с единой СУБД.
Multimaster обеспечивает отказоустойчивость за счет автоматического восстановления данных на вернувшихся в строй узлах; кластер имеет высокую доступность — у него нулевое время простоя. Менять конфигурацию (в том числе и обновлять в рамках одной и той же основной версии) узлов можно без остановки обслуживания. Перенаправляя на разные узлы читающие транзакции, можно повысить пропускную способность таких операций.
https://postgrespro.ru/docs/enterprise/16/multimaster
Page 4: Ограничения
Не поддерживаются
- ОС Windows и решения 1С
- репликация нескольких баз данных
- большие объекты (Large Objects)
- операции неблокирующего построения и перестроения индексов
- и работы с табличными пространствами
- Особенности работы с данными
- транзакции могут занимать длительное время
- на уровне Read Committed могут происходить сбои сериализации
- меняется поведение последовательностей
- OID могут отличаться на разных узлах
- Некоторые другие особенности и ограничения
Комментарии преподавателя
У расширения есть ряд ограничений.
Не поддерживается ОС Windows и продукты 1С.
Можно реплицировать только одну базу данных (но можно сделать несколько кластеров для разных баз данных).
Не поддерживаются большие объекты (Large Objects).
Не поддерживаются операции CREATE INDEX и REINDEX с предложением CONCURRENTLY, CREATE и DROP TABLESPACE.
Так как каждая транзакция подтверждается несколькими узлами, это занимает некоторое время. Чем больше узлов в кластере, тем дольше будет происходить фиксация изменений.
На уровне изоляции Read Committed транзакции могут завершаться ошибкой сериализации.
Последовательности по умолчанию выдают немонотонные значения, чтобы избежать конфликтов уникальных идентификаторов между узлами.
Идентификаторы OID могут быть различными на разных узлах.
Существуют и некоторые другие ограничения использования мультимастера.
https://postgrespro.ru/docs/enterprise/16/multimaster#MULTIMASTER-LIMIT ATIONS
Page 5: Подготовка сервера
Остановим основной сервер.
В этой демонстрации часть команд выполняется от имени пользователя ОС postgres. Обращайте внимание на приглашения перед командами. Для текущей демонстрации инициализированы и настроены три экземпляра Postgres Pro Enterprise. Каталоги данных и порты: /var/lib/pgpro/ent-16-MM-1, порт 5001 /var/lib/pgpro/ent-16-MM-2, порт 5002 /var/lib/pgpro/ent-16-MM-3, порт 5003 Для самостоятельной настройки кластеров обратитесь к решению практики. Дополнительные параметры первого экземпляра:
Остальные экземпляры настроены аналогично.
Инициализация кластера multimaster
Узлы кластера уже подготовлены, теперь необходимо инициализировать весь кластер multimaster из трех узлов:
Подготовим роль и базу данных для работы мультимастера на каждом из узлов. Для первого узла:
Для второго узла:
И для третьего узла:
Page 6: Page 6
Теперь объединим узлы в кластер. Для этого на любом из узлов добавим расширение multimaster в БД pgpro_multimaster…
- … и запустим функцию инициализации кластера. Первый параметр — это строка подключения к текущему узлу, второй — массив строк подключения к остальным узлам:
Функция возвращает пустой ответ в случае успеха, либо ошибку инициализации.
Page 7: Архитектура
{#source-figure-007 caption=“Source slide page 7: Архитектура”}
Комментарии преподавателя
Расширение multimaster состоит из патчей ядра СУБД (входят в Postgres Pro) и непосредственно кода расширения.
Данные передаются между узлами с помощью доработанного механизма логической репликации.
Для обеспечения согласованности данных подтверждение распределенных транзакций выполняется с помощью улучшенного трехфазного протокола фиксации (E3PC). Для этого в кластере изначально должно быть не менее трех узлов.
Высокая степень доступности достигается тем, что узлы можно выводить из кластера и добавлять к кластеру «на лету». При этом клиенты могут быть подключены к любому узлу — все узлы принимают и читающую, и пишущую нагрузку.
https://postgrespro.ru/docs/enterprise/16/multimaster#MULTIMASTER-ARC HITECTURE
Page 8: Процессы
{#source-figure-008 caption=“Source slide page 8: Процессы”}
Комментарии преподавателя
За разные задачи в мультимастере отвечают разные процессы:
● Процесс mtm-monitor запускается на каждом узле и управляет остальными процессами кластера.
● Процесс mtm-logrep-receiver получает поток логической репликации от walsender. Изменения применяются пулом процессов mtm-logrep-receiver-dynworker.
● Процесс mtm-dmq-sender посылает mtm-dmq-receiver служебную информацию, необходимую для реализации распределенных транзакций, а также выполняет периодический опрос доступности узлов (DMQ — distributed message queue, распределенная очередь сообщений).
● Процессы mtm-resolver и mtm-campaigner служат для согласованного исключения узлов из кластера и возвращения узлов в кластер; им отвечает процесс mtm-replier.
На рисунке показаны только процессы-источники одного узла и соответствующие им процессы-приемники другого узла. На самом деле и те процессы, и другие работают на каждом узле. Более того, их количество зависит от числа узлов в кластере: например, на каждом узле будет запущен процесс walsender для каждого из остальных узлов кластера.
https://postgrespro.ru/docs/enterprise/16/multimaster#MULTIMASTER-BGW ORKERS
Page 9: Процессы
Посмотрим на процессы, которые запускаются на каждом узле кластера (postmaster.pid находится в первой строке файла postmaster.pid, расположенного в каталоге PGDATA):
Количество процессов довольно велико, следует обеспечить их достаточными ресурсами.
Page 10: Фиксация изменений
{#source-figure-010 caption=“Source slide page 10: Фиксация изменений”}
Комментарии преподавателя
Протокол трехфазной фиксации расширяет стандартный протокол двухфазной фиксации, реализованный в PostgreSQL, и работает следующим образом.
- Prepare. Когда на узле (который считается координатором транзакции) выполняется оператор COMMIT, транзакция подготавливается (PREPARE TRANSACTION) и передается на остальные доступные узлы. Эти узлы отвечают подтверждением или отказом.
Если какой-либо узел ответил отказом, транзакция обрывается.
- Precommit. Узел-координатор рассылает остальным узлам команду Precommit, которая выражает намерение зафиксировать транзакцию.
Для продолжения достаточно, чтобы подтверждением ответило большинство узлов (кворум). Если достаточного количества подтверждений не набирается, транзакция обрывается (ROLLBACK PREPARED).
- Commit. Транзакция фиксируется на всех узлах (COMMIT PREPARED).
В отличие от двухфазной фиксации, в трехфазную добавлен этап Precommit. Если после него произойдет сбой одного из узлов и третий этап Commit не будет выполнен на сбойном узле, остальные узлы, не дождавшись подтверждения, самостоятельно зафиксируют транзакцию.
https://www.sciencedirect.com/science/article/pii/S0022000098915665
Page 11: Поколения узлов
{#source-figure-011 caption=“Source slide page 11: Поколения узлов”}
Комментарии преподавателя
Подмножество узлов, которые кластер считает в данный момент рабочими, называется поколением. Поколения нумеруются последовательными целыми числами.
Узел всегда входит в какое-либо поколение. Если узел узнает, что существует поколение с бо́льшим номером, он старается перейти в него.
Новое поколение формируется большинством узлов при любом изменении списка доступных узлов кластера: в момент его запуска, при сбое узла и при добавлении в кластер нового узла.
Транзакцию можно зафиксировать только после того, как она будет подготовлена на всех представителях поколения.
На слайде показано поколение 1 в кластере из трех узлов.
Page 12: Проверка состояния кластера
Проверим статус узла кластера:
На любом из узлов кластера можно получить список всех узлов:
Проверим работу кластера — создадим таблицу на первом узле. Рекомендуется использовать таблицы с явно определенным первичным ключом — мы так и поступим:
Добавим в таблицу несколько строк:
Проверим доступность таблицы multimaster_tbl на втором узле:
Таблица и строки доступны на втором узле — кластер работает.
Page 13: Отказ узла
{#source-figure-013 caption=“Source slide page 13: Отказ узла”}
Комментарии преподавателя
При отказе одного из узлов (выключение узла, недоступность узла по сети) оставшиеся узлы формируют новое поколение и в дальнейшем транзакции подтверждаются большинством из оставшихся узлов.
https://postgrespro.ru/docs/enterprise/16/multimaster#MULTIMASTER-FAIL URE-DETECTION-AND-RECOVERY
Page 14: Отказ узла
Для демонстрации отказа узла остановим экземпляр Postgres Pro на третьем сервере:
Проверим доступные узлы кластера:
Номер поколения увеличился. Запишем еще три строки в таблицу, теперь на втором узле:
Проверим корректную работу кластера — прочитаем все строки на первом узле:
Добавленные строки видны — кластер продолжает работать даже при отсутствии одного из узлов.
Page 15: Восстановление узла
{#source-figure-015 caption=“Source slide page 15: Восстановление узла”}
Комментарии преподавателя
После восстановления третьего узла он определяет номер текущего поколения кластера, получает список узлов, находящихся в этом поколении и выполняет восстановление с одного из этих узлов.
После окончания восстановления третий узел предлагает включить его в кластер, формируя новое поколение 3.
Page 16: Восстановление узла
Текущее состояние узлов кластера:
Вернем третий узел в состав кластера. Для этого запустим экземпляр Postgres Pro на третьем узле:
Сразу после подключения видим, что третий узел пока что не готов к работе:
После запуска узел подключается к кластеру, получает все необходимые изменения… …и возвращается в строй. Номер поколения снова увеличивается:
Все добавленные ранее строки видны на третьем узле.
Page 17: Page 17
Page 18: Режим 2+1
{#source-figure-018 caption=“Source slide page 18: Режим 2+1”}
Комментарии преподавателя
Для работы синхронного симметричного кластера требуется, чтобы все узлы кластера были примерно одинаковы по их аппаратным характеристикам.
Помимо этого, существует режим работы кластера мультимастера 2+1 (его еще называют режимом работы с рефери). В этом случае в кластер входят два полноценных узла, а третий узел работает только как голосующий — он принимает решения о подтверждении и отмене транзакций.
На узле-рефери достаточно установить Postgres Pro Enterprise и добавить расширение referee. Узел-рефери не хранит никакие данные кластера, поэтому нагрузка на узел невелика и он не требователен к ресурсам.
https://postgrespro.ru/docs/enterprise/16/multimaster#SETTING-UP-A-REF EREE
Page 19: Режим 2+1
{#source-figure-019 caption=“Source slide page 19: Режим 2+1”}
Для перехода в режим работы 2+1 удалим из кластера один из узлов (третий):
На удаленном узле добавим расширение referee:
Остановим остальные два узла:
На каждом из двух узлов в файл конфигурации необходимо добавить строку подключения к узлу-рефери:
Запускаем любой из основных узлов. Например второй:
Запускаем другой узел:
Проверим статус кластера:
Page 20: Page 20
Проверим также, что ранее созданная таблица на месте:
Снова добавим строки в таблицу multimaster_tbl:
Кластер продолжает работать. Но он уже состоит из двух узлов и одного рефери. Убедиться в том, что узлы корректно взаимодействуют с рефери, можно, посмотрев их журналы сообщений. Второй узел является основным в данной конфигурации кластера:
Первый узел сообщает, что не может получить выигрышный голос (grant) при голосовании, так как такой голос уже выдан второму узлу:
Page 21: Итоги
Postgres Pro Multimaster — это кластерное решение со всеми ведущими узлами, обеспечивающее автоматическое восстановление узлов после сбоев
- Не требует установки дополнительного ПО
- Сфера применения — системы высокой доступности
Page 22: Практика
- Настройте кластер для режима работы 2+1. 2. Имитируйте отказ одного из двух узлов и проверьте работоспособность кластера. 3. Верните отключенный узел в строй.
Комментарии преподавателя
- Подготовьте три дополнительных экземпляра Postgres Pro Enterprise: для каждого из них инициализируйте каталог данных, настройте аутентификацию и задайте параметры. Подробности можно посмотреть в решении практики.
Page 23: 1. Настройка кластера для режима работы 2+1
Остановим основной сервер.
Инициализируем кластер из двух узлов и третий узел для рефери. Сначала подготовим три дополнительных экземпляра сервера Postgres Pro. Создаем каталог PGDATA (если экземпляр работает, его предварительно надо остановить):
Инициализируем каталог данных:
Роль multimaster_user должна иметь право использовать протокол репликации и подключаться к базе pgpro_multimaster, настройки аутентификации это разрешают:
Конфигурационный файл:
Page 24: Page 24
Запускаем экземпляр:
Создаем роль и базу данных для мультимастера:
Аналогично нужно подготовить еще два экземпляра на портах 5002 и 5003. На третьем узле добавим расширение referee:
На каждом из двух основных узлов добавим в файл конфигурации строку подключения к узлу-рефери:
Перезапустим первый и второй узлы, чтобы применить настройки:
Page 25: Page 25
Инициализируем кластер мультимастера.
Теперь запустим функцию инициализации кластера. Первый параметр — это строка подключения к текущему узлу, второй — подключение ко второму узлу:
Создадим таблицу с первичным ключом multimaster_tbl и добавим в нее несколько строк:
Проверим доступность таблицы multimaster_tbl на втором узле:
2. Имитация сбоя и проверка работоспособности
Имитируем отказ узла. Для этого отключим один из узлов, например, второй:
Page 26: Page 26
Добавим еще несколько строк в таблицу:
Оставшийся узел сохранил работоспособность.
3. Возвращение узла в строй
Вернем в строй второй узел:
На втором узле проверим, что таблица доступна:
Кластер мультимастера продолжает работать в режиме 2+1.
Уборка
Остановим и удалим экземпляры multimaster и запустим основной.