Replicare MySQL Master-Slave pe aceeași mașină

Publicat: 2022-03-11

Replicarea MySQL este un proces care permite ca datele de la un server de baze de date MySQL (masterul) să fie copiate automat pe unul sau mai multe servere de baze de date MySQL (sclavii). De obicei, este folosit pentru a răspândi accesul la citire pe mai multe servere pentru scalabilitate, deși poate fi folosit și în alte scopuri, cum ar fi pentru failover sau pentru analiza datelor de pe slave pentru a nu supraîncărca masterul.

Deoarece replicarea master-slave este o replicare unidirecțională (de la master la slave), numai baza de date master este utilizată pentru operațiunile de scriere, în timp ce operațiunile de citire pot fi răspândite pe mai multe baze de date slave. Acest lucru înseamnă că, dacă replicarea master-slave este utilizată ca soluție de scalare, trebuie să aveți cel puțin două surse de date definite, una pentru operațiuni de scriere și a doua pentru operațiuni de citire.

Replicare MySQL master-slave

Dezvoltatorii MySQL lucrează de obicei pe o singură mașină și tind să aibă întregul lor mediu de dezvoltare pe acea singură mașină, cu logica că nu depind de o rețea sau de o conexiune la internet. Dacă este necesară o replicare master-slave, deoarece, de exemplu, trebuie să testeze replicarea într-un mediu de dezvoltare înainte de a implementa modificări în altă parte, trebuie să o creeze pe aceeași mașină. În timp ce configurarea unei singure instanțe MySQL este destul de simplă, trebuie să facem un efort suplimentar pentru a configura o secundă, apoi o replicare master-slave.

Pentru acest tutorial pas cu pas, am ales Ubuntu Linux ca sistem de operare gazdă, iar comenzile furnizate sunt pentru acel sistem de operare. Dacă doriți să configurați replicarea MySQL master-slave pe alt sistem de operare, va trebui să faceți modificări pentru comenzile sale specifice. Cu toate acestea, principiile generale de configurare a replicării master-slave MySQL pe aceeași mașină sunt aceleași pentru toate sistemele de operare.

Replicare MySQL master-slave

Instalarea primei instanțe MySQL

Dacă aveți deja o instanță a bazei de date MySQL instalată pe mașina dvs., puteți sări peste acest pas.

Cel mai simplu mod de a instala MySQL pe Ubuntu este să rulați următoarea comandă dintr-un prompt de terminal:

 sudo apt-get install mysql-server

În timpul procesului de instalare, vi se va solicita să setați o parolă pentru utilizatorul root MySQL.

Configurarea mysqld_multi

Pentru a gestiona eficient două instanțe MySQL pe aceeași mașină, trebuie să folosim mysqld_multi .

Primul pas în configurarea mysqld_multi este crearea a două grupuri [mysqld] separate în fișierul my.cnf existent. Locația implicită a fișierului my.cnf pe Ubuntu este /etc/mysql/ . Deci, deschideți fișierul my.cnf cu editorul dvs. de text preferat și redenumiți grupul [mysqld] existent în [mysqld1] . Acest grup redenumit va fi folosit pentru configurarea primei instanțe MySQL și va fi configurat și ca instanță master. Așa cum în replicarea MySQL master-slave, fiecare instanță trebuie să aibă propriul server-id unic, adăugați următoarea linie în grupul [mysqld1] :

 server-id = 1

Deoarece avem nevoie de un grup [mysqld] separat pentru a doua instanță MySQL, copiați grupul [mysqld1] cu toate configurațiile curente și inserați-l mai jos în același fișier my.cnf . Acum, redenumiți grupul copiat în [mysqld2] și faceți următoarele modificări în configurația pentru slave:

 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

Pentru a configura a doua instanță MySQL ca slave, setați server-id la 2, deoarece trebuie să fie diferit de server-id-ul masterului.

Deoarece ambele instanțe vor rula pe aceeași mașină, setați port pentru a doua instanță la 3307 , deoarece trebuie să fie diferit de portul utilizat pentru prima instanță, care este 3306 implicit.

Pentru a permite acestei a doua instanțe să folosească aceleași fișiere binare MySQL, trebuie să setăm valori diferite pentru socket , pid-file , datadir și log_error .

De asemenea, trebuie să activăm relay-log pentru a folosi a doua instanță ca slave (parametri relay-log , relay-log-index și relay-log-info-file ), precum și pentru a seta master-info-file .

În cele din urmă, pentru a face ca instanța slave să fie doar în citire, parametrul read_only este setat la 1 . Ar trebui să fiți atenți cu această opțiune, deoarece nu împiedică complet modificările asupra slave. Chiar și atunci când read_only este setat la 1 , actualizările vor fi permise numai de la utilizatorii care au privilegiul SUPER . MySQL a introdus recent noul parametru super_read_only pentru a împiedica utilizatorii SUPER să facă modificări. Această opțiune este disponibilă cu versiunea 5.7.8.

În afară de [mysqld1] și [mysqld2] , trebuie să adăugăm și un nou grup [mysqld_multi] la fișierul my.cnf :

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

Odată ce instalăm a doua instanță MySQL și le pornim pe ambele, vom acorda privilegii corespunzătoare utilizatorului multi_admin pentru a putea închide instanțe MySQL.

Creați foldere noi pentru a doua instanță MySQL

În pasul anterior am pregătit fișierul de configurare pentru a doua instanță MySQL. În acel fișier de configurare sunt utilizate două foldere noi. Următoarele comenzi Linux ar trebui utilizate pentru a crea acele foldere cu privilegii adecvate:

 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

Setări suplimentare de securitate în AppArmor

În unele medii Linux, setările de securitate AppArmor sunt necesare pentru a rula a doua instanță MySQL. Cel puțin, acestea sunt necesare pe Ubuntu.

