Mysql replikacija više baza podataka. Šta je replikacija u MySQL-u? Dalje radnje vršimo na Slave serveru

Replikacija podataka mysql omogućava vam da imate tačnu kopiju baze podataka sa jednog servera - glavnog servera (vodeći server) na jednom ili više drugih servera (slave server). Po defaultu, Mysql replikacija je asinhrona.
Što znači da glavni server nema kontrolu i ne zna da li slave serveri čitaju log fajl i da li to rade ispravno.
Postoje i druge vrste sinhronizacije, sinhrone i polusinhrone, gdje se ovi procesi kontroliraju.
Ovisno o postavkama, možete replicirati i cijele baze podataka i pojedinačne tablice baze podataka.

Za šta možete koristiti replikaciju:
1. Distribucija opterećenja između hostova radi poboljšanja performansi.
U takvoj šemi, glavni čvor će obavljati operacije čitanja i pisanja, čvorovi koji imaju pretplatu na glavni čvor će pružiti bazu za čitanje, čime ćemo glavni server osloboditi od operacija čitanja
2. Sigurnost podataka i jednostavnost održavanja, budući da slave čvor sadrži podatke samo za čitanje, izmjene podataka o pretplatniku će biti ograničene, jednostavnost održavanja - mogućnost pokretanja procesa koji opslužuju bazu podataka bez prekida rada aplikacija
3. Distribucija podataka na velike udaljenosti. Možete kreirati kopiju podataka na bilo kojem hostu, bez obzira na njegovu lokaciju
mysql podržava sljedeće metode replikacije:
Tradicionalna - metoda je zasnovana na replikaciji događaja iz master-ove binarne datoteke evidencije i zahtijeva datoteke evidencije. Položaji između glavnog i slave servera moraju biti sinkronizirani.
Metoda koja koristi globalne identifikatore transakcije GTID-ove (transakciona metoda)
mysql podržava sljedeće vrste sinhronizacije:
asinhrona (jednosmjerna sinhronizacija)
polusinhroni (djelimična kontrola pretplatnika)
sinhroni (potpuna kontrola pretplatnika)

Postavljanje replikacije Mysql baze podataka tradicionalnim metodom

Princip rada
Glavni server sadrži bin log datoteke, koje bilježe sve promjene koje se događaju u glavnoj bazi podataka, datoteka koja opisuje imena bin datoteke, kao i poziciju u dnevniku na kojoj su zadnji glavni podaci zabilježeni
Slave čvor prima podatke od mastera koji imaju informacije o imenima bin datoteke i poziciju u log datoteci.

Podešavanje čarobnjaka
my.ini mora sadržavati jedinstveni identifikator - broj od 1 do 2 do 32. stepena - 1, server-id.
Podrazumevano server-id=0, što znači da se ne prihvataju pretplate sa slave servera

log-bin=mysql-bin
server-id=1

Ova dva reda su dovoljna za početak
Napomena: međutim, ako se koristi InnoDB, dodatno se preporučuje dodavanje
innodb_flush_log_at_trx_commit=1
sync_binlog=1

I morate provjeriti da mogućnost rada s mrežom nije onemogućena i da je postavljen parametar skip-networking
Slave server se povezuje sa glavnim pomoću korisničkog imena i lozinke, tako da prvo kreiramo korisnika na glavnom serveru
CREATE USER repl@%.mydomain.com IDENTIFIKOVANO OD slavepass;
GRANT REPLICATION SLAVE NA *.* TO repl@%.mydomain.com;

Pogledajmo stanje
PRIKAŽI MASTER STATUS
Ako je procedura za kreiranje binarnih dnevnika već pokrenuta, tada za InnoDB tabele prvo morate zaključati tabele u jednoj od sesija
FLUSH TABLE SA READ LOCK;
Ako izađete iz sesije, zaključavanje stola se automatski oslobađa
U drugoj sesiji dobijamo vrijednosti imena bin dnevnik i poziciju
Obje vrijednosti predstavljaju koordinate replikacije na kojima slave server mora početi čitati iz datoteke na željenoj lokaciji da bi započeo replikaciju.
Sljedeći korak ovisi o tome da li postoje podaci na slave serveru, podaci sa mastera
Ako postoje, onda ostavljamo tabele zaključane i kreiramo dump(ovo je preporučeni način kada koristite InnoDB)
Tip baze podataka možete saznati pomoću naredbe
mysqlshow -u mysql_user -p -i ime-baze podataka
Ako je baza podataka pohranjena u binarnim datotekama, onda se one mogu kopirati sa glavnog na slave server
Hajdemo dump
mysqldump --sve-baze podataka --master-data dbdump.db
da odaberete baze mysqldump --baze podataka --master-data dbdump.db
parametar master-data, automatski se dodaje PROMIJENI GLASNOG U na slave čvoru, ako parametar nije dodan, tada se sve tabele u sesiji moraju ručno zaključati
Otključaj
UNLOCK TABLES;

