Replikacja MySQL Master-Slave na tej samej maszynie

Opublikowany: 2022-03-11

Replikacja MySQL to proces, który umożliwia automatyczne kopiowanie danych z jednego serwera bazy danych MySQL (master) na jeden lub więcej serwerów bazy danych MySQL (slave). Jest zwykle używany do rozpowszechniania dostępu do odczytu na wielu serwerach w celu skalowania, chociaż może być również używany do innych celów, takich jak przełączanie awaryjne lub analizowanie danych na urządzeniu podrzędnym, aby nie przeciążać urządzenia nadrzędnego.

Ponieważ replikacja master-slave jest replikacją jednokierunkową (z master do slave), tylko baza danych master jest używana do operacji zapisu, podczas gdy operacje odczytu mogą być rozłożone na wiele baz danych slave. Oznacza to, że jeśli replikacja master-slave jest używana jako rozwiązanie skalowalne w poziomie, musisz mieć zdefiniowane co najmniej dwa źródła danych, jedno dla operacji zapisu, a drugie dla operacji odczytu.

Replikacja typu master-slave MySQL

Programiści MySQL zwykle pracują tylko na jednej maszynie i mają tendencję do posiadania całego środowiska programistycznego na tej jednej maszynie, z logiką, że nie są zależni od sieci lub połączenia internetowego. Jeśli replikacja master-slave jest potrzebna, ponieważ na przykład muszą przetestować replikację w środowisku programistycznym przed wdrożeniem zmian w innym miejscu, muszą utworzyć ją na tej samej maszynie. Chociaż konfiguracja pojedynczej instancji MySQL jest dość prosta, musimy wykonać dodatkowy wysiłek, aby skonfigurować drugą, a następnie replikację typu master-slave.

W tym samouczku krok po kroku wybrałem Ubuntu Linux jako system operacyjny hosta, a dostarczone polecenia są przeznaczone dla tego systemu operacyjnego. Jeśli chcesz skonfigurować replikację MySQL typu master-slave w innym systemie operacyjnym, będziesz musiał wprowadzić modyfikacje dla jego określonych poleceń. Jednak ogólne zasady konfigurowania replikacji typu master-slave MySQL na tej samej maszynie są takie same dla wszystkich systemów operacyjnych.

Replikacja typu master-slave MySQL

Instalacja pierwszej instancji MySQL

Jeśli masz już zainstalowaną jedną instancję bazy danych MySQL na swoim komputerze, możesz pominąć ten krok.

Najłatwiejszym sposobem zainstalowania MySQL na Ubuntu jest uruchomienie następującego polecenia z wiersza poleceń:

 sudo apt-get install mysql-server

Podczas procesu instalacji zostaniesz poproszony o ustawienie hasła dla użytkownika root MySQL.

Konfigurowanie mysqld_multi

Aby efektywnie zarządzać dwoma instancjami MySQL na tej samej maszynie, musimy użyć mysqld_multi .

Pierwszym krokiem w konfiguracji mysqld_multi jest utworzenie dwóch oddzielnych grup [mysqld] w istniejącym pliku my.cnf . Domyślna lokalizacja pliku my.cnf na Ubuntu to /etc/mysql/ . Otwórz więc plik my.cnf w swoim ulubionym edytorze tekstu i zmień nazwę istniejącej grupy [mysqld] na [mysqld1] . Grupa o zmienionej nazwie będzie używana do konfiguracji pierwszej instancji MySQL i zostanie również skonfigurowana jako instancja główna. Podobnie jak w przypadku replikacji MySQL master-slave, każda instancja musi mieć swój własny unikalny server-id , dodaj następujący wiersz w grupie [mysqld1] :

 server-id = 1

Ponieważ potrzebujemy oddzielnej grupy [mysqld] dla drugiej instancji MySQL, skopiuj grupę [mysqld1] ze wszystkimi bieżącymi konfiguracjami i wklej ją poniżej w tym samym pliku my.cnf . Teraz zmień nazwę skopiowanej grupy na [mysqld2] i wprowadź następujące zmiany w konfiguracji urządzenia podrzędnego:

 server-id = 2 port = 3307 socket = /var/run/mysqld/mysqld_slave.sock pid-file = /var/run/mysqld/mysqld_slave.pid datadir = /var/lib/mysql_slave log_error = /var/log/mysql_slave/error_slave.log relay-log = /var/log/mysql_slave/relay-bin relay-log-index = /var/log/mysql_slave/relay-bin.index master-info-file = /var/log/mysql_slave/master.info relay-log-info-file = /var/log/mysql_slave/relay-log.info read_only = 1

