Load 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.