Pentru a configura corect AppArmor, editați fișierul /etc/apparmor.d/usr.sbin.mysqld cu editorul de text preferat, adăugați următoarele rânduri:

 /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,

După ce salvați fișierul, reporniți aparatul pentru ca aceste modificări să aibă efect.

Instalarea celei de-a doua instanțe MySQL

Pot fi urmate mai multe abordări diferite pentru instalarea celei de-a doua instanțe MySQL. Abordarea prezentată în acest tutorial folosește aceleași fișiere binare MySQL ca și prima, cu fișiere de date separate necesare pentru a doua instalare.

Deoarece am pregătit deja fișierul de configurare și folderele necesare și modificările de securitate în pașii anteriori, pasul final de instalare a celei de-a doua instanțe MySQL este inițializarea directorului de date MySQL.

Executați următoarea comandă pentru a inițializa noul director de date MySQL:

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

Odată ce directorul de date MySQL este inițializat, puteți porni ambele instanțe MySQL folosind serviciul mysqld_multi :

 mysqld_multi start

Setați parola root pentru a doua instanță MySQL utilizând mysqladmin cu gazda și portul corespunzătoare. Rețineți, dacă gazda și portul nu sunt specificate, mysqladmin se va conecta la prima instanță MySQL implicit:

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

În exemplul de mai sus am setat parola la „rootpwd”, dar se recomandă utilizarea unei parole mai sigure.

Configurație suplimentară pentru mysqld_multi

La sfârșitul secțiunii „Configurarea mysqld_multi”, am scris că vom acorda privilegiile corespunzătoare utilizatorului multi_admin mai târziu, așa că acum este momentul pentru asta. Trebuie să acordăm acestui utilizator privilegii adecvate în ambele cazuri, așa că mai întâi să ne conectăm la prima instanță:

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

Odată autentificat, executați următoarele două comenzi:

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

Ieșiți din clientul MySQL și conectați-vă la a doua instanță:

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

Odată autentificat, executați aceleași două comenzi ca mai sus:

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

Ieșiți din clientul MySQL.

Porniți automat ambele instanțe MySQL la pornire

Ultimul pas al instalării mysqld_multi este instalarea scriptului de pornire automată în init.d .

Pentru a face asta, creați un fișier nou numit mysqld_multi în /etc/init.d și acordați-i privilegiile corespunzătoare:

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

Deschideți acest fișier nou cu editorul de text preferat și copiați următorul script:

 #!/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

Adăugați serviciul mysqld_multi la nivelurile de runlevels implicite cu următoarea comandă:

 update-rc.d mysqld_multi defaults

Reporniți mașina și verificați dacă ambele instanțe MySQL rulează utilizând următoarea comandă:

 mysqld_multi report

Configurați replicarea master-slave

Acum, când avem două instanțe MySQL care rulează pe aceeași mașină, vom configura prima instanță ca master, iar a doua ca slave.

O parte a configurației a fost deja efectuată în capitolul „Configurarea mysqld_multi”. Singura modificare rămasă în fișierul my.cnf este să setați înregistrarea binară pe master. Pentru a face acest lucru, editați fișierul my.cnf cu următoarele modificări și completări în grupul [mysqld1] :

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

Reporniți instanța principală MySQL pentru ca aceste modificări să aibă efect:

 mysqld_multi stop 1 mysqld_multi start 1

Pentru ca slave să se conecteze la master cu privilegiile de replicare corecte, trebuie creat un nou utilizator pe master. Conectați-vă la instanța principală folosind clientul MySQL cu gazda și portul corespunzătoare:

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

Creați un utilizator nou pentru replicare:

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

Ieșiți din clientul MySQL.

Executați următoarea comandă pentru a crea un dump a datelor de bază:

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

Aici folosim opțiunea --master-data=2 pentru a avea un comentariu care să conțină o instrucțiune CHANGE MASTER în interiorul fișierului de rezervă. Acest comentariu indică coordonatele de replicare la momentul copiei de rezervă și vom avea nevoie de acele coordonate mai târziu pentru actualizarea informațiilor master în instanța slave. Iată exemplul acelui comentariu:

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

Importați dump-ul creat în pasul anterior în instanța slave:

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

În cele din urmă, pentru ca instanța slave să se conecteze la instanța master, informațiile master de pe slave trebuie să fie actualizate cu parametrii de conexiune corespunzători.

Conectați-vă la instanța slave folosind clientul MySQL cu gazda și portul corespunzătoare:

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

Executați următoarea comandă pentru a actualiza informațiile master (luați coordonatele de replicare din fișierul de descărcare replicationdump.sql , așa cum s-a explicat mai sus):

 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;

Executați următoarea comandă pentru a porni slave:

 mysql> START SLAVE;

Executați următoarea comandă pentru a verifica dacă replicarea este în funcțiune:

 mysql> SHOW SLAVE STATUS \G

Felicitări. Replicarea dvs. MySQL master-slave pe aceeași mașină este acum configurată cu succes.

Replicare MySQL master-slave

Învelire

Este util să aveți o replicare master-slave configurată în mediul dumneavoastră de dezvoltare dacă aveți nevoie de ea pentru o soluție de scalare în mediul de producție. În acest fel, veți avea, de asemenea, surse de date separate configurate pentru operațiuni de scriere și citire, astfel încât să puteți testa la nivel local dacă totul funcționează conform așteptărilor înainte de implementarea ulterioară.

În plus, este posibil să doriți să aveți mai multe instanțe slave configurate pe aceeași mașină pentru a testa echilibrul de încărcare care distribuie operațiunile de citire către mai mulți slave. În acest caz, puteți utiliza același manual pentru a configura alte instanțe slave, repetând toți aceiași pași.