Архитектура YaXAHA Cluster#

Этот раздел описывает как устроен YaXAHA Cluster, включая базовые принципы заложенные при его проектировании. Мы рекомендуем ознакомиться с информацией перечисленной в этом разделе каждому кто использует YaXAHA Cluster, особенно в продакшене.

Основные компоненты#

Каждая нода кластера представляет собой копию PostgreSQL с установленным поверх него пакетом YaXAHA Cluster.

В этой главе мы рассмотрим только компоненты важные для понимания как работает YaXAHA Cluster и намеренно опустим дополнительные инструменты, какие как утилита ytsetup. Итак, основные компоненты входящие в пакет:

  • Измененная верcия PgBouncer
  • Расширение для PostgreSQL server
  • Приложение YT-Server

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

PgBouncer#

PgBouncer помогает реализовать функционал, который невозможен в данный момент без изменения исходного кода PostgreSQL server. Мы посчитали, что лучше добавить в наш пакет слегка измененный PgBouncer, чем вносить изменения в PostgreSQL server.

Все дело в том, что YaXAHA Cluster оперирует транзакциями, а не только отдельными SQL запросами. Это позволяет реализовать преимущества, такие как определение границ транзакции, логическую целостность и непротиворечивость данных и тд. Но заставляет нас принять дополнительные меры, чтобы абсолютно все запросы к базе данных были обвернуты в транзакции, даже если существующая система клиента вообще не использует транзакции.

Также, YaXAHA Cluster содержит в себе расширение для PostgreSQL и приложение-сервер.

Расширение#

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

В этот момент расширение сообщает приложению-серверу о новой транзакции и предстоящих изменениях данных и ждет ответ, перед тем как позволить PostgreSQL закончить транзакцию на данной ноде.

Приложение YT-Server#

Приложение ytserver отвечает за общение с другими нодами кластера и лидер-нодой. Когда клиентское приложение начинает транзакцию на ноде, сервер запускает процесс повторения транзакции на других нодах кластера. Оно запускает процесс повторения транзакции на других нодах кластера. Таким образом, транзакция считается успешной если определенное количество нод кластера успешно повторили транзакцию вместе с нодой-инициатором.

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

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

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

Понятия#

Помимо компонентов пакета YaXAHA Cluster описанных выше, есть несколько вещей о которых необходимо упомянуть для того что бы составить полную картину о том как работает кластер.

Таблица настроек#

Таблица настроек создается на каждой ноде кластера утилитой ytsetup. Это простейшее хранилище данных вида ключ=значение с одной дополнительной колонкой module, чтобы разделить настройки по их категориям.

По умолчанию таблица настроек имеет имя public.yt_config в базе postgres.

Нода-инициатор#

Нода на которую пришел запрос от клиентского приложения на исполнение транзакции. Так как YaXAHA Cluster не имеет выделенной мастер-ноды, это может быть любая нода кластера доступная клиентскому приложению.

Нода-лидер#

Нода лидер выполняет роль управляющего кластером. Она учитывает все транзакции в кластере, следит за их последовательным выполнением.

Нода лидер избирается кластером в результате голосования. Недоступность Лидера не приводит к полной остановке кластера, вместо этого кластер производит выборы и определяет новую ноду-лидера.