High Availability Mysql: Galera Cluster ja haproxy

Kun sovelluspalvelin on vikasietoinen ja vakaa, on aika tuunailla tietokantakerrosta. Vikasietoisessa järjestelmässä olisi suotavaa että myös tietokannasta on useampi kopio, jotta tietoa ja tapahtumia ei katoa vaikka tapahtuisi normimaanantai.

Sain vinkin Galera klusterituotteesta jolla Mysql kannat saa replikoimaan nätisti. Sen eteen tarvitaan joku kuormantasaus, ja testailemani haproxy vaikutti enemmän kuin riittävältä siihen. Lähtökohtana tulisi olla vähintään kolmen noden rinki, jotta enemmistö voi ristiriitatilanteissa äänestää nurin vähemmistön (2 vs 1 ei ole ehkä reilua, mutta se antaa vähän enemmän takeita siitä mikä on validein tieto – jos kaikki ovat eri mieltä ollaankin pulassa). Rakentelin kuitenkin enemmän proof-of-concept ideana parista nodesta klusteroidun, vikasietoisen mysql härvelin johon kytkeydytään Glassfish connection poolin kautta. Ja hyvältä vaikuttaa!

Huom! Kahden noden mallissa voi odotaa tulevan enemmän virhetilanteita, jotka voivat vaatia mysql boottausta ja replikoinnin resetointia. Hyödylliseksi on osoittautunut komento: sudo rm -r -f /var/lib/mysql/grastate.dat

Tässä siis muistiinpanoja ja rakennusohjeita. Huom! Joku muu voi tuunatata tämän eri tavalla ja ilmiselvästi tuotantokäyttöön tarvitaan toinen kierros koventamista, mutta näillä ohjeilla pitäisi päästä perille jos haluat maistella vikasietoisuutta itsekin. MariaDB on ehkä jopa paremmin tuettu nykyisellään jos haluat hakea MySQL:lle vaihtoehtoa.

Mysql + Galera replikoiva klusteri

Asennukset ensin. Tarkista, että olet ajan tasalla, ja asenna sitten MySQL + wsrep patchi ja Galera:

sudo apt-get update

sudo apt-get dist-upgrade

sudo apt-get install libaio1 libdbi-perl libdbd-mysql-perl mysql-client rsync

sudo wget http://ftp.de.debian.org/debian/pool/main/o/openssl/libssl0.9.8_0.9.8o-4squeeze14_amd64.deb && sudo dpkg -i libssl0.9.8_0.9.8o-4squeeze14_amd64.deb

sudo wget https://launchpad.net/codership-mysql/5.5/5.5.34-25.9/+download/mysql-server-wsrep-5.5.34-25.9-amd64.deb && sudo dpkg -i mysql-server-wsrep-5.5.34-25.9-amd64.deb

sudo wget https://launchpad.net/galera/3.x/25.3.5/+download/galera-25.3.5-amd64.deb && sudo dpkg -i galera-25.3.5-amd64.deb

Seuraavaksi tehdään mysql:ään vähän tunnuksia:

sudo /etc/init.d/mysql start

mysql -u root -p

#root on ylijumala ja sillä on salasana
GRANT ALL ON *.* TO root@'%' IDENTIFIED BY 'munsalainensana';

#galera haluaa myös päästä kiinni kantoihin
GRANT ALL ON *.* to sst@'%' IDENTIFIED BY 'sstpasswd';

# ja aikanaan myös haproxy haluaa tietää ovatko kannat pystyssä
INSERT INTO mysql.user (Host,User) VALUES ('%','haproxy');

flush privileges;

Hyvä, pistetään mysql automaattikäynnistymään:

sudo  update-rc.d mysql defaults

Editoidaan mysql wsrep.cnf tiedostoa tähän tapaan:

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

Make these changes:

# Full path to wsrep provider library or 'none'
wsrep_provider=/usr/lib/galera/libgalera_smm.so

# Group communication system handle
wsrep_cluster_address="gcomm://"

# State Snapshot Transfer method
wsrep_sst_method=rsync

