MariaDB Konfigurowanie replikacji bazy danych w trybie Master-Master / Slave

Replikacja w bazach danych SQL to proces kopiowania danych z jednego źródła do drugiego (lub kilku) i odwrotnie. Dane z jednego serwera bazy danych są stale kopiowane na jeden lub więcej innych serwerów. Za pomocą replikacji możesz rozłożyć obciążenie serwera, zapewnić odporność na awarie i wysoką dostępność baz danych MariaDB. DBMS MariaDB / MySQL pozwala na użycie dwóch rodzajów replikacji bazy danych: Master-Master i Master-Slave. W tym artykule przyjrzymy się, jak skonfigurować oba typy replikacji MariaDB w CentOS 7. Zacznijmy!

Treść

  • Zainstaluj MariaDB.
  • Skonfiguruj replikację Master-Master w MariaDB
  • Skonfiguruj replikację Master-Slave w MariaDB

Zainstaluj MariaDB.

Wcześniej opublikowaliśmy artykuł opisujący proces instalacji MariaDB na CentOS 7. Możesz się z nim zapoznać na https://winitpro.ru/index.php/2019/08/28/ustanovka-i-optimizaciya-mariadb/. Dlatego nie skupimy się na instalacji samej MariaDB, ale od razu przejdziemy do konfiguracji replikacji.

Skonfiguruj replikację Master-Master w MariaDB

W schemacie replikacji Master-Master każdy z serwerów bazy danych MariaDB / MySQL może być używany zarówno do zapisu informacji, jak i do odczytu. Wiele osób uważa, że ​​tego typu replikacja nie jest do końca atrakcyjna. Jeśli jeden z serwerów ulegnie awarii, bardziej prawdopodobne jest, że dane zostaną utracone na innych serwerach głównych. Zazwyczaj ten schemat jest używany, gdy wszystkie serwery muszą zapewniać zarówno zapis, jak i odczyt informacji..

Replikacja oparta jest na specjalnym pliku binlog, w którym serwer główny zapisuje wszystkie operacje na bazie danych. Serwer Slave łączy się z urządzeniem głównym i stosuje polecenia do swoich baz danych.

1. MariaDB: Konfigurowanie pierwszego serwera głównego (Master-1)

Dodaj do naszego pliku konfiguracyjnego my.cnf na pierwszym serwerze MariaDB następujące linie:

#replikacja
server-id = 1
report_host = master
log_bin = / var / lib / mysql / mariadb-bin
log_bin_index = /var/lib/mysql/mariadb-bin.index
przekaźnik_log = / var / lib / mysql / relay-bin
relay_log_index = /var/lib/mysql/relay-bin.index

restart usługi mariadb

Utwórz użytkownika, aby skonfigurować replikację:

mysql
utwórz użytkownika „test_master” @ „%” zidentyfikowany przez „test_master”;
przyznaj replikację slave na *. * do 'test_master' @ '%';

Aby dodać Slave, potrzebujemy danych bin_log z serwera Master1.

MariaDB [(brak)]> pokaż status mistrza;

+--------------------+----------+--------------+------------------+ | Plik | Pozycja | Binlog_Do_DB | Binlog_Ignore_DB | + -------------------- + ---------- + -------------- + - ---------------- + | mariadb-bin.000002 | 664 | | | + -------------------- + ---------- + -------------- + - ---------------- + 1 rząd w zestawie (0,000 s) 

To będzie nasz Master-1.

2. MariaDB: Konfigurowanie drugiego serwera głównego (Master-2)

Połącz się z drugim serwerem MariaDB, otwórz plik konfiguracyjny my.cnf i dodaj informacje:

#replikacja
server-id = 2
report_host = master2
log_bin = / var / lib / mysql / mariadb-bin
log_bin_index = /var/lib/mysql/mariadb-bin.index
przekaźnik_log = / var / lib / mysql / relay-bin
relay_log_index = /var/lib/mysql/relay-bin.index

A także utwórz użytkownika na drugim serwerze:

utwórz użytkownika „test_master2” @ „%” identyfikowany przez „test_master2”;
przyznaj replikację slave na *. * do 'test_master2' @ '%';

Bin_log na Master-2:

MariaDB [(brak)]> pokaż status mistrza;

+--------------------+----------+--------------+------------------+ | Plik | Pozycja | Binlog_Do_DB | Binlog_Ignore_DB | + -------------------- + ---------- + -------------- + - ---------------- + | mariadb-bin.000001 | 667 | | | + -------------------- + ---------- + -------------- + - ---------------- + 1 rząd w zestawie (0,000 s)

Ustawmy połączenie między serwerami MariaDB w naszym klastrze oprogramowania:

Zatrzymaj niewolnika:

STOP NIEWOLNO;

Dodaj Master-1 do drugiego serwera:

ZMIEŃ MASTER NA MASTER_HOST = „IP_master1”, MASTER_USER = „test_master”, MASTER_PASSWORD = „test_master”, MASTER_LOG_FILE = „mariadb-bin.000002”, MASTER_LOG_POS = 664;

