Highload junior blog-

Andrei Aksenov (Sphinx)

Highload junior blog-

Raportul meu este conceput pentru acei oameni care cunosc cuvântul „replicare“, chiar și știu că în MySQL este, și poate, odată ce sa stabilit în sus, la 15 minute petrecute și uitate. Mai multe despre asta nu știu nimic.

Raportul va fi:

Highload junior blog-

E tot acolo pe Internet, analiza sintaxa nu are nici un sens.

Trecem printr-un pic de teorie, încearcă să explice modul în care totul funcționează în interior, iar apoi vei fi capabil să se scufunde în documentația cu o forță îndoită.

Replicarea poate fi de diferite tipuri. Diferite comparații axă:

  • sincronizare grad schimbare (sincronizare, asincronă, semisync);
  • înregistrarea numărului de servere (M / S, M / M);
  • Modificări în format (-declarație pe bază (SBR), (RBR) bazate pe rând, mixt);
  • modelul teoretic modificările de transmisie (de push, pull).

La tac în modul de master-master, cu siguranță va reuși să toarne actualizări suplimentare, un alt lucru este că, atunci când ajung la primul maestru și să încerce să-l facă o mie de update al doilea rând, capacitatea nu este de ajuns. Trebuie să înțelegi, și să nu confunde cele două punctul cel mai evident, replicare, cu toate acestea, despre un singur lucru, și că datele ar trebui să fie împărțite în sus, și, dacă este necesar, scalate nu nu citească și să scrie, trebuie să faci altceva, dar replicare nu salvează într-adevăr .

Ie Replicarea - este mai mult despre lectură.

Despre sincronizare.

Sincronizare - o garanție a disponibilității și a accesibilității. Accesibilitatea în sensul că am comite trecut, tranzacția se angajează, bine, aceste date pot fi văzute unul sau mai multe noduri noi într-un cluster, ei pot participa la următoarele interogări. Disponibilitate - acest lucru este ceea ce datele sunt, în principiu, există mai mult de un server, dar nu pot pierde tranzacția și nu este disponibil.

Nu există nici un refren „comite a fost de succes, ce înseamnă?“. Sincronă comite înseamnă că avem un (cel puțin o copie) la nivel local și la distanță este încheiat, și anume, avem ceva de a comite o mașină, dacă avem un mod de replicare sincron, aceste modificări se angajeze cu succes o, acestea sunt vizibile pentru cererile ulterioare pe mașina locală la mașina de la distanță (cel puțin unul) sunt de asemenea vizibile. Acest lucru înseamnă că, dacă a existat un standard de situații anormale, adică într-una și serverele au venit resturi și împușcat prin tot ceea ce - de la procesor la șurub, apoi, în ciuda acestui fapt, datele sunt nu doar copie de la un server de la distanță, dar, de asemenea, în plus, poate instantaneu, fără întârziere, pentru a participa la ulterioară tranzacții.

Acestea sunt toate terminologie comune, nu este absolut asociat cu MySQL. În orice sistem distribuit, este aranjat așa.

Asincronă se angajeze - fără garanții suplimentare la fel de norocos.

Semisynchronous comite - o soluție intermediară plăcută, este atunci când avem un local de comite trecut, despre telecomanda nu este cunoscută comite - poate sclav prins la fel de bine, nu poate fi prins, dar cel puțin am avut confirmarea că Kuda aceste date apoi a zburat departe și nu sunt acceptate și, probabil, au semnat în sus.

Despre serverul de înregistrare. Care sunt diferitele tipuri de replicare.

Master-slave clasic, toate modificările sunt turnate pe un singur server, apoi copiate la masa replica.

