Maria DB Galera – I deo

Prava sigurnost podataka i visoka dostupnost postiže se isključivo replikacijom. Spajanje više računara/virtueliih instanci u klaster povećava sigurnost i dostupnost vaših podataka. Ukoliko koristite MySQL/MariaDB, Galera je pravi alat za postizanje visoke dostupnosti (en. high availability).

MariaDB i Galera

MariaDB je sistem za upravljanje bazama podataka. MariaDB je sistem otvorenog koda, licenciran GNU javnom licencom. MariaDB i MySQL su dva binarno kompatibilna sistema, odnosno oba sistema mogu izvršavati isti izvršni kod. Oba sistema koriste iste nazive fajlova, iste putanje, protokole, interfejse, biblioteke za povezivanje sa različitim programskim jezicima, itd. Stoga, prelazak sa jednog sistema na drugi ne iziskuje puno vremena, dovoljno je samo instalirati servis MariaDB i deinstalirati servis MySQL. Razvoj MariaDB baze je započet 2009. godine. MariaDB ima nekoliko integrisanih podsistema koji podržavaju rad sa bazom podataka. Podsistemi su odgovorni za izvršavanje upita, tj. oni preuzimaju upit od korisnika, izvršavaju isti nad bazom i vraćaju dobijeni rezultat. Čitanje i pisanje podataka se izvršava tako što se te naredbe delegiraju podsistemima. Pored čitanja i pisanja podataka, podsistemi mogu pružiti i podršku za transakcije, keširanje podataka i indeksa i referencijalni integritet. Od verzije 10.1 uvedena je integracija sa rešenjem Galera. Galera je alat koji omogućava rad sa klasterima i ono što ga razlikuje od servera MySQL je to što on omogućava master-master replikaciju, za razliku od MySQL-a koji je omogućavao samo master-slave replikaciju. MariaDB Galera je dostupna samo za Linux operativne sisteme i podržava XtraDB/InnoDB tipove sistema za skladištenje. XtraDB i InnoDB su podrazumevani podsistemi.

  • XtraDB podsistem je razvijen od strane kompanije Percona, prvenstveno za MySQL i MariaDB, ali i za druge platforme. XtraDB podsistem je bio podrazumevani podsistem za MariaDB sve do verzije 10.1. Nakon toga se prešlo na InnoDB podistem, koji je imao bolje performanse u odnosu na prethodni podsistem i rešena su određena neželjena ponašanja koja je ispoljavao XtraDB podsistem.
  • InnoDB je sistem koji se pojavio od verzije 10.1. Ovaj podsistem podržava transakcije, čuvanje međustanja prilikom izvršavanja transakcije, XA transakcije, odnosno transakcije kod kojih je uključeno više resursa koji ne moraju nužno biti deo baze podataka, kao i strane ključeve. Transakcije se vrše korišćenjem kompleksnog sistema zaključavanja i logova za poništavanje. Zaključavanje se vrši na nivou reda ili nekoliko redova koji su identifikovani preko indeksa, a logove za poništavanje koristimo ukoliko imamo potrebu za poništavanjem transakcija.

Neke od najvažnijih karakteristika klastera su:

  • Sinhrona replikacija,
  • Pisanje i čitanje sa bilo kog čvora klastera,
  • Automatska kontrola pristupa (pali čvorovi se odvajaju od klastera),
  • Automatsko pridruživanje čvorova,
  • Paralelna replikacija na nivou reda i
  • Direktna konekcija.

Gore navedene karakteristike donose i nekoliko bitnih poboljšanja, uključujući i sledeće:

  • Nema zastoja
  • Nema izgubljenih transakcija
  • Skalabilnost čitanja i pisanja
  • Mala korisnička latencija

Iz svih ovih karakteristika su oćigledne najveće prednosti ovog pristupa. U situacijama poput gubitka transakcija i zastoja, koji su prilikom replikacije normalni, svi serveri imaju ažurirane podatke. Sledeći dijagram pokazuje proces replikacije klasične MySQL baze podataka:

