apr 182011
 

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,

Articoli simili

  2 Responses to “Bilanciare le query MySQL su più server in replica”

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

 Leave a Reply

(required)

(required)

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>