Elementele de bază de replicare pentru MySQL

Replicarea (din -povtoryayu replico latină.) - o replicare a acestor modificări la baza de date a serverului principal de la unul sau mai multe servere dependente. Serverul de master va fi numit comandantul, și asociații - replici.
modificări de date cu privire la master, repetate pe tac (dar nu și invers). Prin urmare, cererile de date în schimbare (INSERT, UPDATE, DELETE, și așa mai departe. D.) sunt efectuate numai pe master și solicită să citească date (cu alte cuvinte, SELECT) poate fi realizată atât pe replici, și expertul. Procesul de replicare într-unul din replica nu afectează alte replici, și nu are practic nici un efect asupra expertului.
Replicarea este realizată folosind jurnalul binar, ceea ce duce la master. Ei au salvat toate cererile care au ca rezultat (sau potențial) conduc la schimbările din baza de date (cereri nu sunt stocate în mod explicit, așa că, dacă doriți să vedeți le trebuie să folosească utilitarul mysqlbinlog). Binlogi transferat la replica (binlog, descărcat de maestru, numit „releu binlog“) și interogări stocate sunt executate, pornind de la o anumită poziție. Este important să se înțeleagă că, atunci când o replicare este transmis nu datele modificate, și doar cererile de schimbare.
Conținutul de baze de date de replicare este duplicat pe mai multe servere. De ce este necesar să se recurgă la dublarea? Există mai multe motive:

performanță și scalabilitate. Un server poate ocupa de sarcina cauzată de citire și scriere pentru operațiunile simultane de baze de date. Beneficiați de crearea de replici va fi mai mare, operațiile de citire mai au reprezentat o singură operație de scriere pe sistemul dumneavoastră.
Reziliența. În cazul în care un tac eșec, toate solicitările de citire pot fi transferate în condiții de siguranță la master. În cazul în care comandantul nu reușește, scrie cereri pot fi transferate la replica (după master este restaurat, poate prelua rolul de indicii).
backup de date. Replica poate fi „frânele“ la timp pentru a efectua mysqldump, și maestru - nu.
evaluare leneș. Grele și lent SQL-interogări pot fi efectuate pe o singură replică, să nu fie frică să interfereze cu funcționarea normală a întregului sistem.

În plus, există câteva alte caracteristici interesante. Deoarece replica transmisă nu datele în sine, și solicită, făcându-le să se schimbe, putem folosi o structură de tabel diferit pe master și replici. În special, acesta poate varia de tip masă (motor) sau un set de indici. De exemplu, pentru o căutare full-text pe tac, putem folosi tabelul de tip MyISAM, în ciuda faptului că maestrul va folosi InnoDB.

Să presupunem că avem o bază de date MySQL de lucru deja completate cu date și incluse în lucrare. Și unul dintre motivele descrise mai sus, vom permite replicarea serverului nostru. Datele noastre inițiale:

Asigurați-vă că pentru a specifica un ID unic server, calea către jurnalul binar și numele bazei de date pentru replicarea în secțiunea [mysqld]:
server id = 1
log-bin = / var / lib / mysql / mysql-bin
replica-do-db = testdb
Asigurați-vă că aveți suficient spațiu pe disc pentru jurnalele binare.

Adăugați un utilizator de replicare sub a cărei acreditări se va face replicare. Acesta va fi „replicare slave“ privilegii suficiente:
MySQL @ Master> replicare GRANT sclav ON "testdb" * LA "replicare" @ "192.168.1.102" Identificat prin "parola" .;

Reporniți MySQL, la schimbările din fișierul de configurare pentru a avea efect:
rădăcină @ maestru # serviciu mysqld repornire

Dacă totul merge bine, comanda „statutul de maestru spectacol“ ar trebui să arate ceva de genul:
mysql @ maestru> SHOW MASTER STATUS \ G
Fișier: mysql-bin.000003
Poziție: 98
Binlog_Do_DB:
Binlog_Ignore_DB:
Înțeles poziție ar trebui să crească pe măsură ce se efectuează modificările la baza de date master.