# SST authentication string. This will be used to send SST to joining nodes.
# Depends on SST method. For mysqldump method it is root:
wsrep_sst_auth=sst:sstpasswd

Sitten vain mysql käynnistäen uudelleen

sudo /etc/init.d/mysql restart

Hyvä, nyt olisi yksi node pystyssä. Kakkosnodelle tehdään samat operaatiot muuten, mutta editoitaessa tämä yksi rivi muuttuu vähän: siihen tulee ykkösnoden nimi tai ip-osoite:

# Group communication system handle
wsrep_cluster_address="gcomm://debian1,debian2"

Mutta muuten käy läpi samat temput. Kun olet valmis, jos ei mysql käynnistyksessä ole ollut ongelmia, buuttaa ensin node1, sitten node2 pienellä viiveellä.

Ei ongelmia? Hyvä, kirjaudu mysql:ään haluamallasi tunnuksella ja salasanalla, ja aja seuraava komento:

show status like '%wsrep%';

Kiinnitä huomioita erityisesti kohtiin wsrep_ready (pitäisi olla ON), ja wsrep_cluster_size (pitäisi olla 2).

Jos pääsit tähän asti, onnittelut. Jos et, vedä syvään henkeä, ja aloita uudet toistot.

Voit todeta klusterin toimivuuden esim. kirjautumalla toiseen nodeista ja lisäämällä johonkin tauluun rivejä. Niiden pitäisi ilmestyä pikimmiten myös toiseen kantaan.

Haproxy asentaminen Galeran päälle

Hauskasti haproxy ei löydykään oletuksena debianin wheezystä, joten lisätään listalle uusi site. Editoi /etc/apt/sources.list tiedostoa, lisää sinne tämä:

deb http://ftp.debian.org/debian/ wheezy-backports main

Aja seuraavat komennot asentaaksesi haproxyn:

sudo apt-get update

sudo apt-get install haproxy -y

sudo service haproxy start

Pistetään se myös automaattikäynnistykseen:

sudo sed -i s/0/1/ /etc/default/haproxy

Editoi myös /etc/init.d/haproxy tiedostoa, aseta sinne ENABLED arvoon 1 (oletuksena 0).

Seuraavaksi varmuuskopioidaan haproxy.config, ja editoidaan sitä vähän:

mv /etc/haproxy/haproxy.cfg{,.original}
sudo nano /etc/haproxy/haproxy.cfg

Kopioi/editoi sinne jotain tämäntapaista:

global
  log 127.0.0.1   local0
  log 127.0.0.1   local1 notice
  #log loghost    local0 info
  maxconn 1024
  #chroot /usr/share/haproxy
  user haproxy
  group haproxy
  daemon
  #debug
  #quiet

defaults
  log     global
  mode    http
  option  tcplog
  option  dontlognull
  retries 3
  option redispatch
  maxconn 1024
  timeout connect 5000ms
  timeout client 750000ms
  timeout server 750000ms

listen galera_cluster 0.0.0.0:3307
  mode tcp
  balance roundrobin
  option tcpka
  option mysql-check user haproxy
  server debian1 192.168.0.100:3306 check weight 1 maxconn 20
  server debian2 192.168.0.101:3306 check weight 1 maxconn 20
 
listen stats 0.0.0.0:9090
  mode http
  stats enable
  stats uri /
  stats realm Strictly\ Private
  stats auth myusername:mypassword

 

Aikalailla oletusasetuksilla mennään tässä. Mutta muutama mielenkiintoinen säätö tässä tapahtui:

– timeout client ja timeout server on nostettu 5 sekunnista 75 sekuntiin – koska sovelluspalvelinten connection poolit roikuttavat yhteyksiä hyvinkin pitkään auki, 60 sekuntia on tyypillinen aika – näin yhteydet pysyvät valideina

– galera cluster pyörii tässä samassa koneessa, portissa 3307. Mysql oletusportti on 3306. Tähän voisi varata eri koneen jossa olisi haproxy, mutta ajattelin itse replikoida senkin joka nodeen, eli haproxy pyörii joka koneessa portissa 3307, sieltä saa vikasietoista ja tasattua palvelua.

