Реплікація в 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;
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.