Se specifică ID-ul serverului, numele bazei de date pentru replicarea și calea releului-binlogam în secțiunea [mysqld] de configurare, apoi reporniți MySQL:
server id = 2
releu-log = / var / lib / mysql / mysql-releu-bin
releu-log-index = /var/lib/mysql/mysql-relay-bin.index
replica-do-db = testdb

rădăcină @ replică # serviciu mysqld repornire

Aici avem de a bloca baza de date pentru înregistrări. Pentru a face acest lucru, puteți fie opri aplicațiile de locuri de muncă sau de a folosi caseta de instalare expertul READ_ONLY lui (Notă: pentru utilizatorii cu privilegiul SUPER, acest indicator nu are nici un efect). Dacă avem un tabel MyISAM, la fel ca și „mese de spălare“:
mysql @ maestru> TABELE CU flush CITIRE LOCK;
mysql @ maestru> SET GLOBAL READ_ONLY = ON;

Să vedem starea echipei de master «arăta statutul de master» și amintiți-vă pentru fișier și poziția (după un succes masterat de blocare, acestea nu se schimbă):
Fișier: mysql-bin.000003
Poziție: 98

Efectuarea haldei de baze de date, și după finalizarea operațiunii deblochează master:
mysql @ maestru> SET GLOBAL READ_ONLY = OFF;

Dump transfer la replica și restaurare a datelor de la ea.
În cele din urmă, executați comenzile de replicare „maestru schimbare“ și „începe sclav“ și a vedea dacă totul a mers bine:
mysql @ replica> SCHIMBĂRII MASTER TO MASTER_HOST = "192.168.1.101", MASTER_USER = "replicare", MASTER_PASSWORD = "parola", MASTER_LOG_FILE = "mysql-bin.000003", MASTER_LOG_POS = 98;
mysql @ replica> porni sclav;
Valorile MASTER_LOG_FILE și MASTER_LOG_POS le luăm pentru a stăpâni.

Să vedem cum replicare „arată statutul de sclav“ comandă:
mysql @ replica> SHOW SLAVE STATUS \ G
Slave_IO_State: Se așteaptă maestru pentru a trimite eveniment
Master_Host: 192.168.1.101
Master_User: replicare
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000003
Read_Master_Log_Pos: 98
Relay_Log_File: mysql-releu-bin.001152
Relay_Log_Pos: 235
Relay_Master_Log_File: mysql-bin.000003
Slave_IO_Running: Da
Slave_SQL_Running: Da
Replicate_Do_DB: testdb, testdb
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 98
Relay_Log_Space: 235
Until_Condition: Nici unul
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: Nu
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 5

Acum, valorile cele mai interesante am subliniat. La început de succes a replicării valoarea lor ar trebui să fie aproximativ aceeași ca și în listă (a se vedea. Descrierea „arăta statutul de sclavi“ comandă în documentația). Valoarea Seconds_Behind_Master poate fi orice număr întreg.
Dacă replicarea este OK, o replica va urma master (log număr în Master_Log_File poziția Exec_Master_Log_Pos și va crește). Decalajul replica de master (Seconds_Behind_Master), în mod ideal, ar trebui să fie zero. În cazul în care nu se contracta sau să crească, este posibil ca, în sarcina replica este prea mare - pur și simplu nu are timp să repete schimbările de pe Wizard.
Dacă valoarea este gol Slave_IO_State și Seconds_Behind_Master este NULL, replicarea nu pornește. A se vedea MySQL jurnal pentru a determina cauza, elimina-l și re-începe replicarea:
mysql @ replica> porni sclav;

Prin aceste acțiuni simple pe care le primim o replică, ale căror date au fost identice cu cele de pe maestru.
Apropo, în timp ce comandantul de blocare - de data aceasta groapa de gunoi. Dacă el creează inacceptabil de lung, puteți încerca să facă acest lucru:

bloca înregistrarea în pavilion maestru READ_ONLY, amintiți-vă poziția și a opri MySQL.
apoi copiați fișierele bazei de date pentru a răspunde și include maestru.
pentru a începe replicarea în mod obișnuit.

Există mai multe modalități de a crea o replică a comandantului fără oprire la toate, dar aceasta nu funcționează întotdeauna.

