Как настроить кластер MariaDB / MySQL


Что такое MariaDB простыми словами.
Настройка кластера показана на примере системы Linux CentOS/Rocky и Debian/Ubuntu, а также MariaDB/MySQL. Если последняя не установлена, сначала воспользуйтесь инструкцией Как установить MariaDB.
Настройка репликации в одну сторону
Конфигурирование мастера
Настройка слейва
Создание кластера master - master
Вторичный сервер
Первичный сервер
Дополнительные материалы
Шаг 1. Master - Slave
Для начала настроим кластер Master - Slave (репликация в одном направлении).
На обоих серверах сразу зайдем под пользователем root для более удобной работы:
$ sudo su
Также на обоих серверах откроем порт 3306, на котором работает сервер базы данных. В зависимости от используемой утилиты управления брандмауэром, наши действия будут различаться.
а) Для firewalld:
firewall-cmd --zone=public --add-port=3306/tcp --permanent
firewall-cmd --reload
б) Для Iptables:
iptables -I INPUT -p tcp --dport 3306 -j ACCEPT
Для сохранения правила используем iptables-persistent:
apt update
apt install iptables-persistent
netfilter-persistent save
Настройка сервера Master
Теперь на первом сервере откроем на редактирование конфигурационный файл MariaDB:
vi /etc/my.cnf.d/server.cnf
* в зависимости от версии СУБД, путь до конфигурационного файла может быть другим, например:
vi /etc/my.cnf
vi /etc/mysql/mariadb.conf.d/50-server.cnf
и приведем некоторые опции к следующему виду (некоторые из них редактируем, а некоторые — создаем):
[mysqld]
bind-address = 0.0.0.0
server-id = 1
log_bin = mysql-bin
log_error = mysql-bin.err
binlog_ignore_db = information_schema,mysql,test
#replicate-do-db = base1
#replicate-do-db = base2
#replicate-do-table=base1.table1
#replicate-do-table=base1.table2
* где:
- bind-address — адрес, на котором должен слушать сервер баз данных. В нашем примере на всех адресах.
- server-id — идентификатор сервера, для каждой ноды кластера должен быть свой.
- log_bin — имя бинарного лог-файла.
- log_error — имя лог-файла с ошибками.
- binlog_ignore_db — перечисление баз данных, для которых не выполнять репликацию (в данном примере, исключены служебных базы).
- replicate-do-db — позволяет перечислить только те базы, которые нужно реплицировать.
- replicate-do-table — перечисляет только те таблицы, которые нужно реплицировать.
Перезагружаем сервис, чтобы изменения вступили в силу:
systemctl restart mariadb
... или:
systemctl restart mysql
Подключаемся к MariaDB под учетной записью root:
mysql
Если ваша система требует аутентификации, даже, для пользователя root, то подключаемся командой:
mysql -uroot -p
И создаем служебную учетную запись для репликации:
MariaDB [(none)]> GRANT replication slave ON *.* TO "replmy"@"192.168.166.156" IDENTIFIED BY "password";
* replmy: имя учетной записи (можно использовать любое). 192.168.166.156: IP-адрес второго сервера, с которым будем реплицировать данные. password: пароль для учетной записи (желательно, сложный).
Блокируем все таблицы всех баз для чтения и записи:
MariaDB [(none)]> FLUSH TABLES WITH READ LOCK; SET GLOBAL read_only = ON;
Это заблокирует команды на запись. Поэтому, если сервер уже используется, лучше это сделать в нерабочее время.
Выведите состояние работы СУБД:
MariaDB [(none)]> show master status\G
Результат будет, примерно, таким:
File: mysql-bin.000005
Position: 404
Binlog_Do_DB:
Binlog_Ignore_DB: information_schema,mysql
Запомните или запишите значения для File и Position. Они понадобятся при настройке вторичной ноды кластера.
Если в MariaDB уже есть рабочие базы, выходим из оболочки:
MariaDB [(none)]> quit
и делаем резервную копию всех баз:
mysqldump -uroot -p --databases db1 db2 > /tmp/mydb_dump.sql
* данная команда сделает дамп баз db1, db2 и сохранит его в файл /tmp/mydb_dump.sql.
Теперь снова подключаемся к MariaDB:
mysql
и снимем ранее установленные блокировки:
MariaDB [(none)]> SET GLOBAL read_only = OFF;
и отключимся от СУРБД:
MariaDB [(none)]> quit
Полученный файл с резервной копией нужно перенести на второй сервер, например, при помощи такой команды:
scp /tmp/mydb_dump.sql dmosk@192.168.166.156:/tmp
* в данном примере, мы скопируем файл /tmp/mydb_dump.sql в каталог /tmp сервера 192.168.166.156 подключившись под учетной записью dmosk. Для более комфортной передачи данных между серверами читайте инструкцию Как использовать команду SCP в UNIX без пароля.
В процессе система может попросить принять сертификат: просто набираем yes
Are you sure you want to continue connecting (yes/no)? yes
и после вводим пароль для учетной записи dmosk на втором сервере.
Настройка сервера Slave
Теперь подключитесь ко второму серверу.
Откроем на редактирование конфигурационный файл MariaDB:
vi /etc/my.cnf.d/server.cnf
* в зависимости от версии СУБД, путь до конфигурационного файла может быть другим, например:
vi /etc/my.cnf
vi /etc/mysql/mariadb.conf.d/50-server.cnf
... и приведем его к следующему виду:
[mysqld]
bind-address = 0.0.0.0
server-id = 2
#replicate-ignore-table=db1.table1
#replicate-ignore-table=db1.table2
* server-id: напомню, что это идентификатор сервера и для каждой ноды кластера он должен быть уникальным. Также для слейва, при необходимости, мы можем указать, какие таблицы исключить из репликации (опция replicate-ignore-table).
Перезагружаем сервис, чтобы изменения вступили в силу:
systemctl restart mariadb
... или:
systemctl restart mysql
Восстановим базу из дампа, который был сделан на первом сервере. Если это не потребовалось, пропустите этот шаг.
mysql < /tmp/mydb_dump.sql
* файл /tmp/mydb_dump.sql мы скопировали с первого сервера.
Теперь подключимся к MariaDB:
mysql
и введем такую команду:
MariaDB [(none)]> change master to master_host = "192.168.166.155", master_port=3306, master_user = "replmy", master_password = "password", master_log_file = "mysql-bin.000005", master_log_pos = 404;
* где:
- master_host (192.168.166.155): IP-адрес моего первого сервера.
- master_port (3306): порт подключения к MySQL.
- master_user (replmy): учетная запись для репликации, которая была создана на первом сервере.
- master_password (password): пароль для учетной записи, также был сделан на первом сервере.
- master_log_file (mysql-bin.000005): имя файла, которое мы должны были записать или запомнить (у вас может быть другим).
- master_log_pos (404): номер позиции, с которой необходимо начать репликацию (также должны были записать или запомнить ранее).
Теперь запустим вторичный сервер для репликации:
MariaDB [(none)]> start slave;
И проверим состояние репликации:
MariaDB [(none)]> SHOW SLAVE STATUS\G
Обратите внимание на поля Read_Master_Log_Pos и Exec_Master_Log_Pos. Они должны отличаться от начального значения (в нашем примере, 404). Также посмотрите на поле Last_IO_Error — оно должно быть пустым.
Отключитесь от mariadb:
MariaDB [(none)]> quit
Настройка кластера в режиме Master - Slave закончена.
Чтобы проверить, насколько хорошо работает репликация, попробуйте внести изменение на первом сервере — на втором оно должно появиться, почти, сразу.
Шаг 2. Настройка кластера MariaDB в режиме Master - Master
Если одностороннего режима копирования данных нам недостаточно, продолжаем настройку.
Настройка на сервере Slave
На втором сервере откроем конфигурационный файл MariaDB:
vi /etc/my.cnf.d/server.cnf
Или:
vi /etc/my.cnf
vi /etc/mysql/mariadb.conf.d/50-server.cnf
Допишем в него следующее:
log_bin=mysql-bin
log_error=mysql-bin.err
binlog-ignore-db=information_schema,mysql,test
Перезагрузим демон для применения настроек:
systemctl restart mariadb
Теперь подключимся к MariaDB:
mysql
и создадим учетную запись для репликации с первого сервера:
MariaDB [(none)]> GRANT replication slave ON *.* TO "replmy"@"192.168.166.155" IDENTIFIED BY "password";
* replmy: имя учетной записи (можно использовать любое). 192.168.166.155: IP-адрес первого сервера, с которым будем реплицировать данные. password: пароль для учетной записи (желательно, сложный).
Выведем состояние работы мастера:
MariaDB [(none)]> show master status\G
Как и при настройке первого сервера, запомните или запишите значения для File и Position.
Настройка на сервере Master
Теперь подключитесь к первому серверу.
И зайдем в командную оболочку MariaDB:
mysql
введем такую команду:
MariaDB [(none)]> change master to master_host = "192.168.166.156", master_port="3306", master_user = "replmy", master_password = "password", master_log_file = "mysql-bin.000003", master_log_pos = 245;
* 192.168.166.156: IP-адрес моего второго сервера. replmy: учетная запись для репликации, которая была создана на втором сервере. password: пароль для учетной записи, также был сделан на втором сервере. mysql-bin.000003: имя файла, которое мы должны были записать или запомнить (у вас может быть другим). 245: номер позиции, с которой необходимо начать репликацию (также должны были записать или запомнить ранее).
Теперь запустим вторичный сервер для репликации:
MariaDB [(none)]> start slave;
И проверим состояние репликации:
MariaDB [(none)]> SHOW SLAVE STATUS\G
Отключитесь от СУРБД:
MariaDB [(none)]> quit
Настройка кластера в режиме Master - Master закончена.
Теперь остается окончательно убедиться, что репликация работает. Внесите изменения на первом сервере — они должны попасть на второй. И наоборот, при внесении изменений на втором сервере, они должны попадать на первый.
Читайте также
Другая информация по теме, которая может быть полезной:
1. Восстановление кластера MySQL / MariaDB.
2. Пример скрипта на Python для мониторинга состояния репликации MariaDB / MySQL.
3. Установка MariaDB-server на Rocky Linux или Ubuntu.
4. Создание пользователей MySQL/MariaDB и предоставление прав доступа.
5. Безопасное удаление (чистка) логов mysql-bin в MySQL или MariaDB.