MariaDB: Настройка репликации базы данных в режиме Master-Master/Slave
Репликация в SQL базах данных это процесс копирования данных из одного источника в другой (или на несколько) и в обратнуюм сторону. Данные с одного сервера баз данных, постоянно копируются на один или несколько других серверов. С помощью репликации можно распределять нагрузку на сервера, обеспечивать отказоустойчивость и высокую доступность баз данных MariaDB. СУБД MariaDB/MySQL позволяет использовать два типа репликации БД Master-Master и Master-Slave. В данной статье мы рассмотрим, как настроить оба типа репликации MariaDB в CentOS 7. Начнем!
Установка MariaDB.
Ранее мы размещали статью с описанием процесса установки MariaDB на CentOS 7. Ознакомиться с ней вы можете по ссылке https://winitpro.ru/index.php/2019/08/28/ustanovka-i-optimizaciya-mariadb/. Поэтому, заострять внимание на самой установке MariaDB мы не будем, а сразу перейдем к настройке репликации.
Настройка репликации Master-Master в MariaDB
В схеме репликации Master-Master любой из серверов баз данных MariaDB/MySQL, может использоваться как для записи информации, так и для чтения. Многие считают данный тип репликации не совсем привлекательным. Если из строя выйдет один из серверов, с большей вероятностью потери данных будут и на других Master-серверах. Обычно данная схема используется, когда на всех серверах нужно обеспечить и запись, и чтение информации.
Репликация основана на специально файле binlog, в который Master сервер сохраняет все операции с БД. Slave сервер подключается к мастеру и применяет команды к своим базам.
1. MariaDB: Настройка первого мастер сервера (Master-1)
Добавляем в наш конфигурационный файл my.cnf на первом сервере MariaDB следующие строки:
#replication
server-id = 1
report_host = master
log_bin = /var/lib/mysql/mariadb-bin
log_bin_index = /var/lib/mysql/mariadb-bin.index
relay_log = /var/lib/mysql/relay-bin
relay_log_index = /var/lib/mysql/relay-bin.index
service mariadb restart
Создадим пользователя для настройки репликации:
mysql
create user 'test_master'@'%' identified by 'test_master';
grant replication slave on *.* to 'test_master'@'%';
Для добавления Slave нам понадобятся данные bin_log с сервера Master1.
MariaDB [(none)]> show master status;
+--------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +--------------------+----------+--------------+------------------+ | mariadb-bin.000002 | 664 | | | +--------------------+----------+--------------+------------------+ 1 row in set (0.000 sec)
Это будет наш Master-1.
2. MariaDB: Настройка второго мастер сервера (Master-2)
Подключимся ко второму MariaDB серверу, открываем конфигурационный файл my.cnf и добавляем информацию:
#replication
server-id = 2
report_host = master2
log_bin = /var/lib/mysql/mariadb-bin
log_bin_index = /var/lib/mysql/mariadb-bin.index
relay_log = /var/lib/mysql/relay-bin
relay_log_index = /var/lib/mysql/relay-bin.index
И так же создаем пользователя на втором сервере:
create user 'test_master2'@'%' identified by 'test_master2';
grant replication slave on *.* to 'test_master2'@'%';
Bin_log на Master-2:
MariaDB [(none)]> show master status;
+--------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +--------------------+----------+--------------+------------------+ | mariadb-bin.000001 | 667 | | | +--------------------+----------+--------------+------------------+ 1 row in set (0.000 sec)
Приступим к настройке подключения между серверами MariaDB в нашем програмном кластере:
Останавливаем slave:
STOP SLAVE;
Добавляем Master-1 на второй сервер:
CHANGE MASTER TO MASTER_HOST='IP_master1', MASTER_USER='test_master', MASTER_PASSWORD='test_master', MASTER_LOG_FILE='mariadb-bin.000002', MASTER_LOG_POS=664;
Запускаем репликацию:
START SLAVE;
Подключаемся на Master-1 и выполним ту же процедуру, только указав уже данные второго нашего сервера:
STOP SLAVE;
CHANGE MASTER TO MASTER_HOST='183.219.19.36', MASTER_USER='test_master2', MASTER_PASSWORD='test_master2', MASTER_LOG_FILE='mariadb-bin.000001', MASTER_LOG_POS=667;
START SLAVE;
Проверим статус второго сервера:
show slave status G
Как видим на скриншотах, коннекты на двух серверах есть, ошибок не наблюдается.
3. Проверка репликации между серверами MariaDB.
Далее, чтобы проверить, что репликация между двумя серверами MariaDB работает в режиме master+master и что она вообще работает, мы создадим новую базу на Master-1 и создадим в ней таблицу.
MariaDB [(none)]> create database master1;
Query OK, 1 row affected (0.001 sec)
MariaDB [(none)]> use master1;
Database changed
MariaDB [master1]> CREATE TABLE hello (
-> AuthorID INT NOT NULL AUTO_INCREMENT,
-> AuthorName VARCHAR(100),
-> PRIMARY KEY(AuthorID)
-> );
Query OK, 0 rows affected (0.005 sec)
Проверяем, что база автоматически появилась и на втором мастере, и в ней также присутствует наша таблица:
MariaDB [(none)]> show databases;
+--------------------+ | Database | +--------------------+ | information_schema | | master1 | | mysql | | performance_schema | +--------------------+ 4 rows in set (0.001 sec)
MariaDB [(none)]> use master1;
MariaDB [master1]> show tables;
+-------------------+ | Tables_in_master1 | +-------------------+ | hello | +-------------------+ 1 row in set (0.000 sec)
База создалась и на втором мастере. Для полной проверки, создадим таблицу в базе данных master1 со второго мастер-сервера и проверим, передадутся ли они в обратную сторону.
MariaDB [master1]> CREATE TABLE hello_master1 (
-> AuthorID INT NOT NULL AUTO_INCREMENT,
-> AuthorName VARCHAR(100),
-> PRIMARY KEY(AuthorID)
-> );
Query OK, 0 rows affected (0.006 sec)
Таблица hello_master1 передалась на первый сервер:
MariaDB [master1]> show tables;
+-------------------+ | Tables_in_master1 | +-------------------+ | hello | | hello_master1 | +-------------------+ 2 rows in set (0.000 sec)
Как вы видите, новая таблица появилась на Master-1. Репликация работает так, как мы и хотели.
Настройка Master-Slave репликации в MariaDB
В данном варианте репликации один сервер выступает в роли Slave-сервера, на который постоянно передаются данные с Master. Все изменения, которые будут проводится на сервере Slave, передаваться на Master не будут. Это более отказоустойчивый тип репликации баз данных. Чаще всего используется именно такой вариант. В такой конфигурации у вас всегда будет backup-сервер с актуальными данными, а при сбое на Slave-серверах, информация на Master-сервере не будет потеряна. Так же можно распределить нагрузку на БД для вашего проекта, чтобы приложения осуществляли чтение со Slave серверов, а данные записывались только через Master сервер. Таким образом вы сводите к минимуму отклик БД.
При настройке реплики базы данных MariaDB по типу master + slave, мастер сервера (master1) настраивается как описано выше.
Переходим к slave серверу. Добавляем в my.cnf строки:
#replication
server-id = 2
report_host = slave2
log_bin = /var/lib/mysql/mariadb-bin
log_bin_index = /var/lib/mysql/mariadb-bin.index
relay_log = /var/lib/mysql/relay-bin
relay_log_index = /var/lib/mysql/relay-bin.index
Перезапускаем mariadb. На первом сервере берем данные bin_log.
MariaDB [(none)]> show master status;
+--------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +--------------------+----------+--------------+------------------+ | mariadb-bin.000001 | 664 | | | +--------------------+----------+--------------+------------------+ 1 row in set (0.000 sec)
На slave сервер в консоли консоли mysql выполняем следующее:
MariaDB [(none)]> STOP SLAVE;
Query OK, 0 rows affected, 1 warning (0.000 sec)
MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST='IP_master', MASTER_USER='test_master', MASTER_PASSWORD='test_master', MASTER_LOG_FILE='mariadb-bin.000001', MASTER_LOG_POS=664;
Query OK, 0 rows affected (0.014 sec)
MariaDB [(none)]> START SLAVE;
SET GLOBAL read_only = ON;
При этом также нужно создать дамп базы данных и использовать его для инициальной загрузки данных в MariaDВ на slave сервере.
Проверка статуса Slave:
SHOW SLAVE STATUSG;
Создаем БД на Master:
MariaDB [(none)]> create database master_hello;
Query OK, 1 row affected (0.001 sec)
Проверяем, что база данных создалась и на Slave сервер:
MariaDB [(none)]> show databases;
+--------------------+ | Database | +--------------------+ | information_schema | | master_hello | | master_test | | mysql | | performance_schema | | test | +--------------------+ 6 rows in set (0.001 sec)
Создадим БД на Slave и проверим, передались ли данные на наш Master.
Как видите, базу мы создали, и она есть на Slave. Проверяем, появилась ли она на Master. Ее нет. Репликация со slave на master не идет.
То есть репликация MariaDB работает только в одну сторону. Сделаем еще одну проверку, удалив БД master_hello с Slave-сервера:
И проверим, не удалилась ли она на Master-сервере:
Как мы видим, все в порядке и база на месте.
P.S. При настройке реплики, вы можете столкнуться с некоторыми подводными камнями, самый частый из них — это firewall. По умолчанию на Centos 7 установлен брандмауэр firewalld, в котором закрыт порт 3306, который и использует MariaDB. Вы можете либо открыть данный порт через iptables, либо отключить ваш сетевой экран (плохой вариант).
По-умолчанию в конфигурации my.cnf в параметре bind-address указан IP адрес, на котором ожидаются подключения к базе (
bind-address = 127.0.0.1
). Чтобы разрешить и локальные и внешние подключения, нужно раскомментировать эту строку и добавить правило iptables, разрешающее подключения с IP адреса мастер/слейв сервера порne 3306.
iptables -I INPUT -p tcp -s ip_address_slave_server --dport 3306 -j ACCEPT
iptables -I INPUT -p tcp --dport 3306 -j DROP
При первичной настройке я столкнулся с такой проблемой и она легко выявляется. Если запустить проверку статуса Slave «SHOW SLAVE STATUSG;», вы увидите ошибку:
Также в заключении хотелось бы сказать, что можно к конфигурации блока #replication в файле my.cnf добавить некоторые параметры. Ниже я приведу примеры и краткое описание параметров, которые мы прописывали, а также приведу примеры других функций, полезных при настройке репликации.
server-id = 1
— указываем ID сервера, обычно начинаем с 1, но можно использовать любую цифру, главное чтобы она не совпадала с другими серверами, которые будут задействованы в репликации.
report_host = master
— обычно прописывается хостнейм сервера, можно указать IP-адрес
log_bin = /var/lib/mysql/mariadb-bin
— путь до журнала обновлений
log_bin_index = /var/lib/mysql/mariadb-bin.index
— позволяет узнать, какой журнал на данный момент активен и какие журналы ранее были использованы.
relay_log = /var/lib/mysql/relay-bin
relay_log_index = /var/lib/mysql/relay-bin.index
— сами логи репликации
Какие параметры еще можно использовать? Если вам нужно настроить реплику только для конкретной базы или нескольких, добавляем функцию:
replicate-do-db = имябд
— если нужно несколько БД, перечисляем через запятую.
Исключение каких-либо БД из репликации:
binlog-ignore-db = имябд
Обычно исключаются служебные базы, такие как:
information_schema ,mysql и performance_schema
Время хранения bin_log:
expire_logs_days = 10
— где 10 это количество дней которые будут храниться логи.
Так же, если данные с Master-сервера, записываются в БД не такого же названия, это тоже можно настроить в конфигурационном файле:
replicate-rewrite-db=имябдмастера->имябдслейв
На этом все наши настройки закончены. Думаю, с помощью данной статьи вы без проблем сможете настроить репликацию БД MariaDB как в режиме Master + Master, так и Master + Slave.
Linux
MariaDB: Настройка репликации базы данных в режиме Master-Master/Slave