Репликация в 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 STATUS\G;
Создаем БД на 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 STATUS\G;», вы увидите ошибку:
Также в заключении хотелось бы сказать, что можно к конфигурации блока #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.