Binarni događaj upisuje se u binarni dnevniik (Binary logs) glavne baze podataka. Pomoćna baza podataka (Slave) preko Slave IO thread-a povlači događaje iz matičnog binarnog dnevnika i kopira ih u svoj binarni dnevnik. Zbog asinhrone prirode replikacije, pomoćnoj bazi podataka nije zagarantovano da ima podatake kada glavna baza izvrši promene.

Za razliku od MySQL replikacije, koncept Galera replikacije je nešto drugačiji. Ilustrovano proces replikacije možete pogledati na sledećem primeru:

Proces upisivanja zahteva čekas potvrdu na svakom Galera čvoru i ukoliko je ta potvrda uspešna, sve niti će se asinhrono primenjivati. Ovo znači da će pomoćna baza podataka na kraju biti dosledna, nakon dogovora svih čvorova koji učestvuju u ukupnom globalnom redosledu. Međutim stvarno upisivanje i primena novih dešavanja događa se nezavisno, asinhrono na svakom čvoru, uz garanciju da će se promena širiti na svim čvorovima.

Instalacija

Od verzije 10.1, paketi MariaDB Server i MariaDB Galera Server su kombinovani, a paket Galera i sve ono što ide uz njega, automatski se instalira prilikom instaliranja MariaDB. Trenutna verzija MariaDB Galera klastera podržava samo InnoDB/XtraDB podsistem. Kod MariaDB Galera klastera više servera baze podataka je međusobno povezano i sinhronizovano. Pokazaćemo postupak instalacije MariaDB Galera klastera 10.1 sa 3 čvora na Linux Ubuntu 16.04 serveru. Da bismo simulirali 3 Linux mašine, upotrebićemo VirtualBox i na njemu kreirati tri Linux virtuelne mašine.

Slika 1: Linux virtuelne mašine
Slika 1: Linux virtuelne mašine

Za svaku virtuelnu mašinu, potrebno je postaviti za network „Internal Network“, kako bi virtuelne mašine mogle međusobno da komuniciraju. Ovo možemo da uradimo na sledeći način:

  • Desni klik na virtuelnu mašinu
  • Klik na tab Network
  • I za „Attached to“ izabrati „Internal Network“
Slika 2: Podešavanje polja „Network“

Ovo je potrebno uraditi i za preostale dve virtuelne mašine. Pored toga, testiraćemo i postupak repliciranja baze podataka među čvorovima. Pre samog početka instalacije, potrebno je ažurirati sve čvorove. Ovo možete uraditi, pokretanjem sledećih komandi:

sudo apt-get update -y
sudo apt-get upgrade -y

Nakon toga, pokrenite opet sve čvorove pomoću komande sudo reboot da biste primenili ove promene. Zatim se prijavite kao sudo korisnik i nastavite da pratite dalje uputstvo. Dodajte MariaDB repo ključ, pokretanjem sledeće komande:

sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8

Nakon toga, dodajte repozitorijum:

sudo add-apt-repository 'deb [arch=amd64,i386,ppc64el] http://ftp.utexas.edu/mariadb/repo/10.1/ubuntu xenial main'

i ažurirajte keš:

sudo apt-get update -y

Nakon što ste ažurirali repozitorijum, možete nesmetano instalirati MariaDB pokretanjem sledeće komande:

sudo apt-get install mariadb-server rsync -y

Gornja komanda će instalirati MariaDB sa Galerom. Galera je takođe instalirana, ali je potrebno dodatno iskonfigurisati. MariaDB instalacija podrazumevano nije osigurana. Ukolko želimo da je osiguramo, to možemo da uradimo pokretanjem sledeće skripte:

sudo mysql_secure_installation

Nakon pokretanja ove skripte, dobićemo mogućnost da postavimo root lozinku, uklonimo anonimne korisnike, zabranimo daljinsko prijavljivanje i slično:

