Реплікація в 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 створити користувач грант реплікації веденого

Це буде наш 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 в нашому програмному кластері:

Ми зупиняємо раба:

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: запустити раба

Підключаємося на 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 показує статус підлеглого  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 (

-> Ідентифікатор автора INT NOT NULL AUTO_INCREMENT,

-> Ім’я автора VARCHAR (100),

-> ПЕРВИННИЙ КЛЮЧ (Ідентифікатор автора)

->);

Запит нормальний, 0 рядків уражено (0,005 сек)

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,

-> Ім’я автора VARCHAR (100),

-> ПЕРВИННИЙ КЛЮЧ (Ідентифікатор автора)

->);

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 сервері.

Перевірити статус підлеглого: 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 не йде.

показати бази даних

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

drop database і перевірка реплікації

І перевіримо, чи не пішла вона на Master-сервері:

тест реплікації mariadb

Як ми бачимо, все в порядку і база на місці.

PS Під час налаштування репліки, ви можете зіткнутися з деякими підводними каменями, найчастіший з них – це 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 «ПОКАЗАТИ СТАН РОБУ G;», Ви побачите помилку:

Last_IO_error: помилка підключення до ведучого: 3306 - час повторної спроби: 60 не вдається підключитися до сервера MySQL (немає маршруту до хосту)

Також на завершення хотілося б сказати, що можна до конфігурації блоку #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 = имябд

Зазвичай виключаються службові бази, такі як:

Інформаційна схема, MySQL та Performance_Schema

Час зберігання bin_log:

expire_logs_days = 10 – де 10 це кількість днів які будуть зберігатися логи.

Так само, якщо дані з Master-сервера, записуються в БД не такого ж назви, це теж можна налаштувати в файлі конфігурації:

replicate-rewrite-db=имябдмастера->имябдслейв

На цьому всі наші настройки закінчені. Думаю, за допомогою даної статті ви без проблем зможете налаштувати реплікацію БД MariaDB як в режимі Master + Master, так і Master + Slave.

Leave a Reply

Your email address will not be published. Required fields are marked *