Rozpoczynamy replikację:

ROZPOCZNIJ SLAVE

Jesteśmy połączeni z Master-1 i wykonujemy tę samą procedurę, tylko podając dane naszego drugiego serwera:

STOP NIEWOLNO;
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;
ROZPOCZNIJ SLAVE

Sprawdź status drugiego serwera:

pokaż status slave \ G

Jak widać na zrzutach ekranu, istnieją połączenia na dwóch serwerach, nie obserwuje się błędów.

3. Sprawdź replikację między serwerami MariaDB.

Następnie, aby sprawdzić, czy replikacja między dwoma serwerami MariaDB działa w trybie master + master i czy ogólnie działa, utworzymy nową bazę na Master-1 i utworzymy w niej tabelę.

MariaDB [(brak)]> utwórz bazę danych master1;

Zapytanie OK, problem dotyczy 1 wiersza (0,001 s)


MariaDB [(brak)]> use master1;

Baza danych zmieniona

MariaDB [master1]> CREATE TABLE witaj (

-> AuthorID INT NOT NULL AUTO_INCREMENT,

-> AutorName VARCHAR (100),

-> KLUCZ PODSTAWOWY (AuthorID)

->);

Zapytanie OK, dotyczy 0 wierszy (0,005 s)

Sprawdzamy, czy baza danych automatycznie pojawiła się na drugim wzorcu, a nasza tabela również w niej jest obecna:

MariaDB [(brak)]> pokaż bazy danych;

+--------------------+ | Baza danych | + -------------------- + | schemat_informacyjny | | master1 | | mysql | | performance_schema | + -------------------- + 4 rzędy w zestawie (0,001 s)

MariaDB [(brak)]> use master1;

MariaDB [master1]> pokaż tabele;

+-------------------+ | Tables_in_master1 | + ------------------- + | cześć | + ------------------- + 1 rząd w zestawie (0,000 s) 

Baza została stworzona na drugim urządzeniu głównym. W celu pełnego sprawdzenia utwórz tabelę w bazie danych master1 z drugiego serwera głównego i sprawdź, czy są one przesyłane w przeciwnym kierunku.

MariaDB [master1]> CREATE TABLE hello_master1 (

-> AuthorID INT NOT NULL AUTO_INCREMENT,

-> AutorName VARCHAR (100),

-> KLUCZ PODSTAWOWY (AuthorID)

->);

Zapytanie OK, dotyczy 0 wierszy (0,006 s)

Tabela hello_master1 została przekazana do pierwszego serwera:

MariaDB [master1]> pokaż tabele;

+-------------------+ | Tables_in_master1 | + ------------------- + | cześć | | hello_master1 | + ------------------- + 2 rzędy w zestawie (0,000 s) 

Jak widać, na Master-1 pojawił się nowy stół. Replikacja działa tak, jak chcieliśmy.

Skonfiguruj replikację Master-Slave w MariaDB

W tej wersji replikacji jeden serwer działa jak serwer podrzędny, do którego dane z urządzenia nadrzędnego są stale przesyłane. Wszystkie zmiany, które zostaną wprowadzone na serwerze Slave, nie zostaną przeniesione do Master. Jest to typ replikacji bazy danych w trybie failover. Najczęściej ta opcja jest używana. W tej konfiguracji zawsze będziesz mieć serwer zapasowy z aktualnymi danymi, a jeśli zawiedzie na serwerach Slave, informacje na serwerze głównym nie zostaną utracone. Możesz także rozłożyć obciążenie bazy danych dla twojego projektu, tak aby aplikacje odczytywały z serwerów Slave, a dane były rejestrowane tylko przez serwer Master. W ten sposób minimalizujesz odpowiedź bazy danych.

Podczas konfigurowania repliki bazy danych MariaDB jako master + slave serwer master (master1) jest konfigurowany jak opisano powyżej.

Przechodzimy do serwera slave. Dodaj linie do my.cnf:

#replikacja
server-id = 2
report_host = slave2
log_bin = / var / lib / mysql / mariadb-bin
log_bin_index = /var/lib/mysql/mariadb-bin.index
przekaźnik_log = / var / lib / mysql / relay-bin
relay_log_index = /var/lib/mysql/relay-bin.index

Ponowne uruchamianie mariadbu. Na pierwszym serwerze pobieramy dane bin_log.

MariaDB [(brak)]> pokaż status mistrza;

+--------------------+----------+--------------+------------------+ | Plik | Pozycja | Binlog_Do_DB | Binlog_Ignore_DB | + -------------------- + ---------- + -------------- + - ---------------- + | mariadb-bin.000001 | 664 | | | + -------------------- + ---------- + -------------- + - ---------------- + 1 rząd w zestawie (0,000 s)

Na serwerze podrzędnym w konsoli konsoli mysql wykonaj następujące czynności:

MariaDB [(brak)]> STOP NIEWOLNO;

Zapytanie OK, dotyczy 0 wierszy, 1 ostrzeżenie (0,000 s)

MariaDB [(brak)]> 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;