Master-adevărat maestru - atunci când schimbările sunt turnat pe o grămadă de masterat, în același timp, și într-un fel de la unul la altul, celălalt pe al treilea, și toate dintre ele, dând naștere la o serie de plăceri, precum și o serie de probleme automate. Este clar că, atunci când aveți un singur „copie de aur“ și cu ea câteva observații care ar trebui (în mod ideal - în secunde) pentru a repeta „copie de aur“, totul este relativ simplu în ceea ce privește modul în care datele înainte și înapoi pentru a conduce și că de a face pe o copie dată. Cu master-maestru începe interesant, „dureri de cap“, și, repet, nu în mod specific în cazul MySQL, ci pur teoretică. Cum să fie, în cazul în care două nodah a încercat să conducă simultan aceeași tranzacție, care modifică aceleași date, și, le schimbă, pentru simplitate de exemplu, în mod diferit. Este clar că ambele aceste două modificări, nu putem aplica. La momentul când vom începe pe un nod pentru a schimba ceva, la un al doilea nod încă nimic. Conflict. Una dintre operațiunile ar trebui să se rostogolească înapoi. individuale „Dance“ În plus, începând cu sincronizarea ceasurilor, etc.

Interesant punct - chiar și o opțiune, atunci când termina cu toate schimbările de artiști s-au răspândit treptat peste tot, încă nu ajută faptul că cea mai mare lățime de bandă a scrie. E păcat, dar asta e.

Acum mai aproape de bazele de date, „magic“ pe bază de declarație de format, bazat pe rând, etc. Despre schimbarea formatului.

Ce se poate face? Puteți transfera cereri de ei înșiși, și puteți doar prin transfer schimbat linii. Subliniez - încă nu am scufundat în jungla de MySQL, se poate face cu orice bază de date în care există solicitări, generatoare de mare (sau nu), valoarea de schimbare, și anume, de reînnoire o mulțime de date. Acest lucru ridică întrebarea - exact ce se va copia? Puteți face cereri înainte și înapoi între nodurile de a conduce, și este posibil de a conduce numai datele modificate. Este interesant faptul că un fel și că este foarte rău! Puteți încerca, de asemenea, să se amestece.

Un alt punct cu privire la faptul că sunt orice replicare. Despre modelul de distribuție. Probabil, undeva nu este încă încă complet bazat Push model pe cale de disparitie, atunci când acel nod, care a făcut modificări, și ea este obligată să le trimită la toate celelalte noduri noi. În ceea ce privește programarea și monitorizarea state'ov acest lucru este încă confuzie. Prin urmare, taxiuri Pull-based. Pentru a face actualizări de la un anumit nod - este mult mai ușor de program decât nodul unul pentru a monitoriza cluster haotic de replici sale.

Unii termeni comuni intrat. Ne întoarcem la modul făcut în MySQL.

MySQL, în sine, este un fel de înșelăciune. Un strat logic numit MySQL, care este angajată de către fiecare comună și izolate din cazurile de stocare a datelor - de optimizare a rețelei, cache-uri, etc. Stratul fizic particular care este responsabil pentru stocarea datelor se află pe podea de mai jos. Există mai multe built-in, există un plugin-uri pune. Dar chiar și MyISAM construit, InnoDB, etc. locuiesc la stratul fizic. Arhitectura Plugin - este rece, puteți ridica un nou motor, dar imediat există o anumită non-optimă. În principiu, log'i tranzacțional a scrie în avans (WAL), care sunt fizic strat de stocare încă scrie, ar fi bine să utilizați pentru a reproduce, și în cazul în care sistemul știe că există un anumit nivel fizic, sau suficient de bine asociat cu stratul fizic , ar putea fi un jurnal separat, în mod logic, nu scrie, și de a folosi aceeași WAL. Dar MySQL este conceptual imposibil, sau în cazul în care schimbarea interfeței PSE, astfel încât devine conceptual posibil, va exista o mulțime de muncă.

Replicarea este implementată la nivelul MySQL. In aceasta sunt bune - în plus față de un jurnal într-un motor profund de stocare internă, există un jurnal mai mult sau mai puțin logică, eventual la nivel statement'ov, care este menținut separat de acest motor. Acest "extra" de securitate, etc. În plus, pentru că nu există restricții în interior, puteți face orice tip de motor de substituție creativ „on the fly“.

În ceea ce privește desfășurarea în MySQL 4.1 a fost realizat: master-slave, pe bază-pull, strict și riguros asincronă SBR. Dacă rămâneți blocat în 4.x epoca antică, atunci poate că sunt toate rele. 5.x este deja aproape 10 ani - este timpul pentru a face upgrade.

