Настройка отказоустойчивого кластера баз данных с использованием MariaDB Galera, ProxySQL, Keepalived и Debian 13
Введение
По мере развития ваших приложений обеспечение постоянной доступности и отказоустойчивости становится критически важной задачей. Простой или отказ базы данных может привести к финансовому и репутационному ущербу. В этом руководстве описано создание отказоустойчивого кластера БД с использованием MariaDB, репликации с помощью Galera, ProxySQL для интеллектуальной маршрутизации запросов и Keepalived для управления виртуальным IP-адресом. Руководство описывает развертывание кластера на 3 VPS(ноды) под управлением Debian 13.
Эта архитектура сочетает в себе преимущества каждой технологии. MariaDB Galera обеспечивает синхронную репликацию данных между нодами БД, гарантирует согласованность данных на них. ProxySQL выполняет функцию маршрутизатора запросов, обеспечивает интеллектуальное управление трафиком и балансировку нагрузки. Keepalived управляет виртуальным IP-адресом, предоставляя единую точку доступа к кластеру и автоматизирует переключение между нодами в случае сбоя.
Данное руководство предполагает наличие опыта системного администрирования Linux, базовые знания сетевых технологий (TCP/IP, DNS) и базовые навыки администрирования баз данных.
Преимущества данной архитектуры:
- Высокая доступность: Автоматизированное переключение нод при сбое, минимальное время простоя.
- Согласованность данных: Синхронная репликация гарантирует согласованность данных на всех нодах.
- Производительность: ProxySQL оптимизирует маршрутизацию запросов и снижает нагрузку на ноды.
- Единая точка доступа: Виртуальный IP-адрес упрощает настройку доступа приложения к БД.
Что вам понадобится:
- Три VPS или сервера под управлением Debian 13.
- Доступ root или sudo ко всем серверам.
- Опыт работы в командной строке.
- Базовые знания TCP/IP и DNS.
Требования
Хостнеймы нод
Настройка кластера с использованием хостнеймов упрощает конфигурацию и поддержку кластера. IP-адреса узлов должны находиться в одной подсети.
Хостнеймы и IP-адреса
- galera0 (мастер): 192.168.10.10
- galera1 (слейв): 192.168.10.11
- galera2 (слейв): 192.168.10.12
Настроить разрешение хостнеймов можно несколькими способами:
- Использование
/etc/hosts(рекомендуется для тестовых конфигураций): Подходит для сред тестирования и разработки. На каждом сервере добавьте записи, сопоставляющие хостнейм сервера с его статическим IP-адресом в файл/etc/hosts. - Использование DNS (рекомендуется для рабочих конфигураций): Для рабочих конфигураций или больших кластеров рекомендуется настроить DNS (записи A).
Проверка
Убедитесь что присутствует связь между нодами. Проверьте связь при помощи команды ping. Например, с galera0 выполните ping galera1. Вы должны получить ответ.
Установка необходимых пакетов
Перед настройкой кластера нужно установить необходимые пакеты на каждой ноде. В этом разделе описана настройка для Debian. Все приведённые ниже команды должны выполняться с правами пользователя root.
Настройка репозиториев
Добавьте необходимые репозитории на каждой ноде, используя следующие команды:
apt-get update && apt-get install -y --no-install-recommends lsb-release wget apt-transport-https ca-certificates
wget -nv -O /usr/share/keyrings/proxysql-3.0.x-keyring.gpg 'https://repo.proxysql.com/ProxySQL/proxysql-3.0.x/repo_pub_key.gpg'
echo "deb [signed-by=/usr/share/keyrings/proxysql-3.0.x-keyring.gpg] https://repo.proxysql.com/ProxySQL/proxysql-3.0.x/bookworm/ ./" | tee /etc/apt/sources.list.d/proxysql.list
Обновление системы
Обновите списки пакетов и сами пакеты на каждой ноде:
apt update && apt upgrade -y
Установка пакетов
Установите необходимые пакеты на каждой ноде:
apt install rsync mariadb-server mariadb-client galera-4 proxysql keepalived -y
Безопасность MariaDB
Запустите скрипт настройки безопасности на каждом узле:
sudo mariadb-secure-installation
Этот скрипт выполняет два важных шага: он предложит вам установить надежный пароль пользователя root для сервера MariaDB и удалит все небезопасные настройки. Следуйте инструкциям на экране, чтобы завершить процесс.
Включить удаленный доступ к MariaDB
Выполните эту команду на каждой ноде, чтобы включить удаленный доступ к MariaDB:
sed -i "s/.*bind-address.*/bind-address = 0.0.0.0/" /etc/mysql/mariadb.conf.d/50-server.cnf
systemctl restart mariadb
Galera
Galera обеспечивает синхронную репликацию данных на всех нодах кластера. Это означает, что каждое изменение, внесенное в базу данных на одной ноде, автоматически распространяется на остальные ноды. Роль Galera в этой конфигурации:
- Высокая доступность: В случае выхода из строя одной ноды остальные обеспечивают бесперебойную работу. Кластер автоматически назначает рабочую ноду основной.
- Согласованность данных: Благодаря синхронной репликации данные всегда согласованы на всех нодах. Это обеспечивает актуальность данных на всех нодах кластера.
- Масштабируемость: Поскольку данные реплицируются на нескольких узлах, вы можете распределять запросы на чтение по всему кластеру для повышения производительности.
По сути, Galera гарантирует, что ваша база данных MariaDB останется высокодоступной, согласованной, отказоустойчивой и масштабируемой.
Конфигурация
Создайте файл конфигурации /etc/mysql/conf.d/galera.cnf на каждой ноде. Содержимое будет идентичным, за исключением имени и адреса каждой ноды. Вставьте этот шаблон:
[mysqld] # Basic MariaDB settings binlog_format=ROW default_storage_engine=InnoDB innodb_autoinc_lock_mode=2 bind-address=0.0.0.0 # Galera Provider Configuration wsrep_on=ON wsrep_provider=/usr/lib/galera/libgalera_smm.so # Galera Cluster Configuration wsrep_cluster_name="my_galera_cluster" wsrep_cluster_address="gcomm://galera0,galera1,galera2" # This node's specific configuration wsrep_node_name="<node_name>" wsrep_node_address="<node_address>"
Замените <node_name> и <node_address> на каждой ноде. Используйте galera0 для мастера, galera1 для первого слейва и т.д.
Важно: wsrep_cluster_address — перечислите имена хостов всех нод кластера на каждой. wsrep_node_name — должен быть уникальным для каждой ноды (например, galera0, galera1, galera2). wsrep_node_address — укажите хостнейм ноды.
Запуск кластера
Запустите кластер на первой ноде с помощью этой команды:
sudo systemctl stop mariadb && sudo galera_new_cluster
Перезапустите MariaDB на остальных нодах:
sudo systemctl restart mariadb
Проверьте настройку кластера
Проверить размер кластера
Подключитесь к MariaDB на любой ноде и проверьте состояние кластера. Подключитесь к базе данных:
sudo mariadb -u root -p
Проверьте количество нод кластера в командной оболочке MariaDB:
SHOW STATUS LIKE 'wsrep_cluster_size';
wsrep_cluster_size должно быть равно количеству нод.
+--------------------+-------+ | Variable_name | Value | +--------------------+-------+ | wsrep_cluster_size | 3 | +--------------------+-------+ 1 row in set (0.001 sec)
Тест репликации
Создайте тестовую базу данных на любой ноде и добавьте тестовую запись. Выполните следующие команды в оболочке MariaDB:
CREATE DATABASE galtest;
USE galtest;
CREATE TABLE messages (id INT AUTO_INCREMENT PRIMARY KEY, text VARCHAR(255));
INSERT INTO messages (text) VALUES ('Test from galera0!');
Затем проверьте данные на других нодах, используя следующий SQL-запрос через оболочку MariaDB:
USE galtest;
SELECT * FROM messages;
Должна появиться тестовая запись:
+----+--------------------+ | id | text | +----+--------------------+ | 7 | Test from galera0! | +----+--------------------+ 1 row in set (0.001 sec)
ProxySQL
Роль ProxySQL в конфигурации кластера — это больше, чем просто прокси; он повышает производительность и надежность. ProxySQL играет ключевую роль между вашими приложениями и Galera. Его основные задачи:
- Кэширование запросов: ProxySQL кэширует часто выполняемые запросы. Вместо того, чтобы многократно запрашивать одни и те же данные в кластере Galera, он предоставляет кэшированный результат, значительно снижая нагрузку на базу данных и улучшая время отклика. Это особенно полезно для приложений с интенсивным чтением.
- Объединение соединений: ProxySQL поддерживает пул постоянных подключений к кластеру Galera. Установление соединения с базой данных — ресурсоемкая операция. Пул подключений позволяет избежать этих накладных расходов за счет повторного использования существующих подключений, что повышает производительность.
- Балансировка нагрузки и маршрутизация запросов: ProxySQL может интеллектуально направлять запросы к различным нодам кластера Galera в зависимости от таких факторов, как нагрузка на сервер, тип запроса и т.д. Это позволяет распределить нагрузку и повысить производительность кластера.
- Оптимизация запросов: ProxySQL может переписывать запросы, делая их эффективнее, используя возможности Galera для оптимального выполнения.
- Обнаружение сбоев: ProxySQL непрерывно отслеживает состояние узлов Galera. В случае сбоя ProxySQL автоматически перенаправляет запросы на исправные ноды, обеспечивая бесперебойную работу.
По сути, ProxySQL действует как интеллектуальный менеджер трафика и оптимизатор производительности для вашего кластера Galera, значительно повышая его эффективность и устойчивость.
Меры предосторожности
Приведённые ниже логины и пароли предназначены только для образовательных целей. Используйте надежные пароли для настройки рабочих конфигураций.
Настройка пользователей
Аккаунт мониторинга
Пользователь-монитор в ProxySQL — это выделенная учётная запись базы данных, предназначенная исключительно для инструментов мониторинга, обеспечивающая безопасный доступ к внутренней статистике и метрикам. Она настраивается с минимальными правами доступа (только SELECT), что гарантирует целостность и безопасность ваших данных, а также позволяет осуществлять комплексный мониторинг.
Выполните этот запрос в оболочке MariaDB на мастер ноде, чтобы добавить пользователя:
CREATE USER 'monitor'@'%' IDENTIFIED BY 'monitor';
GRANT SELECT ON *.* TO 'monitor'@'%';
FLUSH PRIVILEGES;
Аккаунт приложения
Аккаунт приложения в ProxySQL — это стандартная учётная запись базы данных, используемая вашими приложениями для подключения к кластеру Galera и работы с ним. Через него ваше приложение взаимодействует с базой данных.
Выполните этот запрос в оболочке MariaDB на мастере, чтобы добавить пользователя приложения:
GRANT ALL PRIVILEGES ON *.* TO 'test'@'%' IDENTIFIED BY 'test' WITH GRANT OPTION;
FLUSH PRIVILEGES;
Проверка
Проверьте создание пользователя на всех нодах с помощью этой команды:
mariadb -u root -e "SELECT user, host FROM mysql.user;"
Конфигурация
Создайте файл конфигурации /etc/proxysql.cnf на каждой ноде со следующим содержимым:
datadir="/var/lib/proxysql" admin_variables={ admin_credentials="admin:admin" mysql_ifaces="127.0.0.1:6032" } mysql_variables={ threads=4 max_connections=2048 monitor_username="monitor" monitor_password="monitor" } mysql_servers=( { address="galera0" , port=3306 , hostgroup=0 }, { address="galera1" , port=3306 , hostgroup=0 }, { address="galera2" , port=3306 , hostgroup=0 }) mysql_users=( { username = "test" , password = "test" , default_hostgroup = 0 , active = 1 }) mysql_query_rules=( { rule_id=2 active=1 match_pattern="^SELECT.*" destination_hostgroup=0 apply=1 })
Добавьте в автозагрузку и запустите ProxySQL с помощью следующих команд:
sudo systemctl start proxysql
sudo systemctl enable proxysql
sudo proxysql --reload
Проверьте настройки ProxySQL с помощью этой команды:
mysql -u admin -padmin -h 127.0.0.1 -P6032 -e "SELECT hostname,status FROM mysql_servers;"
Все ноды должны быть в онлайн:
+----------+--------+ | hostname | status | +----------+--------+ | galera0 | ONLINE | | galera1 | ONLINE | | galera2 | ONLINE | +----------+--------+
Keepalived
Keepalived управляет виртуальным IP-адресом, предоставляя единую точку доступа к кластеру и обеспечивает отказоустойчивость в случае сбоя нод. Это достигается путем мониторинга состояния нод MariaDB и перенаправления трафика на работоспособную ноду в случае сбоя, что обеспечивает высокую доступность. Конфигурация определяет идентификатор виртуального маршрутизатора 51, используется интерфейс eth0. На мастере state установлен в MASTER с приоритетом 100. Слейв ноды настраиваются с state равным BACKUP, имеющие приоритеты 90 и 80 соответственно. virtual_ipaddress установлен на 192.168.10.50 на всех нодах. VIP и ноды должны находиться в одной подсети. Хостинг должен поддерживать VIP для VPS. Аутентификация включается с помощью общего пароля 1234. Параметр advert_int определяет частоту отправки VRRP-объявлений мастером. Меньшее значение означает более частые объявления, что потенциально ускоряет обнаружение отказа; большее значение означает менее частые объявления, что потенциально замедляет переключение между нодами, но снижает нагрузку на сеть.
Конфигурация
Создайте файл конфигурации /etc/keepalived/keepalived.conf на каждой ноде со следующим содержимым:
vrrp_instance VI_1 { state <NODE_STATE> interface eth0 virtual_router_id 51 priority <NODE_PRIORITY> advert_int 1 authentication { auth_type PASS auth_pass 1234 } virtual_ipaddress { 192.168.10.50/24 } }
Измените <NODE_STATE> и <NODE_PRIORITY> как описано выше. Запустите службу keepalived, используя следующую команду:
sudo systemctl enable keepalived && sudo systemctl start keepalived
Проверка
Для проверки настроек используйте VIP, настроенный через Keepalived, и порт, настроенный через ProxySQL. Проверьте размер кластера, например:
mariadb -u test -ptest -h 192.168.10.50 -P6033 -D galtest -e "SHOW STATUS LIKE 'wsrep_cluster_size';"
Ответ должен соответствовать проверке Galera:
+--------------------+-------+ | Variable_name | Value | +--------------------+-------+ | wsrep_cluster_size | 3 | +--------------------+-------+
Теперь вы можете перезапускать узлы в случайном порядке, проверять размер кластера и доступность данных.

Заключение
В этом руководстве описан процесс настройки высокодоступного кластера MariaDB с использованием репликации Galera, ProxySQL для маршрутизации запросов и Keepalived для управления виртуальным IP-адресом. Эта архитектура обеспечивает ряд ключевых преимуществ, включая высокую доступность с автоматическим отказоустойчивым переключением, целостность данных и синхронную репликацию, повышенную производительность благодаря ProxySQL. Объединяя эти технологии, можно создать надежный, отказоустойчивый кластер БД, способный выдерживать высокие нагрузки и минимизировать время простоя.