Zapytanie OK, dotyczy 0 wierszy (0,014 s)

MariaDB [(brak)]> START SLAVE;

Podczas konfigurowania replikacji dla istniejącej bazy danych MariDB, przed rozpoczęciem replikacji należy ustawić bazę danych w trybie odczytu, aby plik binlog nie był aktualizowany.

USTAW GLOBALNIE read_only = ON;

W tym samym czasie musisz również utworzyć zrzut bazy danych i użyć go do początkowego ładowania danych do MariaDВ na serwerze podrzędnym.

Sprawdź status Slave: POKAŻ STATUS SLAVE \ G;

Utwórz bazę danych na Master:

MariaDB [(brak)]> utwórz bazę danych master_hello;

Zapytanie OK, problem dotyczy 1 wiersza (0,001 s)

Sprawdzamy, czy baza danych została również utworzona na serwerze Slave:

MariaDB [(brak)]> pokaż bazy danych;

+--------------------+ | Baza danych | + -------------------- + | schemat_informacyjny | | master_hello | | master_test | | mysql | | performance_schema | | test | + -------------------- + 6 rzędów w zestawie (0,001 s) 

Utwórzmy bazę danych na Slave i sprawdź, czy dane zostały przesłane do naszego Master.

Jak widać, stworzyliśmy bazę, która jest na Slave. Sprawdź, czy pojawiła się na Mistrzu. Nie ma jej tam. Replikacja z urządzenia slave do master nie przebiega.

Oznacza to, że replikacja MariaDB działa tylko w jeden sposób. Zróbmy jeszcze jedną kontrolę, usuwając bazę danych master_hello z serwera Slave:

I sprawdź, czy przeszła na emeryturę na serwerze głównym:

Jak widzimy, wszystko jest w porządku, a baza jest na miejscu.

P.S. Podczas konfigurowania repliki mogą wystąpić pewne pułapki, z których najczęstszą jest zapora ogniowa. Domyślnie Centos 7 ma zainstalowany firewalld, który ma zamknięty port 3306, z którego korzysta MariaDB. Możesz otworzyć ten port za pomocą iptables lub wyłączyć zaporę ogniową (zła opcja).

Domyślnie w konfiguracji my.cnf parametr bind-address określa adres IP, pod którym oczekiwane są połączenia z bazą danych (adres powiązania = 127.0.0.1) Aby zezwolić zarówno na połączenia lokalne, jak i zewnętrzne, należy odkomentować tę linię i dodać regułę iptables, która zezwala na połączenia z adresu IP serwera master / slave portu 3306.

iptables -I WEJŚCIE -p tcp -s ip_address_slave_server --port 3306 -j AKCEPTUJ
iptables -I WEJŚCIE -p tcp --port 3306 -j DROP

Podczas początkowej konfiguracji napotkałem taki problem i można go łatwo wykryć. Jeśli uruchomisz sprawdzanie statusu SlavePOKAŻ STATUS SLAVE \ G;”zobaczysz błąd:

Podsumowując, chciałbym powiedzieć, że możesz dodać pewne parametry do konfiguracji bloku #replication w pliku my.cnf. Poniżej podam przykłady i krótki opis parametrów, które przepisaliśmy, a także przykłady innych funkcji przydatnych w konfiguracji replikacji.

server-id = 1 - podaj identyfikator serwera, zwykle zaczynając od 1, ale możesz użyć dowolnego numeru, najważniejsze jest to, że nie pokrywa się on z innymi serwerami, które będą zaangażowane w replikację.

report_host = master - zazwyczaj nazwa hosta serwera jest zarejestrowana, możesz podać adres IP

log_bin = / var / lib / mysql / mariadb-bin - ścieżka do aktualizacji dziennika

log_bin_index = /var/lib/mysql/mariadb-bin.index - pozwala dowiedzieć się, który dziennik jest aktualnie aktywny i które dzienniki były wcześniej używane.

przekaźnik_log = / var / lib / mysql / relay-bin

relay_log_index = /var/lib/mysql/relay-bin.index - same dzienniki replikacji

Jakich innych opcji mogę użyć? Jeśli musisz skonfigurować replikę tylko dla określonej bazy danych lub kilku, dodaj funkcję:

replicate-do-db = nazwa_bazy - jeśli potrzebujesz kilku baz danych, wypisz je przecinkami.

Wykluczenie jakichkolwiek baz danych z replikacji:

binlog-ignore-db = nazwa_bazy

Bazy danych usług, takie jak:

Information_schema, mysql i performance_schema

Czas przechowywania bin_log:

expire_logs_days = 10 - gdzie 10 to liczba dni, w których dzienniki będą przechowywane.

Ponadto, jeśli dane z serwera głównego nie są zapisane w bazie danych o tej samej nazwie, można to również skonfigurować w pliku konfiguracyjnym:

replicate-rewrite-db = dbmaster-> dbname

To wszystko, nasze ustawienia są gotowe. Myślę, że przy pomocy tego artykułu można łatwo skonfigurować replikację bazy danych MariaDB w trybie Master + Master i Master + Slave.