Konfiguracija slave čvora A
Dodaj my.ini server-id od ličnog od glavnog i od drugih čvorova

server-id=2

Kreirajte pretplatu
PROMIJENI GLASNOG U
MASTER_HOST=master_host_name,
MASTER_USER=replication_user_name,
MASTER_PASSWORD=lozinka_replikacije,
MASTER_LOG_FILE=ime_zapisa_log_datoteke,
MASTER_LOG_POS=snimljena_log_pozicija;

Kada postavljate replikaciju s postojećim podacima, morate prenijeti snimak s glavnog na slave prije nego što replikacija počne
Koristimo mysqldump
1.Pokrenite slave čvor koristeći --skip-slave-start parametar za sprječavanje pokretanja replikacije
2.Uvezite dump datoteku
mysql fulldb.dump
3. Pokrenite proces pretplate
START SLAVE;
Provjera statusa replikacije
PRIKAŽI SLAVE STATUS\G
Slave_IO_State: - trenutno stanje slave uređaja
Slave_IO_Running: - da li se tok podataka čita sa mastera
Slave_SQL_Running: - da li rade? sql upiti, trebalo bi da bude da

Primjer Konfigurirajmo glavni (master) server – ip 11.11.11.10 V my.ini
[
mysqld] log-bin=mysql-bin server-id=1
Kreirajte korisnika mysql -u root -p GRANT REPLICATION SLAVE ON *.* TO replica@% IDENTIFICIRANO lozinkom; FLUSH PRIVILEGES;
Zatim zaključavamo sve tabele u bazi podataka FLUSH TABLE SA READ LOCK;
Gledamo status PRIKAŽI MASTER STATUS; Pamtimo naziv datoteke i poziciju, koristit ćemo ih na Slave serveru za pretplatu

Na Slave B my.ini
log-bin=mysql-bin server-id=2

Kreirajte pretplatu PROMIJENI MASTER U MASTER_HOST=11.11.11.10, MASTER_PORT=3306,
MASTER_USER=replika, MASTER_PASSWORD=lozinka,
MASTER_LOG_FILE=server-mysql-bin.000002,
MASTER_LOG_POS=1151664, MASTER_CONNECT_RETRY=10;
START SLAVE;
Status replikacije PRIKAŽI SLAVE STATUS\G

Termin replikacija se koristi za označavanje mehanizma za sinhronizaciju više kopija podataka, što povećava sigurnost informacija, toleranciju grešaka i performanse sistema. Upečatljiv primjer je replikacija baze podataka između dva servera.

Master-Slave MySQL replikacija

U terminologiji Master-Slave, master je primarni server sa bazom podataka; on piše u bazu podataka, ali čitanje se distribuira između glavnog i slave uređaja u zavisnosti od opterećenja sistema, što povećava toleranciju grešaka i performanse. Osim toga, zahvaljujući ovom pristupu, kopija baze podataka je uvijek pri ruci i može se vratiti u slučaju kvara na jednom od servera.

U kojim situacijama može biti potreban slave server? Na primjer, kada veliki niz podataka stigne za upisivanje u bazu podataka, a glavni server jednostavno nema vremena za čitanje i klijent mora čekati kraj upisivanja, što se može izbjeći zahvaljujući slave serveru.

Moguće su situacije kada glavni server otkaže; u tom slučaju slave server preuzima sve funkcije glavnog servera i radi sam dok se ne vrati. Klijent najvjerovatnije neće ništa primijetiti, a sigurno neće čekati sat-dva-tri da tehničar to popravi.

Postavljanje replikacije nije nimalo teško, jer je mehanizam ugrađen u MySQL od samog početka.

Postavljanje na Master server