– Tuossa ip osoitteet 192.168.0.100 ja 101 edustavat mysql servereitä joille kuormaa tasataan, listaan tosiaan lisää mieluusti ainakin yksi node lisää. Olen asettanut maksimiyhteysmäärän 20 kappaleeseen – tämäkin voisi olla hyvä synkata connection poolin kanssa. weight eli painotus on joka nodella tässä sama  – eli kuorma jaetaan tasaisesti.

– lopuksi on stats serveri, portissa 9090 (jonka tulisi olla vapaa) – se kertoo mukavasti selaimella tietoa haproxy toiminnasta ja nodejen tilasta. Keksi sille haluamasi osoite, portti, tunnus ja salasana, ja sitten vain testaamaan.

No niin, nyt sitten proxy käyntiin:

sudo service haproxy restart

Ja tämä tietysti joka nodessa, asennukset, säädöt ja käynnistykset.

Voit testata toimintaa esim:

telnet localhost 3307

Tai mysql clientille:

mysql -h 127.0.0.1 --port 3307 -u haproxy_root -p -e "SHOW DATABASES"

Ja voit myös ruuvata selaimesi osoitteeseen:

http://127.0.0.1:9090/stats

No niin, jos kaikki pelaa taas, voit seuraavaksi muuttaa glassfish serverisi connection poolin osoittamaan joko virtuaali-ip:hen, tai yksittäiseen haproxy nodeen, porttiin 3307 portin 3306 sijasta.

Glassfish vikasietoinen connection pool

On hyvä samalla tehdä vähän säätöjä; jos haluat connection poolin aidosti toipuvan proxyjen ja kantojen kaatumisista, hyvä tehdä seuraavaa:

Avaa mysql admin console, mene kohtaan resources-jdbc-connection pools – ja avaa connection pool jolla haluat klusteria käytellä.

Klikkaa ensin Ping ruutuun rasti, ja valitse Save.

Mene seuraavaksi Advanced välilehdelle ja tee tällaisia säätöjä:

  1. Validate At Most Once: 60 seconds
  2. Creation Retry Attempts: 3
  3. Retry Interval: 10 (taitaa oletuksena jo ollakin)
  4. Connection Validation: (Tick) Required
  5. Validation Method: custom-validation
    1. validation class name: org.glassfish.api.jdbc.validation.MySQLConnectionValidation (select from list)

Ja mitä muita säätöjä vain haluatkaan. Sitten vain Save ja mahdollisesti restart. Ja kokeilemaan.

Ja mikä hienointa – itse softan ei tarvitse mitenkään olla tietoinen vikasietoisuudesta tai kuormantasauksesta 😉

 

[edit]: Kahdella nodella tulee sitten tosiaan replikointipulmia aika ajoin, joissa korjaus on:

sudo rm /var/lib/mysql/grastate.dat
sudo service mysql restart

Joten vaivan välttämiseksi kannattaa pistää suosista kolme nodea pystyyn. Voisi olla metkaa tehdä kolmen noden Raspberry Pi-klusteri 😉

 

 

Tuossa muuten aika hyvä artikkeli hienommista tuunauksista:

https://www.digitalocean.com/community/tutorials/how-to-use-haproxy-to-set-up-mysql-load-balancing–3

 

 

Advertisements

Vastaa

Täytä tietosi alle tai klikkaa kuvaketta kirjautuaksesi sisään:

WordPress.com-logo

Olet kommentoimassa WordPress.com -tilin nimissä. Log Out / Muuta )

Twitter-kuva

Olet kommentoimassa Twitter -tilin nimissä. Log Out / Muuta )

Facebook-kuva

Olet kommentoimassa Facebook -tilin nimissä. Log Out / Muuta )

Google+ photo

Olet kommentoimassa Google+ -tilin nimissä. Log Out / Muuta )

Muodostetaan yhteyttä palveluun %s