MariaDB Налаштування реплікації бази даних в режимі Master-Master / Slave

Реплікація в SQL базах даних це процес копіювання даних з одного джерела в інший (або на кілька) і в обратнуюм сторону. Дані з одного сервера баз даних, постійно копіюються на один або кілька інших серверів. За допомогою реплікації можна розподіляти навантаження на сервера, забезпечувати відмовостійкість і високу доступність баз даних MariaDB. СУБД MariaDB / MySQL дозволяє використовувати два типи реплікації БД Master-Master і Master-Slave. У даній статті ми розглянемо, як налаштувати обидва типи реплікації MariaDB в CentOS 7. Почнемо!

зміст:

  • установка MariaDB.
  • Налаштування реплікації Master-Master в MariaDB
  • Налаштування Master-Slave реплікації в MariaDB

установка 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;

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

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.