Enter current password for root (enter for none):
Change the root password? [Y/n] n
Remove anonymous users? [Y/n] Y
Disallow root login remotely? [Y/n] Y
Remove test database and access to it? [Y/n] Y
Reload privilege tables now? [Y/n] Y

Podešavanje čvorova

Node1

Potrebno je da odemo na prvi čvor i da kreiramo konfiguracionu datoteku za Galera. Podrazumevano, MariaDB čita konfiguraciju iz /etc/mysql/conf.d/ direktorijuma. Pokrenite sledeću komandu:

sudo nano /etc/mysql/conf.d/galera.cnf

A nakon toga, dodajte sledeće:

[mysqld]
binlog_format=ROW
default-storage-engine=innodb
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0
# Galera Provider Configuration
wsrep_on=ON
wsrep_provider=/usr/lib/galera/libgalera_smm.so
# Galera Cluster Configuration
wsrep_cluster_name="galera_cluster"
wsrep_cluster_address="gcomm://10.0.2.15,10.0.2.16,10.0.2.17"

# Galera Synchronization Configuration
wsrep_sst_method=rsync

# Galera Node Configuration
wsrep_node_address="10.0.2.15"
wsrep_node_name="Node1"

Kada završite, sačuvajte konfiguraciju.

10.0.2.15 je adresa za Node1 u ovom našem slučaju. Adresu možete proveriti pokretanjem komande ifconfig. Isto je potrebno uraditi za preostala dva čvora.

Node2

sudo nano /etc/mysql/conf.d/galera.cnf

[mysqld]
binlog_format=ROW
default-storage-engine=innodb
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0
# Galera Provider Configuration
wsrep_on=ON
wsrep_provider=/usr/lib/galera/libgalera_smm.so
# Galera Cluster Configuration
wsrep_cluster_name="galera_cluster"
wsrep_cluster_address="gcomm://10.0.2.15,10.0.2.16,10.0.2.17”

# Galera Synchronization Configuration
wsrep_sst_method=rsync

# Galera Node Configuration
wsrep_node_address="10.0.2.16"
wsrep_node_name="Node2"

10.0.2.16 je IP adresa za Node2 u ovom našem slučaju. Adresu možete proveriti pokretanjem ifconfig komande u terminalu.

Node3

sudo nano /etc/mysql/conf.d/galera.cnf

[mysqld]
binlog_format=ROW
default-storage-engine=innodb
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0
# Galera Provider Configuration
wsrep_on=ON
wsrep_provider=/usr/lib/galera/libgalera_smm.so
# Galera Cluster Configuration
wsrep_cluster_name="galera_cluster"
wsrep_cluster_address="gcomm:// 10.0.2.15,10.0.2.16,10.0.2.17"

# Galera Synchronization Configuration
wsrep_sst_method=rsync

# Galera Node Configuration
wsrep_node_address="10.0.2.17"
wsrep_node_name="Node3"

10.0.2.17 je IP adresa za Node3 u ovom našem slučaju. Adresu možete proveriti pokretanjem ifconfig komande u terminalu.

Konfiguracija firewall-a

Galera Cluster koristi port 3306 za MySQL, port 4444 za State Snapshot Transfer, 4567 za Galera Cluster replikacioni saobraćaj i 4568 za Incremental State Transfer. Zato ćemo morati da dopustimo sve navedene portove. Ovo možemo da uradimo pokretanjem sledeće naredbe na svim čvorovima:

sudo ufw enable

sudo ufw allow 3306/tcp
sudo ufw allow 4444/tcp
sudo ufw allow 4567/tcp
sudo ufw allow 4568/tcp
sudo ufw allow 4567/udp

Da bismo bili sigurni da sve funkconiše, možete da pokrenete sledeću komandu:

sudo ufw status

Pokretanje MariaDB Galera klastera

