14.03.2025
Официальный сайт проекта galeracluster.com
Cтатью писал Игольников Игорь.
MariaDB Galera Cluster — это кластерное решение для базы данных MariaDB, которое обеспечивает высокую доступность и синхронную репликацию данных между несколькими узлами. Оно основано на технологии Galera, разработанной компанией Codership, и интегрировано в MariaDB начиная с версии 10.1. Это решение идеально подходит для сценариев, где требуется минимальная задержка репликации, отказоустойчивость и возможность записи на любой узел кластера.
Основные характеристики:
- Мультимастер архитектура: Все узлы в кластере являются одновременно и мастером, и репликой. Это значит, что вы можете выполнять операции чтения и записи на любом узле, а изменения будут автоматически синхронизированы со всеми остальными.
Отсутствует традиционное разделение на "master" и "slave", как в классической репликации MySQL. - Синхронная репликация: Используется метод сертификации (certification-based replication): транзакция фиксируется только после того, как все узлы подтверждают её успешное применение. Это гарантирует отсутствие задержек репликации (slave lag) и потерянных данных при сбое узла.
- Поддерживаемые движки: Основной движок — InnoDB (обязателен для полной функциональности). Экспериментальная поддержка MyISAM и Aria (с MariaDB 10.6).
- Платформа: Работает только на Linux.
- Автоматическое управление узлами: При добавлении нового узла он автоматически синхронизируется с кластером через механизм State Snapshot Transfer (SST) или Incremental State Transfer (IST). Узлы, которые выходят из строя, автоматически исключаются из кластера.
Как работает Galera Cluster?
- Wsrep API: Интерфейс между сервером MariaDB и плагином Galera. Он передаёт набор записей (write-set) — данные и информацию о блокировках — для репликации.
- Сертификация: Каждый узел проверяет write-set на конфликты с другими транзакциями. Если конфликтов нет, транзакция применяется ко всем узлам.
- Групповая коммуникация: Узлы обмениваются данными через плагины групповой коммуникации (например, gcomm), обеспечивая согласованность.
Пример процесса:
- Клиент записывает данные на одном узле.
- Транзакция формирует write-set и отправляется всем узлам.
- Узлы проверяют и подтверждают транзакцию.
- После успешной сертификации данные применяются ко всем узлам одновременно.
Преимущества:
- Высокая доступность: Нет единой точки отказа, так как любой узел может принимать запросы.
- Нулевая потеря данных: Синхронность гарантирует, что данные одинаковы на всех узлах.
- Простота масштабирования: Добавление узлов не требует сложной ручной настройки.
- Гибкость: Подходит для облачных сред и распределённых дата-центров.
- Прозрачность для приложений: Не нужно разделять операции чтения и записи.
Ограничения:
- Требуется минимум 3 узла: Для кворума и избежания "split-brain" (разделения кластера).
- Ограничения InnoDB: Не поддерживает некоторые операции, например, LOCK TABLES или XA-транзакции.
- Производительность: Зависит от самого медленного узла в кластере, так как синхронность требует координации.
- Размер транзакций: Большие транзакции (например, LOAD DATA) могут замедлить работу.
Установка mariadb-server:
sudo apt update
sudo apt install -y software-properties-common dirmngr apt-transport-https curl
из официального репозитория:
curl -LsSO https://r.mariadb.com/downloads/mariadb_repo_setup
chmod +x mariadb_repo_setup
./mariadb_repo_setup
sudo apt update && sudo apt upgrade -y
sudo apt install -y mariadb-server mariadb-client
sudo systemctl start mariadb
sudo systemctl enable mariadb
sudo systemctl status mariadb
mariadb --version
sudo apt install -y mariadb-server galera-4
В нашем случаи дистрибутив Debian 12 и MariaDB 10
- Далее мы создадим отдельный файл конфигурации в директории /etc/mysql/conf.d/galera.cnf
Ниже мы рассмотрим основной набор команд, которые можно использовать в файле galera.cnf. Для первого запуска нашего кластера.
[mysqld]
#Основная конфигурация для mysql
binlog_format=ROW
default-storage-engine=innodb
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0
# Основная конфигурация для Galera
wsrep_on=ON
wsrep_provider=/usr/lib/galera/libgalera_smm.so
wsrep_cluster_name="my_galera_cluster"
wsrep_cluster_address="gcomm://192.168.1.1,192.168.1.2,192.168.1.3"
default_storage_engine=InnoDB
wsrep_sst_method=rsync
# Основная конфигурация ноды.
wsrep_node_address="192.168.1.1"
wsrep_node_name="DB-CL-01" - Итак, теперь нам необходимо создать аналогичные файлы конфигурации для остальных наших серверов.
- После того как все файлы конфигурации были успешно созданы, необходимо остановить службу MariaDB с помощью команды service mariadb stop
- На первой ноде запускаем наш кластер командой galera_new_cluster
- Затем мы должны запустить службу на остальных нодах, используя следующую команду service mariadb start
- Чтобы убедиться, что наш кластер запущен и все узлы подключены к системе, выполните следующую команду: mysql -e "SHOW STATUS LIKE 'wsrep%';"
нас интересуют строки wsrep_incoming_addresses и wsrep_cluster_size
wsrep_incoming_addresses = 192.168.1.1,192.168.1.2,192.168.1.3
wsrep_cluster_size = 3
На этом наш основной путь завершается.
Работа даже на одной ноде.
- Если мы хотим, чтобы наше приложение функционировало даже в случае потери двух из трёх нод, мы можем следовать инструкции, представленной ниже.:
# Основная конфигурация для Galera
wsrep_provider_options="pc.ignore_quorum=1; pc.ignore_sb=1"
Параметр позволяет узлу продолжать работу даже при потере кворума, то есть даже если количество узлов в кластере, способных голосовать, становится ниже установленного порога (обычно больше половины узлов).
pc.ignore_quorum=1
Параметр отключает проверку на разделение (split-brain). Это означает, что если узлы потеряют связь друг с другом, они продолжат работать независимо.
pc.ignore_sb=1
Это может быть полезно в ситуациях, когда потеря кворума временная (например, из-за сетевых проблем) или для предотвращения остановки работы кластера в случае аварийного отключения части узлов. - Из первой части понятно, что эта функция позволит нам работать даже с небольшим количеством серверов. Тем не менее, вам следует учесть возможность рассинхронизации данных. Чтобы избежать этой проблемы, я бы предложил установить балансировку, которая будет блокировать запись данных во время простоя сервера. Кроме того, можно запустить скрипты, которые помогут вернуть ноду в кластер после её утраты.
Можно перезапустить службу service mariadb restart для сервера которые были ранее не доступны. Так-же можно выполнить команду mysql -e "SET GLOBAL wsrep_provider_options='pc.bootstrap=1';" Значение "1" номер узла объявляющимся основным для инициализации кластера.
Более подробную информацию о параметрах wsrep_ можно узнать с официального сайта разработчика.