Galera

From EIK wiki

Aktuaalsus

Järgnev juhend on aktuaalne 13. jaanuari seisuga 2015. Kasutatakse CentOS 6 64-bitist versiooni.

Sissejuhatus

Gert vaikre galera.png

Galera Cluster on sünkroonne multi-master andmebaasiklaster MariaDB jaoks. [1]

Eelised:

  • Sünkroonne reapõhine replikeerimine
  • Active-active multi-master topoloogia (võib kirjutada ja lugeda ükskõik milliselt klastri liikmelt)
  • Automaatne klastriga liitumine
  • Hea ülevaade klastri liikmete üle
  • Kliendipool on täpselt samasugune MySQLiga
  • Kiirus
  • Töökindlus

Kuna Galera klastris on kõik aktiivsed (masterid), on väga lihtne teostada koormuse jaotamist ja/või implementeerida High Availability.

Sünkroonne: garanteerib, et kõik muutused on replikeeritud kõikide klastri liikmete vahel

Asünkroonne: ei kontrolli, kas tegelikult ka muutused teostusid[2]

Seadistamine

Minimaalselt on vaja kolme liiget, kuna kahe liikme puhul võib tekkida split brain. Kolme liikme puhul saab toimuda nö hääletus, kus olemasolevad liikmed saavad omavahel klastri seisu kokku leppida. [3]

Märkus: Split brain - näiteks node01 ei tea, kas temal on võrguprobleemid või on node02'l võrguprobleemid [4]

Kasutame järgmiseid IP'sid:

IP masin
10.0.0.101 node01
10.0.0.102 node02
10.0.0.103 node03

Lisame vajalikud repod:

MariaDB:

Loome uue faili

vim /etc/yum.repos.d/MariaDB.repo

Ning lisame sinna

/etc/yum.repos.d/MariaDB.repo
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.0/centos6-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

Percona:

Percona repo lisamine on lihtne, see on paigaldatav eraldi paketina.

yum install http://www.percona.com/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rpm

Paigaldame vajalikud paketid:

yum install MariaDB-Galera-server MariaDB-client galera percona-xtrabackup nc

Käivitame MariaDB:

service mysql start

Käivitame MariaDB esmase konfiguratsiooniskripti:

Tegemist on lihtsate jah/ei stiilis küsimustega, millele vastamisega ei tohiks probleeme tulla.

mysql_secure_installation

Logime andmebaasi sisse:

mysql -uroot -p

Seejärel loome vajalikud kasutajad andmebaasi, mida Galeral vaja läheb:

use mysql;
update user set host='%' where user='root' and host='localhost';
create user xtrabackup@'%' identified by 'salajane-parool';
grant reload, lock tables, replication client on *.* to xtrabackup@'%';
flush privileges;

Peatame MariaDB, et saaks alustada seadistamist:

service mysql stop

Konfigureerimine klastri esimese liikme (node01):

Avame faili

vim /etc/my.cnf.d/server.conf

Ning asendame sisu järgnevaga:

/etc/my.cnf.d/server.conf
[mysqld]
port=3306
datadir=/var/lib/mysql
query_cache_size=0
binlog_format=ROW
default_storage_engine=innodb
innodb_autoinc_lock_mode=2
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
wsrep_provider_options="gcache.size=1G"
wsrep_cluster_address=gcomm://10.0.0.101,10.0.0.102,10.0.0.103
wsrep_cluster_name='galera'
wsrep_node_address='10.0.0.101'
wsrep_node_name='node01'
wsrep_sst_method=xtrabackup-v2
wsrep_sst_auth=xtrabackup:salajane-parool
Märkus: Tegemist on väga basic konfiguratsiooniga, kindlasti peaks seda parema andmebaasi töö jaoks optimeerima (erinevate cache'ide, timeout'ide jm sättimine). Võid vaadata ka järgmist linki: SeveralNines Galera Configurator

Käivitame Galera klastri:

service mysql bootstrap

Seejärel peaks sarnaselt ära konfigureerima teise ja kolmanda liikme.

Ainsad muudatused tuleks teha /etc/my.cnf.d/server.conf failis, kus tuleks ära muuta wsrep_node_address ning wsrep_node_name. Ülejäänud sammud/konfiguratsioon jäävad samaks.

Seejärel tuleks node02 ja node03 lisada klastrisse, mis on lihtsalt

service mysql start

Soovi korral võib MariaDB lisada ka automaatselt käivitatavaks:

chkconfig mysql on

Load balancing

Antud näite puhul kasutame masinaid endaid koormuse jaoturitena. Seetõttu on järgnev näide natukene veider, sest tekib selline olukord, kus näiteks IP järgi pöördutakse node01 poole, aga tegelikult suunatakse node02 andmebaasi poole. Reaalses elus oleks selle jaoks eraldi masinad, mis seisavad eraldi andmebaasiserverite ees.

Koormuse jaotamise jaoks kasutame programmi nimega HAProxy.

Seadistamine

