How-To MariaDB (11.2.2) z replikacją.

3Qn

Ave UBI!
Q's Expert
Jun 11, 2016
392
2
157
113
QNAP
TS-x73A
Ethernet
1 GbE
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

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.

1_upload_docker-compose.png


Odnajdujemy plik docker-compose.yaml "Lokalne urządzenie QNAP"

1_2_upload_docker-compose.png



1_3_upload_docker-compose.png


4) Po uruchomieniu baz danych w cały stack powinien wyglądać

Screenshot_20240120_101423.png


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
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.

4_uncomment.png


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 ;)
Screenshot_20240120_025253.png


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;
 

Attachments

  • 4_uncomment.png
    4_uncomment.png
    217.5 KB · Views: 10

Users search this thread by keywords

  1. REPLICA
  2. mariadb
  3. backup mariadb
  4. reset qnap
  5. mariadb replica
  6. *
  7. docker mysql backup
  8. https://forum.qnap.net.pl/threads/mariadb-11-2-2-z-replikacj%C4%85.41103/