MariaDB: Настройка репликации базы данных в режиме Master-Master/Slave

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

mariadb настройка my.cnf на мастер сервере репликации

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)

mysql create user grant replication slave

Это будет наш 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

mariadb настройка my.cnf второго сервера при master-master репликации

И так же создаем пользователя на втором сервере:

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;

mariadb: 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

mariadb 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 проверка репликации

Проверяем, что база автоматически появилась и на втором мастере, и в ней также присутствует наша таблица:

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)

репликация таблицы межды базыва mariadb/mysql

Как вы видите, новая таблица появилась на 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;

При настройке репликации для существующей базы данных MariDB перед стартом репликации нужно перевести базу данных в режим чтения, чтобы файл binlog не обновлялся.

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)

настройка репликации master-slave между двумя серверами mariadb

Создадим БД на Slave и проверим, передались ли данные на наш Master.

проверка репликации master-slave

Как видите, базу мы создали, и она есть на Slave. Проверяем, появилась ли она на Master. Ее нет. Репликация со slave на master не идет.

show databases

То есть репликация MariaDB работает только в одну сторону. Сделаем еще одну проверку, удалив БД master_hello с Slave-сервера:

drop database и проверка репликации

И проверим, не удалилась ли она на Master-сервере:

test replication mariadb

Как мы видим, все в порядке и база на месте.

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;», вы увидите ошибку:

Last_IO_error: error connecting to master:3306 - retry time: 60 can't connect to MySQL server on (no route to host)

Также в заключении хотелось бы сказать, что можно к конфигурации блока #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