Paigaldame HAProxy:

yum install haproxy

HAProxy hakkab meil istuma MariaDB asemel, port 3306 peal. Seetõttu peame sättima kõikides klastri liikmetes, et MariaDB kuulaks teise pordi peal (näiteks 3307).

Selle jaoks avame /etc/my.cnf.d/server.conf faili ning muudame pordi ära:

/etc/my.cnf.d/server.conf
...
port=3307
...

HAProxy konfiguratsioonifail asub /etc/haproxy kaustas. Vana konfiguratsiooni võib ära kustutada ning täielikult asendada järgnevaga.

Avame faili /etc/haproxy/haproxy.cfg ning lisame sinna järgneva:

/etc/haproxy/haproxy.cfg
global
log 127.0.0.1 local0 notice
user haproxy
group haproxy

defaults
log global
retries 2
timeout connect 1000
timeout server 5000
timeout client 5000

listen mariadb-cluster
bind 0.0.0.0:3306
mode tcp
option mysql-check user haproxy
balance roundrobin
server node01 10.0.0.101:3307 check
server node02 10.0.0.102:3307 check
server node03 10.0.0.103:3307 check

Konfiguratsioon peaks olema igas klastri liikmes identne. Siinkohal kasutame roundrobin algoritmi, mis lihtsalt vaheldumisi käib kõik liikmed läbi. [5]

Lisaks peame ka andmebaasi tegema HAProxy jaoks kasutajad. Mingeid õigusi anda pole vaja, HAProxy kasutab seda kasutajat lihtsalt kontrollimiseks.

Logime andmebaasi sisse (vahet ei ole, millises masinas):

mysql -uroot -p

Loome kasutajad:

create user haproxy@10.0.0.101;
create user haproxy@10.0.0.102;
create user haproxy@10.0.0.103;

Käivitame teenuse (kõikides masinates):

service haproxy start

Seadistame, et teenus käivitataks automaatselt:

chkconfig haproxy on

High Availability

Võtame kasutusele veel ühe IP.

IP masin
10.0.0.101 node01
10.0.0.102 node02
10.0.0.103 node03
10.0.0.100 floating IP

See saab olema kõigi klastri liikmete ühine IP. Seadistame nii, et vaikimisi on see node01 küljes ning kui see maha peaks minema, läheb see node02 külge (ja seejärel node03).

Idee poolest peaks niimoodi tekkima High Availability klaster, mis teoorias peaks olema nullilähedase maasoleku ajaga (ainult teoorias!). Sellise seadistuse puhul võib tekkida aga väga palju ootamatuid olukordi ning võibolla ei ole see ka kõige parem mõte. [6][7]

Seadistamine

Paigaldame programmi keepalived:

yum install keepalived

Konfiguratsioonifail asub /etc/keepalived kaustas. Vana konfiguratsiooni võib ära kustutada ning täielikult asendada järgnevaga.

Avame faili /etc/keepalived/keepalived.conf ning lisame sinna järgnevad read:

/etc/keepalived/keepalived.conf
global_defs {
        lvs_id MDB1
}

vrrp_sync_group SyncGroup01 {
        group {
                FloatIP1
        }
}

vrrp_script check_haproxy {
        script "killall -0 haproxy"
        interval 2
        weight 2
}

vrrp_instance FloatIP1 {
        state MASTER
        interface eth0
        virtual_router_id 10
        priority 103
        advert_int 1
        virtual_ipaddress {
                10.0.0.100
        }
        track_script {
                check_haproxy
        }
}

Väljad mida sättida:

  • state - seadistame, et node01 on MASTER ning node02 ja node03 SLAVE.
  • interface - võrguliides, kuhu külge floating IP haagitakse. Enamasti on see eth0.
  • priority - kõrgem priority võidab. Seadistame, et node01 priority on 103, node02 102 ning node03 101.

Käivitame teenuse:

service keepalived start

Seadistame, et teenus käivitataks automaatselt:

chkconfig keepalived on

Kokkuvõte

MariaDB Galera klaster on üks töökindlamaid ja paindlikumaid andmebaasiklastreid. Sel on palju eeliseid tavapärase MySQL Master-Slave klastri ees; neist kõige suurem see, et Galera klastris on kõik liikmed aktiivsed (masterid). Seetõttu on väga lihtsasti teostatav koormuse jaotamine (load balancing) ning soovi korral ka High Availability. Lisaks, nagu siit artiklist ka näha, on kogu klastri üles seadmine ja konfigureerimine väga lihtne. Raske on aga edaspidine administreerimine ning tekkida võivate ootamatute olukordade lahendamine.

Kasutatud allikad

  1. What is MariaDB Galera Cluster?
  2. About Galera Replication
  3. Percona XtraDB Cluster: Failure Scenarios with only 2 nodes
  4. Avoiding a Split Brain in database mirroring
  5. HAProxy Configuration Manual
  6. high availability (HA)
  7. Failover is Evil

Kasulikud lingid

Autor

Gert Vaikre A31