Počnimo s uređivanjem konfiguracijske datoteke my.cnf, koja se najčešće nalazi na /etc/mysql/my.cnf. Morate pronaći i dekomentirati (ukloniti #), ili napisati takve redove.

Bind-address = 0.0.0.0 server-id = 1 log_bin = /var/log/mysql/mysql-bin.log

Bitan! Ako je vezana adresa već registrovana, potrebno ju je promijeniti, inače neće biti moguće uspostaviti vezu između servera.

Odmah nakon toga, ponovo ćemo pokrenuti bazu podataka na serveru.

/etc/init.d/mysql restart

Sada treba da kreiramo korisnika sa pravima za repliciranje naše baze podataka, to se može uraditi iz root-a MySQL konzola koristeći naredbu

ODOBRITE REPLIKACIJU SLAVE NA *.* TO "slave_user"@"%" IDENTIFIKOVANO OD "slave_password"; FLUSH PRIVILEGES;

Gdje umjesto “slave_user” i “slave_password” trebate napisati login i lozinku za slave.

Pogledajmo sada glavne podatke

PRIKAŽI MASTER STATUS;

Vrijednosti stupaca File I Pozicija morate zapamtiti, oni će se koristiti za postavljanje slave-a, na šta sada prelazimo.

Podešavanje na Slave serveru

Prvi korak je kreiranje baze podataka sa istim imenom kao i ona koju ćemo replicirati. Ovo je važan korak i ne treba ga zanemariti. Zatim idite na konfiguracijsku datoteku koja nam je već poznata my.cnf i napišite podešavanja.

Server-id = 2 relay-log = /var/log/mysql/mysql-relay-bin.log bin-log = /var/log/mysql/mysql-bin.log

Bitan! U bin-log je zapisana putanja do bin-log na mester serveru . ID servera mora se razlikovati od glavnog ID-a, prikladno ga je postaviti na još 1.

CHANGE MASTER TO MASTER_HOST="1.1.1.1", MASTER_USER="slave_user", MASTER_PASSWORD="slave_password", MASTER_LOG_FILE = "mysql-bin.000001", MASTER_LOG_POS = 107; START SLAVE;

Gdje je host IP adresa mastera, prijava i lozinka odgovaraju onima koje smo kreirali na masteru, master_log_file i master_log_pos su ispunjeni informacijama sa poslednja stavka za konfigurisanje glavnog servera .

Od ovog trenutka, sve promjene u bazi podataka će se prenijeti sa master na slave.

Provjera statusa replikacije

Pored naredbe SHOW MASTER STATUS; Postoji sličan za slave SHOW SLAVE STATUS\G, koji će prikazati tabelu sa informacijama. Glavni znak da su se serveri povezali i da rade ispravno je prisustvo takvih linija

Replikacija- tehnika koja se koristi u arhitekturi sistema koji rade pod opterećenjem, a rezultat toga je distribucija opterećenja pri radu sa jednom bazom podataka na više servera. MySQL MASTER SLAVE replikacija se češće koristi, ali se koristi i drugi tip replikacije - Master-Master.

Šta je MySQL MASTER SLAVE replikacija i za šta se koristi?

Replikacija Master-Slave uključuje umnožavanje podataka na podređeni MySQL server; takvo umnožavanje se vrši uglavnom kako bi se osigurala pouzdanost. Ako glavni server ne uspije, njegove funkcije se prebacuju na Slave.

Replikacija se također može izvršiti radi poboljšanja performansi sistema, ali performanse su ovdje gotovo uvijek sekundarne.
Kada aplikacija radi sa bazom podataka, najčešće su operacije SELECT- zahtjevi za čitanje podataka, modificiranje podataka - zahtjevi IZBRIŠI, INSERT, UPDATE, ALTER Statistički se to dešava mnogo rjeđe.

Da bi se spriječio gubitak podataka ako jedan od servera ne uspije, operacije promjene informacija u tabelama uvijek se obrađuju od strane glavnog servera. Promjene se zatim repliciraju na Slave. Čitanje se može obaviti sa servera koji igra ulogu Slave-a.
Zahvaljujući tome, možete dobiti dobit u performansama uz pouzdanost.

Rješenje je popularno, ali nije uvijek primjenjivo jer može doći do kašnjenja tokom replikacije - ako se to dogodi, informacije također moraju biti pročitane sa glavnog servera.

Usmjeravanje zahtjeva određenog tipa na određeni poslužitelj baze podataka se u svakom slučaju implementira na razini aplikacije.

Ako uradite podjelu SELECT upite a sve ostalo na nivou programa, šaljući ih na željeni server kada jedan od njih zakaže, aplikacija koju infrastruktura opslužuje će biti neoperabilna. Da bi ovo funkcioniralo, morate obezbijediti više složeno kolo i rezervišite svaki od servera.

Replikacija je za toleranciju grešaka, a ne za skaliranje.

MySQL MASTER SLAVE replikacija - postavljanje na Debian

Koristićemo dva servera sa adresama:

  • Glavni server 192.168.0.1
  • Slave server 192.168.0.2

Za demonstraciju se koristi VDS povezan na lokalnu mrežu.
Kako bismo uvijek sa sigurnošću znali na kojem serveru izvršavamo ovu ili onu naredbu, uredit ćemo /etc/hosts fajlove na oba servera

192.168.0.1 master

192.168.0.2 slave

Zamijenimo postojeće vrijednosti u /etc/hostname sa master i slave, kako bi promjene stupile na snagu i ponovo pokrenule server.

1. Vršimo podešavanja na glavnom serveru.

root@master:/#

Uređivanje glavnog konfiguracijski fajl server baze podataka

mcedit /etc/mysql/my.cnf

Odaberite ID servera - možete odrediti bilo koji broj, zadana vrijednost je 1 - samo dekomentirajte red

server-id = 1

Postavite putanju do binarnog dnevnika - također navedeno po defaultu, dekomentirajte ga

Postavite ime baze podataka koju ćemo replicirati na drugi server

binlog_do_db = db1

Ponovo pokrenite Mysql tako da se konfiguracijska datoteka ponovo pročita i promjene stupe na snagu:

/etc/init.d/mysql restart

2. Postavite neophodna prava korisnika

Idite na konzolu servera baze podataka:

Korisniku na slave serveru dajemo potrebna prava:

ODOBRITE REPLIKACIJU SLAVE NA *.* TO "slave_user"@"%" IDENTIFIKOVANO SA "123";

Zaključavanje svih tabela u bazi podataka

FLUSH TABLE SA READ LOCK;

Provjera statusa glavnog servera:

+——————+———-+—————+——————+
| File | Položaj | Binlog_Do_DB | Binlog_Ignore_DB |
+——————+———-+—————+——————+
| mysql-bin.000001 | 327 | db1 | |
+——————+———-+—————+——————+
1 red u setu (0,00 sek)

3. Kreirajte dump baze podataka na poslužitelju

Kreirajte dump baze podataka:

mysqldump -u korijen -p db1 > db1.sql

Otključajte tabele u mysql konzoli:

4. Prenesite dump baze podataka na Slave server

scp db1.sql [email protected]:/Dom

Dalje radnje vršimo na Slave serveru

root@slave:/#

5. Kreiranje baze podataka

Učitavanje dump-a:

mysql -u korijen -p db1< db1.sql

6. Napravite promjene u my.cnf

mcedit /etc/mysql/my.cnf

Dodjeljujemo ID tako što povećavamo vrijednost postavljenu na Master serveru

server-id = 2

Postavite putanju do dnevnika releja

relay-log = /var/log/mysql/mysql-relay-bin.log

i putanju do bin dnevnika na glavnom serveru

log_bin = /var/log/mysql/mysql-bin.log

Odredite bazu

binlog_do_db = db1

Ponovno pokretanje usluge

/etc/init.d/mysql restart

7. Postavite vezu sa glavnim serverom

CHANGE MASTER TO MASTER_HOST="192.168.0.1", MASTER_USER="slave_user", MASTER_PASSWORD="123", MASTER_LOG_FILE = "mysql-bin.000001", MASTER_LOG_POS = 327;

Počinjemo replikaciju na slave serveru:

Možete provjeriti rad replikacije na Slave-u sa sljedećim zahtjevom:

**************************** 1. red ******************** *******
Slave_IO_State: Čeka se da master pošalje događaj
Master_Host: 192.168.0.1
Glavni_korisnik: slave_user
Glavni_port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000002
Read_Master_Log_Poz: 107
Relay_Log_File: mysql-relay-bin.000003
Relay_Log_Poz: 253
Relay_Master_Log_File: mysql-bin.000002
Slave_IO_Pokreće: Da
Slave_SQL_Pokreće: Da
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Zadnja_Errno: 0
Zadnja_Greška:
Brojač_skip: 0
Exec_Master_Log_Poz: 107
Relay_Log_Space: 555
Do_Stanje: Nema
Do_Log_File:
Do_log_Poz: 0
Master_SSL_Dozvoljeno: Ne
Master_SSL_CA_File:
Master_SSL_CA_Puta:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Sekunde_Iza_Majstora: 0
Master_SSL_Verify_Server_Cert: Ne
Zadnja_IO_Errno: 0
Zadnja_IO_Greška:
Zadnja_SQL_Errno: 0
Zadnja_SQL_Greška:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
1 red u setu (0,00 sek)

Budući da nije bilo grešaka, možemo zaključiti da je replikacija ispravno konfigurirana.

Is dobar alat skaliranje, ali glavni nedostatak je desinhronizacija kopiranja podataka i kašnjenja, što može biti kritično.

Korištenje modernijeg rješenja omogućava vam da ih potpuno izbjegnete. Jednostavan je za postavljanje, pouzdan i eliminira potrebu za ručnim kopiranjem dumpova baze podataka.

whisk 8. aprila 2009. u 11:10

Osnove MySQL replikacije

  • MySQL

Sa replikacijom MySQL servera sam se upoznao relativno nedavno, i dok sam vršio razne eksperimente sa konfiguracijom, zapisao sam šta mi je uspelo. Kada sam prikupio dosta materijala, došla je ideja da napišem ovaj članak. Pokušao sam prikupiti savjete i rješenja za neke od najosnovnijih problema s kojima sam se susreo. Usput ću dati veze do dokumentacije i drugih izvora. Ne mogu se pretvarati da to opisujem u potpunosti, ali nadam se da će članak biti od koristi.

Kratak uvod

Replikacija (od latinskog replico - ponavljam) je replikacija promjena podataka sa glavnog servera baze podataka na jedan ili više zavisnih servera. Pozvaćemo glavni server majstor, i zavisna - replike.
Promjene podataka koje se događaju na masteru ponavljaju se na replikama (ali ne i obrnuto). Stoga se upiti za promjenu podataka (INSERT, UPDATE, DELETE, itd.) izvršavaju samo na masteru, dok se upiti za čitanje podataka (drugim riječima, SELECT) mogu izvršiti i na replikama i na masteru. Proces replikacije na jednoj od replika ne utječe na rad drugih replika i praktično ne utječe na rad mastera.
Replikacija se izvodi korištenjem binarnih dnevnika koji se održavaju na masteru. Oni pohranjuju sve upite koji vode (ili potencijalno dovode) do promjena u bazi podataka (upiti se ne spremaju eksplicitno, pa ako želite da ih pogledate, morat ćete koristiti uslužni program mysqlbinlog). binlogovi se prenose u replike (binlog preuzet sa glavnog računala naziva se "relay binlog") i pohranjeni upiti se izvršavaju počevši od određene pozicije. Važno je shvatiti da se tokom replikacije ne prenose sami promijenjeni podaci, već samo zahtjevi koji uzrokuju promjene.
Kod replikacije, sadržaj baze podataka se duplira na nekoliko servera. Zašto je potrebno pribjeći dupliranju? Postoji nekoliko razloga:
  • performanse i skalabilnost. Jedan poslužitelj možda neće moći podnijeti opterećenje uzrokovano istovremenim operacijama čitanja i pisanja u bazi podataka. Prednosti kreiranja replika će biti veće što više čitanja po zapisu imate na svom sistemu.
  • tolerancije grešaka. U slučaju kvara replike, svi zahtjevi za čitanje mogu se sigurno prenijeti na master. Ako master ne uspije, zahtjevi za pisanje mogu se prenijeti na repliku (nakon što se master vrati, može preuzeti ulogu replike).
  • backup podataka. Replika se može "usporiti" na neko vrijeme da izvrši mysqldump, ali master ne može.
  • odloženi obračuni. Teški i spori SQL upiti mogu se izvršiti na zasebnoj replici bez straha od ometanja normalnog rada cijelog sistema.
Osim toga, tu su i neke druge zanimljive karakteristike. Budući da se u replike ne prenose sami podaci, već upiti koji uzrokuju njihovu promjenu, možemo koristiti različite strukture tablica na masteru i replikama. Konkretno, tip tabele (mašina) ili skup indeksa može se razlikovati. Na primjer, da izvršimo pretraživanje punog teksta, možemo koristiti tip tablice MyISAM na replici, uprkos činjenici da će master koristiti InnoDB.

Postavljanje replikacije

Recimo da imamo radnu bazu podataka MySQL podaci, već ispunjen podacima i uključen u rad. I iz jednog od gore opisanih razloga, omogućit ćemo replikaciju našeg servera. Naši početni podaci:
  • Glavna IP adresa je 192.168.1.101, replike su 192.168.1.102.
  • MySQL instaliran i konfigurisan
  • trebate konfigurirati replikaciju testdb baze podataka
  • možemo pauzirati čarobnjaka na neko vrijeme
  • naravno imamo root na obe mašine
Postavke čarobnjaka
Obavezno navedite jedinstveni ID servera, putanju za binarne dnevnike i naziv baze podataka za replikaciju u odjeljku:
server-id = 1
log-bin = /var/lib/mysql/mysql-bin
replicate-do-db = testdb
Provjerite imate li dovoljno prostora na disku za binarne zapise.

Dodajmo korisnika replikacije pod čijim pravima će se vršiti replikacija. Privilegija "slave replikacije" će biti dovoljna:
mysql@master> GRANT slave replikacije NA "testdb".* NA "replikaciju"@"192.168.1.102" IDENTIFIKOVANO OD "lozinke";

Ponovo pokrenite MySQL da bi promjene u konfiguraciji stupile na snagu:
root@master# servis mysqld restart

Ako je sve prošlo dobro, naredba "show master status" bi trebala pokazati nešto poput ovoga:
mysql@master>POKAŽI MASTER STATUS\G
Fajl: mysql-bin.000003
Pozicija: 98
Binlog_Do_DB:
Binlog_Ignore_DB:
Vrijednost pozicije bi se trebala povećavati kako se izvrše promjene u bazi podataka na masteru.

Postavke replike
Navedite ID servera, ime baze podataka za replikaciju i putanju do relejnih binlogova u odjeljku konfiguracije, a zatim ponovo pokrenite MySQL:
server-id = 2
relay-log = /var/lib/mysql/mysql-relay-bin
relay-log-index = /var/lib/mysql/mysql-relay-bin.index
replicate-do-db = testdb

Root@replica# servis mysqld restart

Prijenos podataka
Ovdje ćemo morati zaključati bazu podataka za pisanje. Da biste to učinili, možete ili zaustaviti aplikacije ili koristiti oznaku read_only na masteru (pažnja: ova zastavica nema efekta na korisnike sa SUPER privilegijom). Ako imamo MyISAM tabele, hajde da "ispraznimo tabele":
mysql@master> FLUSH TABLE SA ZAKLJUČAVANJEM ČITANJA;
mysql@master> SET GLOBAL read_only = ON;

Pogledajmo status mastera pomoću naredbe "show master status" i zapamtimo vrijednosti datoteke i pozicije (nakon uspješnog blokiranja mastera, ne bi se trebale mijenjati):
Fajl: mysql-bin.000003
Pozicija: 98

Izbacujemo bazu podataka, a nakon što je operacija završena, uklanjamo glavnu bravu:
mysql@master> SET GLOBAL read_only = OFF;

Prenosimo dump u repliku i vraćamo podatke iz nje.
Konačno, počinjemo replikaciju sa naredbama “change master to” i “start slave” i vidimo da li je sve prošlo kako treba:
mysql@replica> PROMIJENI MASTER U MASTER_HOST = "192.168.1.101", MASTER_USER = "replikacija", MASTER_PASSWORD = "lozinka", MASTER_LOG_FILE = "mysql-bin.000003", MASTER_LOG_POS; =
mysql@replica> start slave;
Od mastera preuzimamo vrijednosti MASTER_LOG_FILE i MASTER_LOG_POS.

Pogledajmo kako ide replikacija s naredbom "show slave status":
mysql@replica> PRIKAŽI SLAVE STATUS\G
Slave_IO_State: Čeka se da master pošalje događaj
Master_Host: 192.168.1.101
Glavni_Korisnik: replikacija
Glavni_port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000003
Read_Master_Log_Poz: 98
Relay_Log_File: mysql-relay-bin.001152
Relay_Log_Poz: 235
Relay_Master_Log_File: mysql-bin.000003
Slave_IO_Pokreće: Da
Slave_SQL_Pokreće: Da
Replicate_Do_DB: testdb,testdb
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Zadnja_Errno: 0
Zadnja_Greška:
Brojač_skip: 0
Exec_Master_Log_Poz: 98
Relay_Log_Space: 235
Do_Stanje: Nema
Do_Log_File:
Do_log_Poz: 0
Master_SSL_Dozvoljeno: Ne
Master_SSL_CA_File:
Master_SSL_CA_Puta:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Sekunde_Iza_Majstora: 5

Istaknuo sam sada najzanimljivije vrijednosti. Ako replikacija započne uspješno, njihove vrijednosti bi trebale biti približno iste kao na listi (pogledajte opis naredbe "show slave status" u dokumentaciji). Vrijednost Seconds_Behind_Master može biti bilo koji cijeli broj.
Ako je replikacija normalna, replika će pratiti master (broj dnevnika u Master_Log_File i Exec_Master_Log_Pos pozicija će se povećati). Vrijeme kašnjenja replike od mastera (Seconds_Behind_Master), idealno, treba biti jednako nuli. Ako se ne smanjuje ili raste, moguće je da je opterećenje na replici previsoko - jednostavno nema vremena ponoviti promjene koje se dešavaju na masteru.
Ako je Slave_IO_State prazan, a Seconds_Behind_Master je NULL, replikacija nije započela. Pogledajte MySQL dnevnik da saznate razlog, eliminišete ga i ponovo pokrenite replikaciju:
mysql@replica> start slave;

Kroz ove jednostavne korake dobijamo repliku čiji su podaci identični podacima na masteru.
Usput, vrijeme kada je master blokiran je vrijeme kada je dump kreiran. Ako je potrebno nedopustivo dugo vremena za kreiranje, možete pokušati ovo:

  • blokirajte pisanje masteru sa zastavicom read_only, zapamtite poziciju i zaustavite MySQL.
  • nakon toga kopirajte datoteke baze podataka u repliku i omogućite master.
  • započnite replikaciju na uobičajeni način.
Postoji nekoliko načina da napravite repliku bez zaustavljanja mastera, ali oni ne rade uvijek.

Dodavanje replika

Pretpostavimo da već imamo radni master i repliku i da im trebamo dodati još jednu. Ovo je još lakše učiniti nego dodati prvu repliku masteru. A ono što je mnogo ljepše je da nema potrebe zaustavljati majstora zbog ovoga.
Prvo, hajde da konfigurišemo MySQL na drugoj replici i proverimo da li smo uneli potrebne parametre u konfiguraciju:
server-id = 3
replicate-do-db = testdb

Sada zaustavimo replikaciju na prvoj replici:
mysql@replica-1> stop slave;

Replika će nastaviti da radi normalno, ali podaci na njoj više neće biti aktuelni. Pogledajmo status i zapamtimo glavnu poziciju koju je replika dosegla prije zaustavljanja replikacije:
mysql@replica-1> PRIKAŽI SLAVE STATUS\G

Vrijednosti koje su nam potrebne bit će Master_Log_File i Exec_Master_Log_Pos:
Master_Log_File: mysql-bin.000004
Exec_Master_Log_Poz: 155

Kreirajmo dump baze podataka i nastavimo replikaciju na prvoj replici:
mysql@replica-1> START SLAVE;

Vratimo podatke iz dumpa na drugu repliku. Zatim omogućite replikaciju:
mysql@replica-2> PROMJENI MASTER U MASTER_HOST = "192.168.1.101", MASTER_USER = "replikacija", MASTER_PASSWORD = "lozinka", MASTER_LOG_FILE = "mysql-bin.000004", MASTER_LOG_POS;
mysql@replica-2> START SLAVE;

Vrijednosti MASTER_LOG_FILE i MASTER_LOG_POS su vrijednosti Master_Log_File i Exec_Master_Log_Pos, respektivno, iz rezultata naredbe "show slave status" na prvoj replici.
Replikacija mora početi od pozicije na kojoj je prva replika zaustavljena (i, prema tome, kreira se dump). Tako ćemo imati dvije replike sa identičnim podacima.

Spajanje replika

Ponekad se javlja sljedeća situacija: postoje dvije baze podataka na masteru, od kojih je jedna replicirana na jednoj replici, a druga na drugoj. Kako postaviti replikaciju dvije baze podataka na obje replike, a da ih ne izbacite na master ili ga isključite? Vrlo jednostavno, koristeći naredbu "start slave until".
Dakle, imamo master sa bazama podataka testdb1 i testdb2, koje se repliciraju na replike replika-1 i replika-2, respektivno. Konfigurirajmo replikaciju obje baze podataka na repliku-1 bez zaustavljanja mastera.
Zaustavite replikaciju na replici-2 naredbom i zapamtite poziciju mastera:
mysql@replica-2> STOP SLAVE;
mysql@replica-2> PRIKAŽI SLAVE STATUS\G
Master_Log_File: mysql-bin.000015
Exec_Master_Log_Poz: 231

Kreirajmo dump testdb2 baze podataka i nastavimo replikaciju (ovo završava manipulacije sa replikom-2). Vratit ćemo dump na repliku-1.

Situacija na replici-1 je sljedeća: baza podataka testdb1 je na jednoj master poziciji i nastavlja da se replicira, baza podataka testdb2 je vraćena iz dumpa s druge pozicije. Hajde da ih sinhronizujemo.

Zaustavimo replikaciju i zapamtimo poziciju mastera:
mysql@replica-1> STOP SLAVE;
mysql@replica-1> PRIKAŽI SLAVE STATUS\G
Exec_Master_Log_Poz: 501

Uvjerimo se da je u konfiguraciji za repliku-1 ime druge baze podataka naznačeno u odjeljku:
replicate-do-db = testdb2

Ponovo pokrenimo MySQL kako bi promjene u konfiguraciji stupile na snagu. Usput, bilo je moguće jednostavno restartovati MySQL bez zaustavljanja replikacije - iz dnevnika bismo znali na kojoj poziciji u glavnoj replikaciji je zaustavljena.

Sada replicirajmo sa pozicije na kojoj je replika-2 pauzirana na poziciju na kojoj smo upravo pauzirali replikaciju:
mysql@replica-1> PROMIJENI MASTER U MASTER_HOST = "192.168.1.101", MASTER_USER = "replikacija", MASTER_PASSWORD = "lozinka", MASTER_LOG_FILE = "mysql-bin.000015", MASTER_231POS;
mysql@replica-1> pokreni slave dok MASTER_LOG_FILE = "mysql-bin.000016 ", MASTER_LOG_POS = 501;

Replikacija će se završiti čim replika dostigne navedenu poziciju u do sekciji, nakon čega će obje naše baze podataka odgovarati istoj master poziciji (na kojoj smo zaustavili replikaciju na replici-1). Uvjerimo se u ovo:
mysql@replica-1> PRIKAŽI SLAVE STATUS\G
mysql@replica-1> START SLAVE;
Master_Log_File: mysql-bin.000016
Exec_Master_Log_Poz: 501

Dodajmo imena obje baze podataka u konfiguraciju za repliku-1 u odjeljku:
replicate-do-db = testdb1
replicate-do-db = testdb2

Važno: svaka baza podataka mora biti navedena u posebnom redu.
Ponovo pokrenite MySQL i nastavite replikaciju:
mysql@replica-1> PROMJENI MASTER U MASTER_HOST = "192.168.1.101", MASTER_USER = "replikacija", MASTER_PASSWORD = "lozinka", MASTER_LOG_FILE = "mysql-bin.000016", MASTER_LOG_POS;
Nakon što replika-1 sustigne master, sadržaj njihove baze podataka će biti identičan. Možete spojiti bazu podataka u repliku-2 ili na sličan način, ili tako što ćete napraviti kompletan dump replike-1.

Majstor rokada i replika

Možda će biti potrebno prebaciti repliku u glavni način rada, na primjer, u slučaju kvara glavnog uređaja ili prilikom izvođenja tehnički rad. Da biste omogućili takav prekidač, trebate konfigurirati repliku kao master, ili je napraviti pasivni gospodar.

Omogućimo binarno evidentiranje (pored relejnih binlogova) u konfiguraciji u odjeljku:
log-bin = /var/lib/mysql/mysql-bin

I dodajte korisnika za replikaciju:
mysql@master> GRANT replikaciju slave ON 'testdb'.* TO 'replication'@'192.168.1.101′ IDENTIFIKOVANO OD "password";

Pasivni master vrši replikaciju kao obična replika, ali pored toga stvara binarne logije - to jest, možemo započeti replikaciju iz njega. Potvrdimo to naredbom "show master status":
mysql@replica> PRIKAŽI MASTER STATUS\G
Fajl: mysql-bin.000001
Pozicija: 61
Binlog_Do_DB:
Binlog_Ignore_DB:

Sada, da biste prebacili pasivni master u aktivni mod, morate zaustaviti replikaciju na njemu i omogućiti replikaciju na bivšem aktivnom masteru. Kako biste osigurali da se podaci ne izgube u trenutku prebacivanja, aktivni majstor mora biti zaključan za pisanje.
mysql@master> FLUSH TABLE SA ZAKLJUČAVANJEM ČITANJA
mysql@master> SET GLOBAL read_only = ON;
mysql@replica> STOP SLAVE;
mysql@replica> PRIKAŽI MASTER STATUS;
Fajl: mysql-bin.000001
Pozicija: 61
mysql@master> CHANGE MASTER TO MASTER_HOST = "192.168.1.102", MASTER_USER = "replikacija", MASTER_PASSWORD = "password", MASTER_LOG_FILE = "mysql-bin.000001", MASTER_LOG_POS = ;
mysql@master> start slave;
To je to, pa smo promijenili aktivni master. Možete ukloniti blok sa bivšeg mastera.

Zaključak

Naučili smo nešto o tome kako postaviti replikaciju u MySQL i izvesti neke osnovne operacije. Nažalost, sljedeća važna pitanja ostaju izvan okvira ovog članka:

  • eliminacija pojedinačnih tačaka kvara (SPF, Single Points of Failure). Kada koristite jedini MySQL server, njegov neuspjeh je doveo do kvara cijelog sistema. Kada koristite više servera, kvar bilo kog od njih će rezultirati kvarom sistema osim ako se za to posebno ne pobrinemo. Moramo osigurati rješavanje situacije sa kvarom mastera i replike. Jedan od postojećih alata je MMM, međutim, on zahtijeva modifikaciju pomoću datoteke.
  • balansiranje opterećenja. Kada koristimo više replika, željeli bismo koristiti transparentan mehanizam za balansiranje, posebno ako je izvedba replika neujednačena. Pod Linuxom je moguće koristiti standardno rješenje - LVS.
  • mijenja logiku aplikacije. U idealnoj situaciji, zahtjeve za čitanje podataka treba poslati replikama, a zahtjeve za promjenu podataka poslati masteru. Međutim, zbog mogućeg kašnjenja replika, takva shema je često neefikasna i potrebno je identificirati takve zahtjeve za čitanje koje još treba izvršiti na masteru.
Nadam se da ću ove probleme pokriti u budućim člancima.
Hvala vam na pažnji!

Tagovi:

  • mysql
  • replikacija
Dodaj oznake

Nedavno su me zamolili da pričam o tome replikacija u MySQL. Odlučio sam da bi ova tema mogla biti korisna mnogima, pa ću u ovom članku govoriti o tome šta je replikacija u MySQL-u, kada je potrebna i kako je konfigurisati.

Glavni zadatak replikacije je kombinuju snagu nekoliko servera. Recimo da vaša web stranica ima namjenski server, ali s vremenom postaje vrlo posjećena i više ne može izdržati opterećenje. Kao rezultat toga, server počinje da usporava i redovno pada. Najlakši način je kupiti moćniji server, a to je ono što većina ljudi radi. Ali prije ili kasnije dođe vrijeme kada trošak povećanja cijene servera ne odgovara povećanju njegovih performansi, pa je isplativije kupiti 2 različiti serveri za manje novca.

Kao rezultat, vaša baza podataka će biti na dva servera odjednom. Kada jedan glavni server (tzv. glavni server) više ne može da se nosi, prelazi na rezervni.

Sve Zahtjevi za ažuriranje baze podataka uvijek idu glavnom serveru. Nakon ažuriranja glavnog servera, on postavlja informacije o tome zaseban fajl, odakle slave serveri dobijaju sve informacije. Ali operacije uzorkovanja, kojih je obično većina, a one su najsporije, već se mogu prenijeti na slave servere, jer su podaci isti u oba.

Hajde sada da shvatimo kako konfigurirati replikaciju u MySQL:

  1. Instalirajte najviše najnovije verzije MySQL-a na sve servere.
  2. Kreirajte korisnika s privilegijom na glavnom serveru REPLACING SLAVE. Za adresu sa koje se može povezati, navedite " Sve".
  3. Zaustavite sve servere.
  4. U podešavanjima MySQL(u fajlu my.cnf) U poglavlju dodajte sljedeće redove: log-bin
    server-id=1 Imajte na umu da server-id mora biti različit na svim serverima. U stvari, to je ono što razlikuje jedan server od drugog.
  5. Na slave serverima, dodajte u postavke MySQL sljedeće redove: master-host=master_host_name
    master-user=login kreiranog_usera
    master-password=lozinka kreiranog_korisnika
    master-port=port_for_connecting_to_the_master_server
    server-id=id_of_this_slave_server
  6. Pomerite sve baze sa glavnog servera na slave.
  7. Trči glavni server, zatim svi robovi.