Nakon konfigurisanja svih čvorova, potrebno je na Node1 pokrenuti Galera klaster. Pre nego što pokrenemo Galera, potrebno je da budemo sigurni da su MariaDB servisi pauzirani na svim čvorovima. Pokrenuti sledeću naredbu na svim čvorovima:

sudo systemctl stop mysql

Sada možete da pokrenete Galera klaster na Node1, pokretanjem sledeće komande:

sudo galera_new_cluster

Da bismo proverili da li se klaster pokrenuo, to činimo pomoću komande:

mysql -u root -p -e "show status like 'wsrep_cluster_size'"

Ako je sve u redu, trebalo bi dobiti sledeći izgled.

| Variable_name      | Value |
+--------------------+-------+
| wsrep_cluster_size | 1     |

Isto je potrebno ponoviti i za preostale čvorove.

Node2:

sudo systemctl start mysql

sudo systemctl status mysql

mysql -u root -p -e "show status like 'wsrep_cluster_size'"

Ukoliko je sve u redu, trebalo bi da dobijete vrednost broja čvorova klastera.

+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| wsrep_cluster_size | 2     |
+--------------------+-------+

Node 3

sudo systemctl start mysql

mysql -u root -p -e "show status like 'wsrep_cluster_size'"

+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| wsrep_cluster_size | 3     |
+--------------------+-------+

Klasteri su sada aktivni i mogu međusobno da komuniciraju.

Replikacije baze podataka

Kada su čvorovi povezani, moguće je kreirati bazu podataka i omogućiti replikaciju. Prijavite se pomoću sledeće komande:

mysql -u root -p

Unesite root password i kreirajte testnu bazu podataka:

MariaDB [(none)]> create database pmf;

MariaDB [(none)]> show databases;

| Database           |
+--------------------+
| pmf                |
+--------------------+

Nakon toga kreiraćemo tabelu student za navedenu bazu i dodati jedan podatak.

mysql -u root -p
MariaDB [(none)]> show databases;


MariaDB [(none)]> create table pmf.student(id INT NOT NULL AUTO_INCREMENT, indeks varchar(50), ime varchar(50), ocena INT, primary key(id));
MariaDB [(none)]> INSERT INTO pmf.student(indeks, ime, ocena) values ('50/2015', 'Marko Markovic', 10);

Kako bismo proverili da li replikacija radi, idite do Node2 ili Node3 i sledećom komankom proverite da li je podatak dodat i vidljiv i na ostalim nodovima:

MariaDB [(none)]> select * from pmf.student;

Ukoliko je sve u redu, vaša tabela bi trebalo da izgleda ovako:

+----+---------+----------------+-------+
| id | indeks  | ime            | ocena |
+----+---------+----------------+-------+
|  1 | 50/2015 | Marko Markovic |     10 |
+----+---------+----------------+-------+

Na ovaj način ste instalirali i konfigurisali MariaDb Galera klaster na Ubuntu 16.04 serveru. U sledećem nastavku govorićemo kratko o balansiranju opterećenja na Galera klasteru.

Korisni linkovi

https://mariadb.com/kb/en/library/galera-cluster/ https://severalnines.com/database-blog/ha-mysql-and-mariadb-comparing-master-master-replication-galera-cluster https://www.howtoforge.com/tutorial/how-to-install-and-configure-galera-cluster-on-ubuntu-1604/ https://www.opensource-osijek.org/2014/06/30/mariadb-galera-cluster-solution/

Autor: Jovana Tomovic

Studentkinja završne godine Informatike na Prirodno-matematičkom fakultetu u Kragujevcu. Tokom studija je bila polaznica radionica i praksi nekoliko IT firmi. Zaposlena u firmi Inovatec.

Jovana Tomovic

Studentkinja završne godine Informatike na Prirodno-matematičkom fakultetu u Kragujevcu. Tokom studija je bila polaznica radionica i praksi nekoliko IT firmi. Zaposlena u firmi Inovatec.