Funny urmări versiuni, ca oameni înaintau pe tot felul de greble și când să facă nimic nu a fost imposibil, înșurubate la acest nou grebla racleti viata nu a fost atât de dureros. Deci, în versiunea 5.1 înăsprit RBR, pentru a compensa problemele inevitabile cu SBR, și înăsprit mod mixt. În versiunea 5.6 a înăsprit piese mai plăcute: semi-sincronizare, sclav întârziat, GTID.

Un alt punct. Deoarece MySQL - este un strat comun, pe de o parte, și o mulțime de motoare pluggable, pe de altă parte, inclusiv built-in, există un anumit punct de cluster divin NDB, despre care vorbesc rece. Există un sistem complet sincron replicare de master-master, foarte accesibil bază de date în memorie. Dar există un avertisment - de îndată ce începe să se uite pentru persoanele care folosesc prodakshene de cluster NDB, atunci astfel de oameni sunt foarte puțini.

Ce face Master în momentul în care vă decideți să activați replicare? Pe expertul se întâmplă destul de un pic de mișcări suplimentare. Ca de obicei, vom accepta cereri de pe rețea, le analiza, alungare tranzacții, le repara, etc. În plus, la nivel logic începe să stăpânească MySQL log binar - fișier, acesta nu este un text, care a revarsat totul se schimbă. De asemenea, comandantul este capabil de a trimite aceste jurnale prin intermediul rețelei. Toate acestea este foarte simplu și un fel de lucrări.

Ce face un sclav? Modificări în slave este mai bine să nu trimită, pentru că puteți obține în neînțeles. Într-un pic mai mult decât munca de sclavi. În plus, pentru a păstra un jurnal în plus, și trimite-l la cerere, există încă fir care merge la un maestru la distanță, poate nici măcar una, și shake-uri din log'i binar. Decizia „să mergem la mai multe programe de masterat de la distanță și de a descărca jurnalele diferite cu ei“ este ambiguă. Pe de o parte de bine, și se transformă pe cealaltă diferența de moment. Doar copiați fizic fișierele de pe CSP nu se poate obține deja un jurnal pe server, poziționează pe plan local, noi le trage pe grila, a pus într-un jurnal separat, chiar și un singur fir de pârtii și încearcă să joace aceste jurnale locale. Cel mai infernal, în opinia mea, constă în faptul că, până la versiunea 5.6 identificarea unei anumite tranzacții în jurnalul a avut loc pe numele fișierului și poziția în expertul. O soluție interesantă.

Acesta este modul de înregistrare, care este un insert simplu trece fără replicare:

Highload junior blog-

cerere Skonnektilos la server, a pus masa, și a închis.

Cu replicare obține câțiva pași suplimentari:

Highload junior blog-

scriitor Apendicele doar merge la master, dar, în plus, aceste date vin într-o formă sau alta în jurnalul binar, apoi se balanseze în întreaga rețea pentru a releu jurnalul, apoi de la releul log'a repleyutsya treptat (dacă am avut noroc, iar robul nu lag, repleyutsya dreapta) în tabelul de pe slave, după toate acestea este disponibil în cititor.

Exact ceea ce devine în jurnal binar, în funcție de setările de SBR / RBR / mixt. În cazul în care continuă să crească? Reprezentați-vă de bază de date. Am zburat într-o simplă interogare „reînnoiți o anumită înregistrare“ - utilizatori UPDATE SET x = 123 unde id = 456

Ce este scris în jurnalul binar? În principiu, toate la fel, într-adevăr. Putem înregistra o anchetă scurtă, sau (cum a fost actualizat o singură înregistrare) poate scrie schimbarea într-un fel într-un anumit format.

O altă situație. Imaginați-vă că am zburat aceeași cerere, care, în sine este mic, iar datele se schimbă o mulțime - utilizatori UPDATE SET = bonus bonus + 100

Există o opțiune eficientă - pentru a scrie interogarea, deoarece interogarea - exact 32 octeți și înregistrările poate actualiza un număr arbitrar - 1000 100 000, 1 milion, la fel de mult cât este necesar. Ineficienți scrie înregistrările modificate în jurnal.

Și ce s-ar întâmpla dacă am pus un jurnal într-o interogare simplu „să deconectați toți utilizatorii care nu autentifica pentru o lungă perioadă de timp“ - utilizatori UPDATE SET = dezactivat 1 UNDE LAST_LOGIN