Przewiń do głównej treści

Mysql - synchronizacja węzłów w klastrze master-master

·743 słów·4 min
Mysql
Spis treści
UWAGA!!! Jest to wpis historyczny. Niedawno wyciągnięty z szuflady.

Opis konfiguracji
#

Klaster składa się z trzech maszyn wirtualnych. Komunikują się między sobą wewnątrz sieci lokalnej. Adresy IP znajdują się w pliku /etc/hosts każdej z nich.

W tym przykładzie:

192.168.5.1 node1
192.168.5.2 node2
192.168.5.3 node3

Na nich znajdują się pakiety mysql-xtradb (obecnie nazywany galera). Wszystkie węzły są skonfigurowane, aby działać w trybie replikacji Master - Master. Tzn można zapisywać oraz odczytywać dane z dowolnego węzła.

Przykładowy plik konfiguracyjny
#

Wszystkie węzły klastra synchronizują swój stan między sobą przy pomocy plików binlog używając tego samego protokołu co rsync.

Konfiguracja node1 (192.168.5.1)

/etc/mysql/conf.d/galera.cnf

[mysqld]
binlog_format=ROW
default-storage-engine=innodb
innodb_autoinc_lock_mode=2
query_cache_size=0
query_cache_type=0
bind-address=0.0.0.0
#galera settings
wsrep_provider=/usr/lib/galera/libgalera_smm.so
wsrep_cluster_name="my_wsrep_cluster"
wsrep_cluster_address="gcomm://192.168.5.1,192.168.5.2,192.168.5.3"
wsrep_sst_method=rsync

Problem z synchronizacją
#

Z powodu problemów sieciowych jeden z węzłów, nie mógł komunikować się z resztą. Nowe dane zapisywały się tylko na pozostałych węzłach. Po przywróceniu połączenia, jeden węzeł ma nie aktualne dane. Przez co wymaga synchronizacji danych z pozostałych.

# Przed problemami
# z połączeniem
+---------+        +---------+
|         |        |         |
|  node1  +------->|  node2  |
|         |<-------+         |
+-+-------+        +-------+-+
  |  ^                  ^  |
  |  |                  |  |
  |  |                  |  |
  |  |    +---------+   |  |
  |  |    |         |   |  |
  |  +----+  node3  +---+  |
  +------>|         |<-----+
          +---------+

# W trakcie problemów
# z połączeniem
+---------+        +---------+
|         |        |         |
|  node1  +------->|  node2  |
|         |<-------+         |
+---------+        +---------+

          +---------+
          |         |
          |  node3  |
          |         |
          +---------+

Synchronizacja węzła
#

+---------+        +---------+
|         |        |         |
|  node2  +------->|  node3  |
|         |        |         |
+---------+        +---------+

Sprawdzanie stanu synchronizacji z klastrem
#

  • Logujemy się klientem mysql do węzła klastra
    • mysql -u root -p
  • Sprawdzamy stan klastra oraz węzła
    • SHOW STATUS LIKE 'wsrep_cluster_size’;
      • wsrep_cluster_size - ilość podłączonych węzłów do klastra, dążymy do wartości 3
    • SHOW STATUS LIKE 'wsrep_local_state_comment';
      • wsrep_local_state_comment - stan obecnego węzła względem klastra, dążymy do wartości Synced

Synchronizacja
#

UWAGA!!! Podając nazwę węzła z którym się synchronizujemy (wsrep_sst_donor) użyłem hosta wpisanego w plik /etc/hosts . Nie jestem pewien, czy podanie adresu IPv4 nie będzie mieć tego samego efektu.

UWAGA!!! Jeśli w/w host jest niedostępny, to węzeł na którym pracujemy się nie uruchomi.

UWAGA!!! Można podać kilka węzłów źródłowych po przecinku. Jeśli nie można pobrać danych z pierwszego, wtedy próbuje z kolejnego. Np: wsrep_sst_donor="example1,example2"

UWAGA!!! Przecinek na końcu tego ustawienia powoduje uruchomienie się węzła nawet, jeśli nie może zsynchronizować swojego stanu z żadnym z wcześniej wskazanych węzłów. Np: wsrep_sst_donor="example1,example2,"

Przed synchronizacją należy wyłączyć synchronizowany węzeł oraz ustalić, który węzeł będzie brany jako wzór stanu do skopiowania.

  • Zatrzymujemy niezsynchronizowany węzeł
    • service mysql stop
  • Edytujemy plik konfiguracyjny /etc/mysql/conf.d/galera.cnf
    • Dodajemy linię typu: wsrep_sst_donor="node2"
  • Uruchamiamy niezsynchronizowany węzeł
    • service mysql start
    • Nie przejmujemy się, jeśli serwis powiadomi nas o nie uruchomieniu mysqla.
# service mysql start
[....] Starting MariaDB database server: mysqld . . . . . . . . . . . . . . . . [FAIL . . . . . . . . . . . failed!
  • Sprawdzamy, czy istnieją procesy o nazwie mysql
    • ps aux | grep mysql
  • Sprawdzamy, czy w syslogu odkładają się informacje o trwającej/zakończonej synchronizacji stanu
[...]
Sep  1 22:56:41 node3 rsyncd[23849]: connect from node2 (192.168.5.2)
Sep  1 22:56:41 node3 rsyncd[23849]: rsync to rsync_sst/./gstest3 from node2 (192.168.5.2)
Sep  1 22:56:41 node3 rsyncd[23849]: receiving file list
Sep  1 22:56:41 node3 rsyncd[23851]: connect from node2 (192.168.5.2)
Sep  1 22:56:42 node3 rsyncd[23849]: sent 92 bytes  received 99292 bytes  total size 99025
Sep  1 22:56:42 node3 rsyncd[23851]: rsync to rsync_sst/./bp5 from node2 (192.168.5.2)
Sep  1 22:56:42 node3 rsyncd[23851]: receiving file list
[...]
[...]
Sep  1 23:02:28 node3 mysqld: 220901 23:02:28 [Note] /usr/sbin/mysqld: ready for connections.
Sep  1 23:02:28 node3 mysqld: Version: '10.0.12-MariaDB-1-wsrep-log'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  mariadb.org binary distribution, wsrep_25.10.r4002
Sep  1 23:02:28 node3 mysqld: 220901 23:02:28 [Note] WSREP: 1.0 (node3): State transfer from 2.0 (node2) complete.
Sep  1 23:02:28 node3 mysqld: 220901 23:02:28 [Note] WSREP: Shifting JOINER -> JOINED (TO: 81470609)
Sep  1 23:02:28 node3 mysqld: 220901 23:02:28 [Note] WSREP: Member 1.0 (node3) synced with group.
Sep  1 23:02:28 node3 mysqld: 220901 23:02:28 [Note] WSREP: Shifting JOINED -> SYNCED (TO: 81470609)
Sep  1 23:02:29 node3 mysqld: 220901 23:02:29 [Note] WSREP: Synchronized with group, ready for connections
Sep  1 23:02:29 node3 mysqld: 220901 23:02:29 [Note] WSREP: wsrep_notify_cmd is not defined, skipping notification.
[...]
  • Sprawdzamy, czy węzeł się zsynchronizował (patrz instrukcje wyżej)
  • Zatrzymujemy zsynchronizowany węzeł
    • service mysql stop
  • Usuwamy z pliku konfiguracyjnego /etc/mysql/conf.d/galera.cnf linię zawierającą wsrep_sst_donor=
  • Uruchamiamy ponownie zsynchronizowany węzeł
    • service mysql start
  • Sprawdzamy, czy węzeł się zsynchronizował (patrz instrukcje wyżej)