Aby skonfigurować drugą instancję MySQL jako podrzędną, ustaw server-id na 2, ponieważ musi być inny niż identyfikator serwera głównego.

Ponieważ obie instancje będą działały na tej samej maszynie, ustaw port dla drugiej instancji na 3307 , ponieważ musi być inny niż port używany dla pierwszej instancji, czyli domyślnie 3306 .

Aby umożliwić tej drugiej instancji korzystanie z tych samych binariów MySQL, musimy ustawić różne wartości dla socket , pid-file , datadir i log_error .

Musimy również włączyć relay-log , aby użyć drugiej instancji jako slave (parametry relay-log , relay-log-index i relay-log-info-file ), a także ustawić master-info-file .

Wreszcie, aby instancja podrzędna była tylko do odczytu, parametr tylko do read_only jest ustawiony na 1 . Powinieneś być ostrożny z tą opcją, ponieważ nie zapobiega ona całkowicie zmianom w urządzeniu podrzędnym. Nawet jeśli read_only jest ustawione na 1 , aktualizacje będą dozwolone tylko od użytkowników, którzy mają uprawnienie SUPER . MySQL wprowadził niedawno nowy parametr super_read_only , aby uniemożliwić użytkownikom SUPER wprowadzanie zmian. Ta opcja jest dostępna w wersji 5.7.8.

Oprócz [mysqld1] i [mysqld2] musimy również dodać nową grupę [mysqld_multi] do pliku my.cnf :

 [mysqld_multi] mysqld = /usr/bin/mysqld_safe mysqladmin = /usr/bin/mysqladmin user = multi_admin password = multipass

Gdy już zainstalujemy drugą instancję MySQL i uruchomimy obie, nadamy użytkownikowi multi_admin odpowiednie uprawnienia, aby móc zamknąć instancje MySQL.

Utwórz nowe foldery dla drugiej instancji MySQL

W poprzednim kroku przygotowaliśmy plik konfiguracyjny dla drugiej instancji MySQL. W tym pliku konfiguracyjnym używane są dwa nowe foldery. Aby utworzyć te foldery z odpowiednimi uprawnieniami, należy użyć następujących poleceń systemu Linux:

 mkdir -p /var/lib/mysql_slave chmod --reference /var/lib/mysql /var/lib/mysql_slave chown --reference /var/lib/mysql /var/lib/mysql_slave mkdir -p /var/log/mysql_slave chmod --reference /var/log/mysql /var/log/mysql_slave chown --reference /var/log/mysql /var/log/mysql_slave

Dodatkowe ustawienia bezpieczeństwa w AppArmor

W niektórych środowiskach Linux do uruchomienia drugiej instancji MySQL potrzebne są ustawienia zabezpieczeń AppArmor. Przynajmniej są wymagane w Ubuntu.