Să presupunem că avem deja un maestru de lucru și replica, și trebuie să facem mai mult o alta. Asigurați-vă chiar mai ușor decât adăugați prima replica la master. Si mult mai plăcut că nu este nevoie să se oprească pentru acest maestru.
Pentru a începe, configurați MySQL pe cea de a doua replica și asigurați-vă că am făcut setările necesare în fișierul de configurare:
server id = 3
replica-do-db = testdb

Acum opri replicarea primei replica:
mysql @ replica-1> opri sclav;

Replica va continua să funcționeze în mod normal, dar datele de pe acesta nu va mai fi relevant. Să vedem starea și memora poziția master, la care se ajunge replica înainte de a opri replicare:
mysql @ replica-1> SHOW SLAVE STATUS \ G

Trebuie să prețuim și Master_Log_File Exec_Master_Log_Pos:
Master_Log_File: mysql-bin.000004
Exec_Master_Log_Pos: 155

Vom crea o bază de date de imagine și vom continua să reproducă la o replica a primului:
mysql @ replica-1> START SLAVE;

Restaurarea datelor de la groapa de la a doua replica. Apoi activați replicare:
mysql @-2 replica> SCHIMBĂRII MASTER TO MASTER_HOST = "192.168.1.101", MASTER_USER = "replicare", MASTER_PASSWORD = "parola", MASTER_LOG_FILE = "mysql-bin.000004", MASTER_LOG_POS = 155;
mysql @-replica 2> START SLAVE;

Valorile MASTER_LOG_FILE și MASTER_LOG_POS - sunt, respectiv, valorile și Master_Log_File Exec_Master_Log_Pos rezultatelor «spectacol» statutul de sclav comandă în primul tac.
Replicarea ar trebui să înceapă de la poziția în care prima replica a fost oprită (și, în consecință, se creează groapa). Astfel, vom avea două replici cu date identice.

Uneori există o astfel de situație: pe baza de date master, există două, dintre care una este reprodusă pe o replică, iar al doilea - pe de altă parte. Cum se configurează replicare două baze de date pe ambele replici, nu-i face să-și arunce comandantului și nu-l oprirea de la locul de muncă? Pur și simplu, folosind comanda „start sclav până“.
Deci, avem un maestru cu baze de date testdb1 și testdb2, sunt replicate, respectiv, replici replica-1 si-2 replica. Configurați replicare pe ambele baze de date replica-1 fără a opri master.
Oprește replicarea pe o echipa replica-2 și amintiți-vă poziția comandantului:
mysql @ replica-2> SLAVE STOP;
mysql @ replica-2> SHOW SLAVE STATUS \ G
Master_Log_File: mysql-bin.000015
Exec_Master_Log_Pos: 231

Creați DB benă testdb2 și a relua replicare (pe această manipulare-replica 2 a alerga afară). Dump restaura la replica-1.

Situația de la această replică 1: testdb1 DB situat pe poziții de master și continuă să reproducă testdb2 bazei de date restaurate din poziția haldei la alta. sincronizați-le.

Opriți replicare și amintiți-vă poziția comandantului:
mysql @ replica-1> SLAVE STOP;
mysql @ replica-1> SHOW SLAVE STATUS \ G
Master_Log_File: mysql-bin.000016
Exec_Master_Log_Pos: 501

Asigurați-vă că config pe replica-1 în secțiunea [mysqld] numele specificat a doua bază de date:
replica-do-db = testdb2

Reporniți MySQL, la schimbările din fișierul de configurare pentru a intra în vigoare. Apropo, ai putea reporni MySQL, fără a se opri replicarea - din jurnal, vom ști ce poziție replicarea maestru este oprită.

Acum dețin replicare dintr-o poziție în care a fost suspendat-replica 2 la poziția în care ne-am oprit doar replicare:
mysql @ replica-1> SCHIMBARE MASTER TO MASTER_HOST = "192.168.1.101", MASTER_USER = "replicare", MASTER_PASSWORD = "parola", MASTER_LOG_FILE = "mysql-bin.000015", MASTER_LOG_POS = 231;
mysql @ replica-1> slave încep până când MASTER_LOG_FILE = "mysql-bin.000016", MASTER_LOG_POS = 501;

