Репликацията в 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 сървърът запазва всички операции с база данни. Подчинен сървър се свързва с главния и прилага команди към неговите бази данни.
1. MariaDB: Настройка на първия главен сървър (Master-1)
Добавете към нашия конфигурационен файл my.cnf на първия сървър на MariaDB, следните редове:
#replication
server-id = 1
report_host = главен
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
Създайте потребител за конфигуриране на репликация:
MySQL
създайте потребител 'test_master' @ '%', идентифициран от 'test_master';
дайте роб на репликацията на *. * на 'test_master' @ '%';
За да добавим Slave имаме нужда от данни bin_log от Master1 сървър.
MariaDB [(няма)]> покажи статуса на главния;
+--------------------+----------+--------------+------------------+ | Файл | Позиция | Binlog_Do_DB | Binlog_Ignore_DB | + -------------------- + ---------- + -------------- + - ---------------- + | mariadb-bin.000002 | 664 | | | + -------------------- + ---------- + -------------- + - ---------------- + 1 ред в комплект (0,000 сек)
Това ще бъде нашият 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
И също така да създадете потребител на втория сървър:
създаване на потребител 'test_master2' @ '%', идентифициран от 'test_master2';
предоставете роб на репликацията на *. * на 'test_master2' @ '%';
Bin_log на Master-2:
MariaDB [(няма)]> покажи статуса на главния;
+--------------------+----------+--------------+------------------+ | Файл | Позиция | Binlog_Do_DB | Binlog_Ignore_DB | + -------------------- + ---------- + -------------- + - ---------------- + | mariadb-bin.000001 | 667 | | | + -------------------- + ---------- + -------------- + - ---------------- + 1 ред в комплект (0,000 сек)
Нека да настроим връзката между MariaDB сървърите в нашия софтуерен клъстер:
Спрете роба:
СТОП СЛАВ;
Добавете Master-1 към втория сървър:
ИЗМЕНЕТЕ МАЙСТЪР НА MASTER_HOST = "IP_master1", MASTER_USER = "test_master", MASTER_PASSWORD = "test_master", MASTER_LOG_FILE = "mariadb-bin.000002", MASTER_LOG_POS = 664;
Започваме репликация:
СТАРТ СЛАВ
Свързани сме с Master-1 и извършваме същата процедура, само като посочим данните на нашия втори сървър:
СТОП СЛАВ;
ПРОМЯНЕ МАЙСТЪР НА MASTER_HOST = "183.219.19.36", MASTER_USER = "test_master2", MASTER_PASSWORD = "test_master2", MASTER_LOG_FILE = "mariadb-bin.000001", MASTER_LOG_POS = 667;
СТАРТ СЛАВ
Проверете състоянието на втория сървър:
показване на статута на робата \ G
Както можете да видите на екранните снимки, има връзки на два сървъра, не се наблюдават грешки.
3. Проверете репликацията между MariaDB сървърите.
На следващо място, за да проверим дали репликацията между двата сървъра MariaDB работи в режим master + master и че по принцип работи, ще създадем нова база в Master-1 и ще създадем таблица в нея.
MariaDB [(няма)]> създаване на база данни master1;
Заявка ОК, засегнат 1 ред (0,001 сек)
MariaDB [(няма)]> използвайте master1;
Базата данни е променена
MariaDB [master1]> СЪЗДАВАНЕ НА ТАБЛИЦА здравей (
-> AuthorID НЕ НОЛЕН AUTO_INCREMENT,
-> Автор Име VARCHAR (100),
-> ОСНОВЕН КЛЮЧ (AuthorID)
->);
Запитване ОК, засегнати 0 реда (0,005 сек)
Проверяваме дали базата данни автоматично се е появила на втория главен и нашата таблица също присъства в нея:
MariaDB [(няма)]> показване на бази данни;
+--------------------+ | База данни | + -------------------- + | информация_схема | | майстор1 | | mysql | | performance_schema | + -------------------- + 4 реда в комплект (0,001 сек)
MariaDB [(няма)]> използвайте master1;
MariaDB [master1]> покажи таблици;
+-------------------+ | Таблици_в_мастер1 | + ------------------- + | здравей | + ------------------- + 1 ред в комплект (0,000 сек)
Основата е създадена на втория майстор. За пълна проверка създайте таблица в базата данни master1 от втория главен сървър и проверете дали те са прехвърлени в обратна посока.
MariaDB [master1]> СЪЗДАВАНЕ НА ТАБЛИЦА hello_master1 (
-> AuthorID НЕ НОЛЕН AUTO_INCREMENT,
-> Автор Име VARCHAR (100),
-> ОСНОВЕН КЛЮЧ (AuthorID)
->);
Заявка ОК, засегнати 0 реда (0,006 сек)
Таблицата hello_master1 беше предадена на първия сървър:
MariaDB [master1]> покажи таблици;
+-------------------+ | Таблици_в_мастер1 | + ------------------- + | здравей | | hello_master1 | + ------------------- + 2 реда в комплект (0,000 сек)
Както можете да видите, на Master-1 се появи нова таблица. Репликацията работи по начина, по който искахме.
Конфигурирайте Master-Slave репликация в MariaDB
В тази версия на репликация, един сървър действа като подчинен сървър, на който непрекъснато се предават данни от главния. Всички промени, които ще бъдат направени на Slave сървъра, няма да бъдат прехвърлени към Главния. Това е по-променлив тип репликация на база данни. Най-често се използва тази опция. В тази конфигурация винаги ще имате резервен сървър с актуални данни и ако той не успее на Slave сървъри, информацията на Master сървъра няма да бъде загубена. Можете също така да разпределите натоварването в базата данни за вашия проект, така че приложенията да се четат от Slave сървъри, а данните да се записват само през Master сървъра. По този начин свеждате до минимум отговора на базата данни.
Когато конфигурирате репликата на базата данни MariaDB като master + slave, сървърът master (master1) се конфигурира, както е описано по-горе.
Преминаваме към подчинения сървър. Добавете редовете към 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 [(няма)]> покажи статуса на главния;
+--------------------+----------+--------------+------------------+ | Файл | Позиция | Binlog_Do_DB | Binlog_Ignore_DB | + -------------------- + ---------- + -------------- + - ---------------- + | mariadb-bin.000001 | 664 | | | + -------------------- + ---------- + -------------- + - ---------------- + 1 ред в комплект (0,000 сек)
На подчинения сървър в конзолата mysql направете следното:
MariaDB [(няма)]> STOP SLAVE;
Запитване ОК, засегнати 0 реда, 1 предупреждение (0,000 сек)
MariaDB [(няма)]> ПРОМЕНИ МАЙСТЕР НА MASTER_HOST = "IP_master", MASTER_USER = "test_master", MASTER_PASSWORD = "test_master", MASTER_LOG_FILE = "mariadb-bin.000001", MASTER_LOG_POS = 664;
Заявка ОК, засегнати 0 реда (0,014 сек)
MariaDB [(няма)]> START SLAVE;
SET GLOBAL read_only = ВКЛЮЧЕН;
В същото време също трябва да създадете сметище за база данни и да го използвате за първоначално зареждане на данни в MariaDВ на подчинения сървър.
Проверете състоянието на подчинените: ПОКАЗАНЕ СТАТУТ НА РАБОТЕ \ G;
Създайте база данни на Master:
MariaDB [(няма)]> създаване на база данни master_hello;
Заявка ОК, засегнат 1 ред (0,001 сек)
Проверяваме дали базата данни е създадена и на Slave сървъра:
MariaDB [(няма)]> показване на бази данни;
+--------------------+ | База данни | + -------------------- + | информация_схема | | master_hello | | master_test | | mysql | | performance_schema | | тест | + -------------------- + 6 реда в комплект (0,001 сек)
Нека създадем база данни на Slave и да проверим дали данните са били прехвърлени на нашия Главен.
Както можете да видите, ние създадохме основата и тя е на Slave. Проверете дали се е появила на Учителя. Тя не е там. Репликацията от роб на господар не върви.
Тоест, репликацията на MariaDB работи само по един начин. Нека да направим още една проверка, като изтрием базата данни master_hello от Slave сървъра:
И проверете дали тя се е оттеглила на главния сървър:
Както виждаме, всичко е наред и основата е на мястото си.
Послепис Когато настройвате реплика, може да срещнете някои клопки, най-честата от тях е защитната стена. По подразбиране Centos 7 има инсталиран firewalld, който има затворен порт 3306, който MariaDB използва. Можете или да отворите този порт чрез iptables или да деактивирате защитната си стена (лоша опция).
По подразбиране в my.cnf конфигурацията параметърът bind-address указва IP адреса, на който се очакват връзки към базата данни (bind-address = 127.0.0.1
). За да разрешите както локални, така и външни връзки, трябва да коментирате този ред и да добавите правило за iptables, което позволява връзки от IP адреса на главния / подчинен сървър на порт 3306.
iptables -I INPUT -p tcp -s ip_address_slave_server --dport 3306 -j ACCEPT
iptables -I INPUT -p tcp --dport 3306 -j DROP
По време на първоначалната настройка срещнах такъв проблем и той лесно се открива. Ако стартирате проверка на статуса на подчиненПОКАЗАНЕ СТАТУТ НА РАБОТЕ \ G;", ще видите грешка:
В заключение бих искал да кажа, че можете да добавите някои параметри към конфигурацията на блока #replication във файла my.cnf. По-долу ще дам примери и кратко описание на параметрите, които предписахме, както и примери за други функции, полезни за настройка на репликация.
server-id = 1
- посочете идентификационния номер на сървъра, обикновено започвате с 1, но можете да използвате произволен номер, основното е, че не съвпада с други сървъри, които ще участват в репликация.
report_host = главен
- обикновено името на хоста на сървъра е регистрирано, можете да посочите 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
- репликация се регистрира
Какви други опции мога да използвам? Ако трябва да конфигурирате репликата само за конкретна база данни или няколко, добавете функцията:
replify-do-db = dbname
- ако имате нужда от няколко бази данни, избройте го със запетая.
Изключване на всякакви бази данни от репликация:
binlog-ignore-db = dbname
Бази данни за услуги, като:
информация_schema, mysql и performance_schema
Време за съхранение в Bin_log:
expire_logs_days = 10
- където 10 е броят на дните, в които ще се съхраняват дневниците.
Освен това, ако данните от главния сървър не са записани в базата данни със същото име, това може да бъде конфигурирано и в конфигурационния файл:
repplic-rewrite-db = dbmaster-> dbname
Това са всичките ни настройки. Мисля, че с помощта на тази статия можете лесно да конфигурирате репликацията на базата данни на MariaDB в режимите Master + Master и Master + Slave.