Load balancing MySQL – Haproxy

logo-medLoad balancing MySQL z wykorzystaniem Haproxy

Przy niektórych projektach potrzebujemy wyższej niezawodności baz danych lub też wyższej ich wydajności. Możemy tego dokonać instalując więcej niż jeden serwer MySQL i tworząc między nimi replikacje. Ale jak teraz prosto wykrywać usterki i  balansować ruchem pomiędzy kilkoma serwerami MySQL ?

Za pomocą Haproxy ! 🙂

Haproxy to bardzo wydajny loadbalancer który znany jest z wykorzystania dla serwerów WWW, jednak bardzo dobrze radzi sobie też np. z serwerami baz danych.

Poniżej przygotowana została podstawowa konfiguracje złożona z dwóch hostów MySQL: głównego oraz zapasowego i jednego Loadbalancera Haproxy w trybie failover.

IP hostów oraz role:

– 172.16.10.1 – Haproxy LoadBalancer,

– 172.16.10.2 – MySQL serwer główny ( Master ),

– 172.16.10.3 – MySQL serwer zapasowy ( Backup ).

Do sprawdzania żywotności MySQL musimy dodać użytkownika bez hasła z możliwością połączenia się do niego z hosta haproxy. Możemy to zrobić np. tak:

mysql -u root -p -e "INSERT INTO mysql.user (Host,User) values ('172.16.10.1','haproxy_check'); FLUSH PRIVILEGES;"

Przykładowa konfiguracja dla dwóch hostów z wykrywaniem awarii MySQL:

 global
 log /dev/log local0 notice
 log /dev/log local0 err
 daemon
 user haproxy
 group haproxy
 pidfile /var/run/haproxy.pid
 stats socket /var/run/haproxy.stat uid 108 gid 112 mode 600
 ulimit-n 1000000
 maxconn 409600

 defaults
 log global
 mode http
 option tcplog
 option dontlognull
 retries 3
 option redispatch
 maxconn 409600
 timeout client 300s
 timeout server 300s
 timeout connect 10s

 listen MySQL 172.16.10.1:3306
 mode tcp
 balance roundrobin
 option tcpka
 option mysql-check user haproxy-check post-41
 server MySQL-node1 172.16.10.2:3306 check
 server MySQL-node2 172.16.10.3:3306 check backup

Konfiguracje tą możemy dowolnie dostosować, tak by obsłużyła większą ilość hostów czy ustawić Loadbalancer w trybie HA ( High Availability ) niwelując SPOF ( Single Point of Failure ). Poniższe ustawienia mogą też działać bezpośrednio na serwerze z którego chcemy się podłączyć, wystarczy wtedy zmienić IP z 172.16.10.1 na 127.0.0.1 i aplikacja może pracować tak jak serwer bazodanowy MySQL byłby zainstalowany lokalnie.

MySQL 5.1 problem slow_log – Errcode: 2

MySQL

 

MySQL 5.1 problem slow_log – Errcode: 2

 

Jeżeli po aktualizacji czy włączeniu slow_log na serwerze MySQL pojawi się coś podobnego do tego:

Error : Can't get stat of './mysql/slow_log.CSV' (Errcode: 2)
 Error : Out of memory; check if mysqld or some other process uses all available memory; if not, you may have to use 'ulimit' to allow mysqld to use more memory or you can add more swap space
mysql> set global slow_query_log=ON;
ERROR 13 (HY000): Can't get stat of './mysql/slow_log.CSV' (Errcode: 2)

Należy wyłączyć slow log:

mysql> set global slow_query_log=0;
 Query OK, 0 rows affected (0.00 sec)

Utworzyć brakujące pliki:

root@s:/var/lib/mysql/mysql# touch slow_log.CSV
 root@s:/var/lib/mysql/mysql# touch slow_log.CSM
 root@s:/var/lib/mysql/mysql# chown mysql:mysql slow_log.*

Włączyć slow_log:

mysql> set global slow_query_log=1;
 Query OK, 0 rows affected, 1 warning (0.06 sec)

i naprawić tabele:

mysql> repair table mysql.slow_log;
 +----------------+--------+----------+----------+
 | Table | Op | Msg_type | Msg_text |
 +----------------+--------+----------+----------+
 | mysql.slow_log | repair | status | OK |
 +----------------+--------+----------+----------+
 1 row in set (0.02 sec)

Problem rozwiązany 😉