Резервирование MariaDB
Статья описывает настройку двух серверов MariaDB 10.11 с репликацией Master-Master для резервированной установки ТехноДок на операционную систему Debian 12.
Принцип работы
Первый сервер MariaDB записывает все изменения данных в двоичный журнал. Второй сервер читает этот журнал по сети и повторяет изменения у себя. При репликации Master-Master журнал читает каждый из серверов, поэтому изменение, сделанное на любом из них, попадает и на соседний. ТехноДок сам переходит на второй сервер, когда первый перестал отвечать, и продолжает писать в него.
Машины и сетевые требования
Настройка выполняется на двух серверах базы данных, к которым подключаются соответствующие серверы приложений. Имена хостов и адреса в примерах условные: замените их на свои везде, где они встречаются в командах и файлах конфигурации. Между машинами должен быть открыт порт 3306.
| Имя хоста | Адрес | Роль |
|---|---|---|
db.primary-server | 192.168.0.101 | Основной сервер базы данных |
db.standby-server | 192.168.0.102 | Резервный сервер базы данных |
app.server1 | 192.168.0.11 | Сервер приложений |
app.server2 | 192.168.0.12 | Сервер приложений |
Шаг 1. Установка MariaDB
- Установите MariaDB на основном и резервном сервере базы данных:
sudo apt update && sudo apt install -y mariadb-server
- На
db.primary-serverсоздайте файл/etc/mysql/mariadb.conf.d/60-technodoc.cnf:
[mysqld]
sql-mode = "ANSI_QUOTES"
bind-address = 0.0.0.0
log-bin = mariadb-bin
server-id = 1
auto_increment_increment = 2
auto_increment_offset = 1
- На
db.standby-serverсоздайте такой же файл, изменив в нём два значения —server-idиauto_increment_offset:
[mysqld]
sql-mode = "ANSI_QUOTES"
bind-address = 0.0.0.0
log-bin = mariadb-bin
server-id = 2 # Отличается от первого сервера
auto_increment_increment = 2
auto_increment_offset = 2 # Отличается от первого сервера
- Перезапустите MariaDB и включите автозапуск на обоих серверах:
sudo systemctl restart mariadb
sudo systemctl enable mariadb
Описание назначения настроек приведено в таблице ниже.
| Настройка | Назначение |
|---|---|
sql-mode | Режим, в котором двойные кавычки означают имя таблицы или столбца. ТехноДок работает только в этом режиме. |
bind-address | Адреса, на которых MariaDB принимает подключения. По умолчанию Debian разрешает подключение только с самой машины. |
log-bin | Имя двоичного журнала, из которого второй сервер читает изменения. |
server-id | Номер сервера, разный на каждом сервере репликации. |
auto_increment_increment auto_increment_offset | Шаг и начало числовой последовательности. При таких значениях один сервер выдаёт чётные значения, второй — нечётные, поэтому одновременная запись на оба сервера не приводит к совпадению идентификаторов. |
Проверка. На каждом сервере базы данных команда sudo mysql -e "SELECT @@server_id, @@sql_mode\G" показывает номер сервера и режим со значением ANSI_QUOTES в списке.
Шаг 2. Создание учётных записей
Нужны две учётные записи: под первой к базе данных подключается ТехноДок, под второй серверы базы данных читают журналы друг друга. Обе создаются одинаково на каждом сервере базы данных — сначала на db.primary-server, затем на db.standby-server. Подключитесь к MariaDB командой sudo mysql и выполните команды ниже.
- Создайте учётную запись, под которой к базе данных подключается ТехноДок:
CREATE USER 'technodoc'@'192.168.0.11' IDENTIFIED BY 'technodoc_password';
GRANT ALL PRIVILEGES ON *.* TO 'technodoc'@'192.168.0.11' WITH GRANT OPTION;
CREATE USER 'technodoc'@'192.168.0.12' IDENTIFIED BY 'technodoc_password';
GRANT ALL PRIVILEGES ON *.* TO 'technodoc'@'192.168.0.12' WITH GRANT OPTION;
Здесь 192.168.0.11 и 192.168.0.12 — адреса серверов приложений, technodoc_password — пароль, который вы придумываете сами и позже указываете в файле application.conf. Команд четыре, потому что в MariaDB имя пользователя и адрес, с которого он подключается, вместе составляют учётную запись: для двух серверов приложений создаются две разные записи.
- Создайте учётную запись, под которой выполняется репликация:
CREATE USER 'replication_user'@'%' IDENTIFIED BY 'replication_password';
GRANT REPLICATION SLAVE ON *.* TO 'replication_user'@'%';
Знак % вместо адреса разрешает подключение с любой машины, поэтому один и тот же набор команд подходит обоим серверам базы данных.
Повторите оба пункта на втором сервере базы данных.
Проверка. На каждом сервере базы данных команда sudo mysql -e "SELECT user, host FROM mysql.user WHERE user IN ('technodoc', 'replication_user')" показывает созданные учётные записи.
Учётной записи ТехноДок нужны полные права: скрипт run-migrator создаёт базу данных и обращается для этого к служебной базе данных mysql. Ограничьте подключение адресами серверов приложений, как в примере выше, и задайте пароль, отличный от того, что указан в документации.
Шаг 3. Настройка репликации Master-Master
- На db.primary-server подключитесь к базе данных командой
sudo mysqlи посмотрите состояние двоичного журнала:
SHOW MASTER STATUS;
Команда возвращает имя файла журнала и позицию в нём. Запишите оба значения, они понадобятся на следующем шаге:
+--------------------+----------+
| File | Position |
+--------------------+----------+
| mariadb-bin.000001 | 782 |
+--------------------+----------+
- На db.standby-server подключитесь к базе данных командой
sudo mysqlи укажите, откуда читать журнал первого сервера:
STOP SLAVE;
CHANGE MASTER TO
MASTER_HOST = 'db.primary-server',
MASTER_USER = 'replication_user',
MASTER_PASSWORD = 'replication_password',
MASTER_LOG_FILE = 'mariadb-bin.000001',
MASTER_LOG_POS = 782;
START SLAVE;
В MASTER_LOG_FILE и MASTER_LOG_POS задайте значения, полученные на db.primary-server.
- Запишите состояние собственного журнала, оно понадобится для обратного направления репликации:
SHOW MASTER STATUS;
+--------------------+----------+
| File | Position |
+--------------------+----------+
| mariadb-bin.000001 | 969 |
+--------------------+----------+
- На db.primary-server укажите, откуда читать журнал второго сервера:
STOP SLAVE;
CHANGE MASTER TO
MASTER_HOST = 'db.standby-server',
MASTER_USER = 'replication_user',
MASTER_PASSWORD = 'replication_password',
MASTER_LOG_FILE = 'mariadb-bin.000001',
MASTER_LOG_POS = 969;
START SLAVE;
В MASTER_LOG_FILE и MASTER_LOG_POS задайте значения, полученные на db.standby-server.
Проверка репликации
- Убедитесь, что оба направления репликации запущены:
sudo mysql -e "SHOW SLAVE STATUS\G"
На каждом сервере команда показывает Slave_IO_Running: Yes, Slave_SQL_Running: Yes и пустые поля Last_IO_Error и Last_SQL_Error.
- Создайте на
db.primary-serverвременную базу данных:
CREATE DATABASE replication_check;
- Убедитесь на
db.standby-server, что база данных появилась, и удалите её:
SHOW DATABASES LIKE 'replication_check';
DROP DATABASE replication_check;
- Убедитесь на
db.primary-server, что база данных исчезла и там:
SHOW DATABASES LIKE 'replication_check';
Результат. Созданная база данных появилась на втором сервере, а её удаление вернулось на первый — репликация работает в обе стороны.
Дальше следить за репликацией можно из интерфейса: состояние активного сервера базы данных отображается на странице «Администрирование» → «Диагностика» → «Сервер». Там видны состояние потока чтения журнала, время последней синхронизации и последние ошибки чтения и выполнения запросов. Если после отказа или аварийной остановки репликация не возобновилась, запустите её командой sudo mysql -e "START SLAVE" на том сервере базы данных, где она остановилась.