Aby poprawnie skonfigurować AppArmor, edytuj plik /etc/apparmor.d/usr.sbin.mysqld swoim ulubionym edytorem tekstu, dodaj następujące linie:

 /var/lib/mysql_slave/ r, /var/lib/mysql_slave/** rwk, /var/log/mysql_slave/ r, /var/log/mysql_slave/* rw, /var/run/mysqld/mysqld_slave.pid rw, /var/run/mysqld/mysqld_slave.sock w, /run/mysqld/mysqld_slave.pid rw, /run/mysqld/mysqld_slave.sock w,

Po zapisaniu pliku uruchom ponownie komputer, aby zmiany zaczęły obowiązywać.

Instalacja drugiej instancji MySQL

Do instalacji drugiej instancji MySQL można zastosować kilka różnych podejść. Podejście przedstawione w tym samouczku wykorzystuje te same pliki binarne MySQL co pierwsze, z oddzielnymi plikami danych niezbędnymi do drugiej instalacji.

Ponieważ w poprzednich krokach przygotowaliśmy już plik konfiguracyjny oraz niezbędne foldery i zmiany bezpieczeństwa, ostatnim krokiem instalacji drugiej instancji MySQL jest inicjalizacja katalogu danych MySQL.

Wykonaj następujące polecenie, aby zainicjować nowy katalog danych MySQL:

 mysql_install_db --user=mysql --datadir=/var/lib/mysql_slave

Po zainicjowaniu katalogu danych MySQL możesz uruchomić obie instancje MySQL za pomocą usługi mysqld_multi :

 mysqld_multi start

Ustaw hasło root dla drugiej instancji MySQL, używając mysqladmin z odpowiednim hostem i portem. Pamiętaj, że jeśli host i port nie są określone, mysqladmin połączy się z pierwszą instancją MySQL:

 mysqladmin --host=127.0.0.1 --port=3307 -u root password rootpwd

W powyższym przykładzie ustawiłem hasło na „rootpwd”, ale zalecane jest użycie bezpieczniejszego hasła.

Dodatkowa konfiguracja mysqld_multi

Na końcu sekcji „Konfiguracja mysqld_multi” napisałem, że później nadamy odpowiednie uprawnienia użytkownikowi multi_admin , więc teraz jest na to czas. Musimy nadać temu użytkownikowi odpowiednie uprawnienia w obu instancjach, więc najpierw połączmy się z pierwszą instancją:

 mysql --host=127.0.0.1 --port=3306 -uroot -p

Po zalogowaniu wykonaj następujące dwie komendy:

 mysql> GRANT SHUTDOWN ON *.* TO 'multi_admin'@'localhost' IDENTIFIED BY 'multipass'; mysql> FLUSH PRIVILEGES;

Wyjdź z klienta MySQL i połącz się z drugą instancją:

 mysql --host=127.0.0.1 --port=3307 -uroot -p

Po zalogowaniu wykonaj te same dwie komendy, co powyżej:

 mysql> GRANT SHUTDOWN ON *.* TO 'multi_admin'@'localhost' IDENTIFIED BY 'multipass'; mysql> FLUSH PRIVILEGES;

Wyjdź z klienta MySQL.

Uruchom obie instancje MySQL automatycznie podczas rozruchu

Ostatnim krokiem konfiguracji mysqld_multi jest instalacja automatycznego skryptu startowego w init.d .

W tym celu utwórz nowy plik o nazwie mysqld_multi w /etc/init.d i nadaj mu odpowiednie uprawnienia:

 cd /etc/init.d touch mysqld_multi chmod +x /etc/init.d/mysqld_multi

Otwórz ten nowy plik w swoim ulubionym edytorze tekstu i skopiuj następujący skrypt:

 #!/bin/sh ### BEGIN INIT INFO # Provides: scriptname # Required-Start: $remote_fs $syslog # Required-Stop: $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Start daemon at boot time # Description: Enable service provided by daemon. ### END INIT INFO bindir=/usr/bin if test -x $bindir/mysqld_multi then mysqld_multi="$bindir/mysqld_multi"; else echo "Can't execute $bindir/mysqld_multi"; exit; fi case "$1" in 'start' ) "$mysqld_multi" start $2 ;; 'stop' ) "$mysqld_multi" stop $2 ;; 'report' ) "$mysqld_multi" report $2 ;; 'restart' ) "$mysqld_multi" stop $2 "$mysqld_multi" start $2 ;; *) echo "Usage: $0 {start|stop|report|restart}" >&2 ;; esac

Dodaj usługę mysqld_multi do domyślnych runlevels pracy za pomocą następującego polecenia:

 update-rc.d mysqld_multi defaults

Uruchom ponownie komputer i sprawdź, czy obie instancje MySQL są uruchomione, używając następującego polecenia:

 mysqld_multi report

Skonfiguruj replikację master-slave

Teraz, gdy mamy dwie instancje MySQL działające na tej samej maszynie, skonfigurujemy pierwszą instancję jako główną, a drugą jako podrzędną.

Jedna część konfiguracji została już wykonana w rozdziale „Konfiguracja mysqld_multi”. Jedyną pozostałą zmianą w pliku my.cnf jest ustawienie rejestrowania binarnego na urządzeniu głównym. W tym celu edytuj plik my.cnf z następującymi zmianami i dodatkami w grupie [mysqld1] :

 log_bin = /var/log/mysql/mysql-bin.log innodb_flush_log_at_trx_commit = 1 sync_binlog = 1 binlog-format = ROW

Zrestartuj główną instancję MySQL, aby te zmiany zaczęły obowiązywać:

 mysqld_multi stop 1 mysqld_multi start 1

Aby urządzenie podrzędne mogło połączyć się z urządzeniem głównym z poprawnymi uprawnieniami do replikacji, na urządzeniu głównym należy utworzyć nowego użytkownika. Połącz się z główną instancją za pomocą klienta MySQL z odpowiednim hostem i portem:

 mysql -uroot -p --host=127.0.0.1 --port=3306

Utwórz nowego użytkownika do replikacji:

 mysql> CREATE USER 'replication'@'%' IDENTIFIED BY 'replication'; mysql> GRANT REPLICATION SLAVE ON *.* TO 'replication'@'%';

Wyjdź z klienta MySQL.

Wykonaj następujące polecenie, aby utworzyć zrzut danych podstawowych:

 mysqldump -uroot -p --host=127.0.0.1 --port=3306 --all-databases --master-data=2 > replicationdump.sql

Tutaj używamy opcji --master-data=2 w celu umieszczenia komentarza zawierającego instrukcję CHANGE MASTER wewnątrz pliku kopii zapasowej. Ten komentarz wskazuje współrzędne replikacji w momencie tworzenia kopii zapasowej i będziemy potrzebować tych współrzędnych później do aktualizacji informacji głównej w instancji podrzędnej. Oto przykład tego komentarza:

 -- -- Position to start replication or point-in-time recovery from -- -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=349;

Zaimportuj zrzut utworzony w poprzednim kroku do instancji slave:

 mysql -uroot -p --host=127.0.0.1 --port=3307 < replicationdump.sql

Wreszcie, aby instancja slave mogła połączyć się z instancją master, informacje master dotyczące jednostki slave muszą zostać zaktualizowane o odpowiednie parametry połączenia.

Połącz się z instancją podrzędną za pomocą klienta MySQL z odpowiednim hostem i portem:

 mysql -uroot -p --host=127.0.0.1 --port=3307

Wykonaj następujące polecenie, aby zaktualizować informacje główne (weź współrzędne replikacji z pliku zrzutu replicationdump.sql , jak wyjaśniono powyżej):

 mysql> CHANGE MASTER TO -> MASTER_HOST='127.0.0.1', -> MASTER_USER='replication', -> MASTER_PASSWORD='replication', -> MASTER_LOG_FILE='mysql-bin.000001', -> MASTER_LOG_POS=349;

Wykonaj następujące polecenie, aby uruchomić urządzenie podrzędne:

 mysql> START SLAVE;

Wykonaj następujące polecenie, aby sprawdzić, czy replikacja jest uruchomiona i działa:

 mysql> SHOW SLAVE STATUS \G

Gratulacje. Twoja replikacja MySQL typu master-slave na tej samej maszynie została pomyślnie skonfigurowana.

Replikacja typu master-slave MySQL

Zakończyć

Skonfigurowanie replikacji master-slave w środowisku programistycznym jest przydatne, jeśli jest potrzebne do rozwiązania skalowalnego w środowisku produkcyjnym. W ten sposób będziesz mieć również oddzielne źródła danych skonfigurowane do operacji zapisu i odczytu, dzięki czemu możesz przetestować lokalnie, czy wszystko działa zgodnie z oczekiwaniami przed dalszym wdrożeniem.

Ponadto możesz chcieć mieć kilka wystąpień podrzędnych skonfigurowanych na tej samej maszynie, aby przetestować moduł równoważenia obciążenia, który dystrybuuje operacje odczytu do kilku urządzeń podrzędnych. W takim przypadku możesz użyć tej samej instrukcji, aby skonfigurować inne instancje podrzędne, powtarzając wszystkie te same kroki.