Abbiamo visto in un precedente articolo come avere due server MySQL in replica circolare per avere un sistema MySQL completamente ridondato. In questo articolo utilizzeremo altri due strumenti OpenSource attraverso i quali riusciremo sia a bilanciare il carico, sia ad otternere una migliore sicurezza di funzionamento del sistema.
Premettiamo una cosa: oltre ai due nodi in replica circolare, è possibile aggiungere X nodi slave in modo da scalare all’infinito il sistema. E’ importante però che ci siano soli due nodi Master-Master, mentre gli altri dovranno essere solo slave: effettueremo il bilanciamento del carico solo per le query in lettura (e queste possono essere tranquillamente inviate ad un qualsiasi slave), mentre avremo in realtà un solo master attivo, l’altro fungerà da slave e diventerà master solo nel caso in cui il primo guastarsi.
MySQL MMM
MySQL MMM è un utile sistema di script in Perl in grado di gestire un sistema di più server MySQL in replica semplicemente “giocando” con gli indirizzi IP. Si ha un demone che gira sul controller e un agent che gira su ogni server; il controller dialoga con gli agent per verificarne il funzionamento e, in caso affermativo gli assegna un indirizzo IP valido. Nel caso in cui un agent dovesse avere problemi, l’indirizzo IP viene spostato dal controller su un agent funzionante.
Facciamo un esempio per chiarirci le idee. Ammettiamo di avere un sistema formato da questi 5 server:
192.168.50.101 db1 (Master 1)
192.168.50.102 db2 (Master 2)
192.168.50.103 db3 (Slave 1)
192.168.50.104 db4 (Slave 2)
192.168.50.150 Controller
Configureremo MySQL MMM per smistare automaticamente gli indirizzi IP 192.168.50.221/222/223/224 per gestire la lettura e l’IP 192.168.50.220 per la scrittura. Su tutti i server MySQL sarà presente il file /etc/mysql_mmm/mmm_common.conf:
/etc/mysql-mmm/mmm_common.conf active_master_role writer <host default> cluster_interface eth1 pid_path /var/run/mmm_agentd.pid bin_path /usr/lib/mysql-mmm/ replication_user replication replication_password replication_password agent_user mmm_agent agent_password agent_password </host> <host db1> ip 192.168.50.201 mode master peer db2 </host> <host db2> ip 192.168.50.202 mode master peer db1 </host> <host db3> ip 192.168.50.203 mode slave </host> <host db4> ip 192.168.50.204 mode slave </host> <role writer> hosts db1, db2 ips 192.168.50.220 mode exclusive </role> <role reader> hosts db1, db2, db3, db4 ips 192.168.50.221, 192.168.50.222, 192.168.50.223, 192.168.50.224 mode balanced </role>
Su ciascun agent dovrà essere inoltre presente il file /etc/mysql_mmm/mmm_agent.conf
/etc/mysql-mmm/mmm_agent.conf include mmm_common.conf this db1
Ovviamente sostituiremo db1 con il nome sel server assegato nel file mmm_common corrispondente all’indirizzo ip.
Inoltre bisognerà creare dei nuovi utenti all’interno della console di MySQL:
mysql -p -u root GRANT REPLICATION CLIENT ON *.* TO 'mmm_monitor'@'192.168.50.%' IDENTIFIED BY 'monitor_password'; GRANT SUPER, REPLICATION CLIENT, PROCESS ON *.* TO 'mmm_agent'@'192.168.50.%' IDENTIFIED BY 'agent_password'; GRANT REPLICATION SLAVE ON *.* TO 'replication'@'192.168.50.%' IDENTIFIED BY 'replication_password';
Sul controller, invece, modificheremo il file /etc/mysql-mmm/mmm_mon.conf:
include mmm_common.conf ip 127.0.0.1 pid_path /var/run/mmm_mond.pid bin_path /usr/lib/mysql-mmm/ auto_set_online 15 status_path /var/lib/misc/mmm_mond.status ping_ips 192.168.50.201, 192.168.50.202, 192.168.50.203, 192.168.50.204 monitor_user mmm_monitor monitor_password monitor_password debug 0
Bene, a questo punto avremo sempre disponibili gli IP 192.168.50.221/222/223/224 per effettuare query in lettura (anche se ci fosse solo un server attivo) e l’IP 192.168.50.220 a cui indirizzare le query in scrittura. Bene come fare? Ci viene in aiuto MySQL Proxy.
MySQL Proxy
MySQL Proxy è un pacchetto che permette di fare molte cose, ma in questa situazione lo utilizzeremo sul controller semplicemente per smistare le query in lettura sugli IP 192.168.50.221/222/223/224 e le query in scrittura sull’IP 192.168.50.220.
Per farlo basterà avviare il demone con le seguenti opzioni:
--proxy-address=:3306 --proxy-backend-addresses=192.168.50.220:3306 --proxy-read-only-backend-addresses=192.168.50.221:3306 --proxy-read-only-backend-addresses=192.168.50.222:3306 --proxy-read-only-backend-addresses=192.168.50.223:3306 --proxy-read-only-backend-addresses=192.168.50.224:3306 --log-use-syslog --log-level=warning --admin-address=192.168.50.150:4041 --admin-password=passwordAmministratore
Bene ora nelle applicazioni sarà sufficiente configurare come server MySQL l’indirizzo IP 192.168.50.150 e il nostro proxy si occuperà di gestire il nostro cluster,
Bene, a questo punto vremo sempre disponibili gli IP 192.168.50.221/222/223/224 per effettuare query in lettura (anche se ci fosse solo un server attivo) e l’IP 192.168.50.220 a cui indirizzare le query in lettura. Bene come fare? Ci viene in aiuto MySQL Proxy.
Ci sono due errori nel paragrafo riportato: il primo è uno un typo (manca una lettera) ma il secondo è un termine sbagliato il 192.168.50.220 è l’indirizzo a cui destinare le query in scrittura non in lettura.
Grazie mille Giovanni, ho corretto i due errori