Z góry zaznaczam mariadb jest forkiem (mysql) i to czuć na każdym kroku że rozwód trwa i będzie jeszcze trwał lata, mają bałagan mają problemy w dokumentacji systematycznie zmieniają API zmiana typów danych są tu widoczne (komunikaty że coś jest przestarzałe i będzie usuwane w przyszłej wersji jest tu odczuwalne) tak więc tutek jest dla wersji (11.2.2). Można wykonać replikę różnych wersji (10.4 -> 11.2.2) ale to wymaga ciut więcej gimnastyki bierzmy co oferuje 10.4 i szukamy odpowiedników w 11.2.2, rozpiętości wersji nie opiszę. Replikacja działa również między mysql -> mariadb.
Prace rozpoczniemy od przygotowania struktury katalogów która jest oczywiście indywidualnym wyborem zależnym od naszych upodobań u mnie wszystkie aplikacje "dockerowe" znajdują się w katalogu /share/Container/apps/, jest to ważne przy montowaniu wolumenów.
1) Przygotowanie struktury katalogów u mnie
2) Przygotowanie pliku docker-compose.yaml w katalogu
Moja konfiguracja bazuje na adresach przypisanych przez lokalny serwer DHCP dlatego definiuję mac adresy każdemu interfejsowi
3) Pierwsze uruchomienie baz danych w celu eksportu plików domyślnej konfiguracji.
Odnajdujemy plik docker-compose.yaml "Lokalne urządzenie QNAP"
4) Po uruchomieniu baz danych w cały stack powinien wyglądać
5) Eksport domyślnej konfiguracji serwerów.
Do pliku serwera głównego(primery) primary/my.cnf dopisujemy konfiguracje do na końcu pliku:
Do konfiguracji serwera replikacji (replica) replica/my.cnf dopisujemy:
Uwaga tag [mariadb] może/powinien być zastąpiony tagiem [mysqld] w zależności od bazy wersji bazy danych dla przykładu w wersji 11.2.2 jest [mariadb]
Pełna dokumentacja znajduje znajdziemy pod tym adresem: MariaDB Replication
6) W aplikacji Container-Station klikamy "Utwórz ponownie" aktywujemy zakomentowane dwa wiersze:
Parametry dostępu ro są tu bardzo ważne baza danych będzie ostrzegać jeżeli będą zbyt luźne zostaną zignorowane i baza danych będzie korzystać z domyślnych.
Następnie "Aktualizujemy".
7) Stowrzenie użytkownika "repuser" nadanie mu uprawnieniami replikacji.
8) Konfiguracja replikacji
9) Łączymy się klijentem SQL albo z konsoli jak kto woli
Test:
Oczekujemy że wywołanie query tworzenia tabel "pierwsza", "druga", "trzecia" rozpocznie replikację (stworzenie odpowiednio baz danych) "pierwsza" i "trzecia" na serwerze replika ponieważ serwer replica nie ma na liście bazy danych "druga" nie będzie jej monitorował (tu zwracam uwagę że do replikacji bazy danych "druga" możemy zrobić inny serwer replica który ma na liście: replicate-do-db wpis druga.
Konfiguracje: binlog_do_db, replicate-do-db mają na celu pokazania dość ważnej funkcionalności i są przykładem.
10) Jak zmigrować już istniejąca bazę danych robimy dumpa bazy którą chcemy zreplikować nie to będzie baza danych "druga" która nie była na liście baz danych na serwerze replica.
Tworzymy na replica bazę danych "druga" następnie importujemy dumpa:
Edytujemy plik replica/my.cnf na końcu listy dupisujemy:
replicate-do-db=druga
Restartujemy kontener serwer replic sprawdzamy czy nowa baza danych została dodana do listy replikowanych bazdanych:
Prace rozpoczniemy od przygotowania struktury katalogów która jest oczywiście indywidualnym wyborem zależnym od naszych upodobań u mnie wszystkie aplikacje "dockerowe" znajdują się w katalogu /share/Container/apps/, jest to ważne przy montowaniu wolumenów.
1) Przygotowanie struktury katalogów u mnie
Bash:
cd /share/Container/apps
mkdir -p mariadbs/primary/data
mkdir mariadbs/primary/backup
mkdir -p mariadbs/replica/data
mkdir mariadbs/replica/backup
2) Przygotowanie pliku docker-compose.yaml w katalogu
YAML:
version: "3.8"
name: mariadbs
networks:
qnet-static-eth1-cce8d8:
external: true
# image: mariadb:lts #10.11.6
services:
primary:
image: mariadb:11.2.2
container_name: primary
hostname: primary
mac_address: 2a:ce:58:b9:e9:00
restart: always
networks:
- qnet-static-eth1-cce8d8
environment:
MYSQL_ROOT_PASSWORD: dupa.8
volumes:
- /share/Container/apps/mariadbs/primary/data/:/var/lib/mysql
- /share/Container/apps/mariadbs/primary/backup/:/backup
# - /share/Container/apps/mariadbs/primary/my.cnf:/etc/mysql/my.cnf:ro
ports:
- "3306:3306"
replica:
image: mariadb:11.2.2
container_name: replica
hostname: replica
mac_address: 2a:ce:68:b9:e9:01
restart: always
networks:
- qnet-static-eth1-cce8d8
environment:
MYSQL_ROOT_PASSWORD: dupa.8
volumes:
- /share/Container/apps/mariadbs/replica/data:/var/lib/mysql
- /share/Container/apps/mariadbs/replica/backup/:/backup
# - /share/Container/apps/mariadbs/replica/my.cnf:/etc/mysql/my.cnf:ro
ports:
- "3306:3306"
Moja konfiguracja bazuje na adresach przypisanych przez lokalny serwer DHCP dlatego definiuję mac adresy każdemu interfejsowi
Bash:
docker network ls
3) Pierwsze uruchomienie baz danych w celu eksportu plików domyślnej konfiguracji.
Odnajdujemy plik docker-compose.yaml "Lokalne urządzenie QNAP"
4) Po uruchomieniu baz danych w cały stack powinien wyglądać
5) Eksport domyślnej konfiguracji serwerów.
Bash:
[@NAS mariadbs]$ pwd
/share/Container/apps/mariadbs
[@NAS mariadbs]$ docker compose ps
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
primary mariadb:11.2.2 "docker-entrypoint.s…" primary 43 seconds ago Up 37 seconds
replica mariadb:11.2.2 "docker-entrypoint.s…" replica 43 seconds ago Up 35 seconds
[@NAS mariadbs]$ docker exec -t primary cat /etc/mysql/my.cnf > primary/my.cnf
[@NAS mariadbs]$ docker exec -t replica cat /etc/mysql/my.cnf > replica/my.cnf
Do pliku serwera głównego(primery) primary/my.cnf dopisujemy konfiguracje do na końcu pliku:
Code:
# Konfiguracja serwera w roli primary.
[mariadb]
log-bin
server_id=1
log-basename=primary
binlog-format=mixed
# Lista baz danych, które będą na liście do replikacji. (brak listy oznacza wszystkie)
binlog_do_db=pierwsza
binlog_do_db=druga
binlog_do_db=trzecia
Do konfiguracji serwera replikacji (replica) replica/my.cnf dopisujemy:
Code:
# Konfiguracja serwera w roli replica.
[mariadb]
log-bin
server_id=2
# Lista nazw baz danych, których nazwy są na białej liście do replikacji. (brak listy oznacza wszystkie)
replicate-do-db=pierwsza
replicate-do-db=trzecia
Uwaga tag [mariadb] może/powinien być zastąpiony tagiem [mysqld] w zależności od bazy wersji bazy danych dla przykładu w wersji 11.2.2 jest [mariadb]
Pełna dokumentacja znajduje znajdziemy pod tym adresem: MariaDB Replication
6) W aplikacji Container-Station klikamy "Utwórz ponownie" aktywujemy zakomentowane dwa wiersze:
YAML:
# - /share/Container/apps/mariadbs/primary/my.cnf:/etc/mysql/my.cnf:ro
...
# - /share/Container/apps/mariadbs/replica/my.cnf:/etc/mysql/my.cnf:ro
Następnie "Aktualizujemy".
7) Stowrzenie użytkownika "repuser" nadanie mu uprawnieniami replikacji.
SQL:
-- Tworzymy użytkownika
CREATE USER 'repluser'@'%' IDENTIFIED BY 'P@55w0rd';
-- Nadajemu mu uprawnienia replikacji.
GRANT REPLICATION SLAVE ON *.* TO 'repluser'@'%';
--
FLUSH TABLES WITH READ LOCK;
UNLOCK TABLES;
-- Sprawdzamy status
SHOW MASTER STATUS;
-- NA TYM ETAPIE PRZEJDZ DO KONFIGURACJI REPLICA!!!
-- pierwsza bazadanych, jest i będzie replikowana
CREATE DATABASE pierwsza;
CREATE TABLE pierwsza.players (id INT NOT NULL AUTO_INCREMENT, name VARCHAR(100) NOT NULL, sports VARCHAR(50), PRIMARY KEY(id));
INSERT INTO pierwsza.players (name, sports) VALUES ('a', 'snowboard');
-- DROP DATABASE pierwsza;
-- druga bazadanych, której NIE ma na liście replikacji serwera (replica)
CREATE DATABASE druga;
CREATE TABLE druga.players (id INT NOT NULL AUTO_INCREMENT, name VARCHAR(100) NOT NULL, sports VARCHAR(50), PRIMARY KEY(id));
INSERT INTO druga.players (name, sports) VALUES ('Adaś', 'snowboard');
-- DROP DATABASE druga;
-- trzecia baza danych, która będzie replikowana
CREATE DATABASE trzecia;
CREATE TABLE trzecia.players (id INT NOT NULL AUTO_INCREMENT, name VARCHAR(100) NOT NULL, sports VARCHAR(50), PRIMARY KEY(id));
INSERT INTO trzecia.players (name, sports) VALUES ('Adaś', 'snowboard');
-- DROP DATABASE trzecia;
8) Konfiguracja replikacji
SQL:
-- Jeżeli chcemy modyfikować już istniejące połączenie wpierw zatrzymujemy sitniejące połaczenie.
-- STOP SLAVE;
-- RESET SLAVE;
-- ponieważ serwer primary był podlinkowany do serwisu replica w docker-compose możemy użyć nazwy
CHANGE MASTER TO
MASTER_HOST='primary',
MASTER_USER='repluser',
MASTER_PASSWORD='P@55w0rd',
MASTER_PORT=3306,
MASTER_LOG_FILE='primary-bin.000002', # Odczytujemy z serwera primary SHOW MASTER STATUS;
MASTER_LOG_POS=330, # Odczytujemy z serwera primary SHOW MASTER STATUS;
MASTER_CONNECT_RETRY=60;
-- Dodajemy bo tak
CHANGE MASTER TO MASTER_USE_GTID = no;
-- Uruchamamiamy serwer replikacji
START SLAVE;
-- Sprawdzamy aktualny status replikacji:
SHOW SLAVE STATUS;
-- Jeżeli działa prawidłowo kolumny:
-- Slave_IO_Running = YES
-- Slave_SQL_Running = YES
9) Łączymy się klijentem SQL albo z konsoli jak kto woli
Test:
Oczekujemy że wywołanie query tworzenia tabel "pierwsza", "druga", "trzecia" rozpocznie replikację (stworzenie odpowiednio baz danych) "pierwsza" i "trzecia" na serwerze replika ponieważ serwer replica nie ma na liście bazy danych "druga" nie będzie jej monitorował (tu zwracam uwagę że do replikacji bazy danych "druga" możemy zrobić inny serwer replica który ma na liście: replicate-do-db wpis druga.
Konfiguracje: binlog_do_db, replicate-do-db mają na celu pokazania dość ważnej funkcionalności i są przykładem.
10) Jak zmigrować już istniejąca bazę danych robimy dumpa bazy którą chcemy zreplikować nie to będzie baza danych "druga" która nie była na liście baz danych na serwerze replica.
Bash:
docker exec -t primary mariadb-dump --user=root --password=dupa.8 --lock-tables druga > primary/backup/druga-$(date +%F).sql
Tworzymy na replica bazę danych "druga" następnie importujemy dumpa:
Bash:
docker exec -i replica mariadb -uroot -pdupa.8 druga < primary/backup/druga-2024-01-20.sql
Edytujemy plik replica/my.cnf na końcu listy dupisujemy:
replicate-do-db=druga
Restartujemy kontener serwer replic sprawdzamy czy nowa baza danych została dodana do listy replikowanych bazdanych:
SQL:
SHOW SLAVE STATUS;