Replicarea final imediat ce replica vine la o poziție specificată în secțiunea până după care ambele baza noastra de date va corespunde în aceeași poziție a comandantului (pe care o vom reproduce în replica-1). Pentru a verifica acest lucru:
mysql @ replica-1> SHOW SLAVE STATUS \ G
mysql @ replica-1> START SLAVE;
Master_Log_File: mysql-bin.000016
Exec_Master_Log_Pos: 501

Adăugați configurația la replica-1 în secțiunea [mysqld] numele atât bazei de date:
replica-do-db = testdb1
replica-do-db = testdb2

Rocada de master și replica

Comutarea replica în modul de master este necesar, de exemplu, în caz de eșec master sau de a efectua lucrări de întreținere pe ea. Pentru posibilitatea unei astfel de schimbare este necesar să se creeze o replica, ca maestru, sau să facă un maestru pasiv.

Inclusiv jurnalele binare de întreținere (în plus față de releu-binlogam) în configurație în secțiunea [mysqld]:
log-bin = / var / lib / mysql / mysql-bin

Și adăugați utilizatorul să efectueze replicare:
MySQL @ Master> replicare GRANT sclav ON 'testdb' * LA "replication'@'192.168.1.101 identificate de "parola" .;

maestru replicare pasiva conduce ca o replica normala, dar altele decât cele care creează nologie binar - adică, putem începe să reproducă cu ea. Pentru a verifica această comandă „arată starea de master“:
mysql @ replica> SHOW MASTER STATUS \ G
Fișier: mysql-bin.000001
Poziție: 61
Binlog_Do_DB:
Binlog_Ignore_DB:

Acum, pentru a traduce maestru pasiv în modul activ, trebuie să opriți replicare pe ea și să permită replicarea pe fostul comandant activ. Pentru datele de comutare de timp nu este pierdut, comandantul activ trebuie să se blocheze pe înregistrare.
mysql @ maestru> TABELE CU flush CITIRE LOCK
mysql @ maestru> SET GLOBAL READ_ONLY = ON;
mysql @ replica> SLAVE STOP;
mysql @ replica> SHOW MASTER STARE;
Fișier: mysql-bin.000001
Poziție: 61
mysql @ maestru> SCHIMBĂRII MASTER TO MASTER_HOST = "192.168.1.102", MASTER_USER = "replicare", MASTER_PASSWORD = "parola", MASTER_LOG_FILE = "mysql-bin.000001", MASTER_LOG_POS = 61;
mysql @ maestru> porni sclav;
Tot pentru că ne-am schimbat maestrul activ. Poate fi scos din fosta blocare maestru.

Noi înțelegem un pic despre modul în care se configurează replicare în MySQL și a efectua unele operații de bază. Din păcate, dincolo de domeniul de aplicare al articolului au fost următoarele întrebări importante:

eliminarea punctelor unice de eșec (SPF, puncte moarte). Când se utilizează un singur server MySQL, eșecul său a dus la eșecul întregului sistem. Atunci când se utilizează mai multe servere, eșecul oricăreia dintre ele va duce la eșec al sistemului, dacă nu în mod specific nu a avut grijă de ea. Trebuie să se prevadă manipularea situației cu refuzul comandantului și replica. Unul dintre fondurile existente - MMM, cu toate acestea, are nevoie de un fișier de lucru.
echilibrarea încărcării. Dacă utilizați mai multe replici ale ne-ar fi convenabil de a utiliza un mecanism transparent de echilibrare, mai ales în cazul în care replica nu este aceeași performanță. Sub Linux este posibil să se utilizeze soluția standard - LVS.
schimba logica aplicației. Într-o situație ideală, în datele de cereri de citire trebuie să fie trimise la replica, iar schimbarea - pe maestru. Cu toate acestea, din cauza potențialelor replici întârzieri, un astfel de sistem este adesea ineficientă și nevoie pentru a detecta astfel de cereri de citire, care trebuie încă să fie executate pe master.