Ecco una guida rapida su come configurare un Cluster Mysql con un bilanciatore di carico pfSense, il firewall UTM open-source basato su FreeBSD. Si procede dapprima con l’installazione di Mysql Cluster (multi-master), successivamente viene configurato pfSense come load balancer TCP. Dal punto di vista logico, un’installazione di Mysql in Cluster si basa su 3 componenti:
- Management Node (mgm): funzione gestione e monitoraggio cluster
- Data Node (dn): contenitore dati
- SQL Node (mysqld): gestione start/stop servizio
Le componenti mgm e mysqld vengono installate sullo stesso server mentre per i data node sarà utilizzato un altro server dedicato. Entrambi gli host vengono replicati per simulare un’architettura minimale in alta affidabilità. Sul livello di balancing invece viene fatta solo una singola installazione di pfSense ma si può prevedere una seconda instanza in modalità active-passive da utilizzare come bilanciatore di backup. L’infrastruttura è in esecuzione su hypervisor Virtualbox con un totale di 5 macchine virtuali.
VIRTUAL MACHINES
IP 10.10.10.1 – lb01 (load balancer pfSense)
IP 10.10.10.10 – mgm01 (mgm+mysqld)
IP 10.10.10.11 – mgm02 (mgm+mysqld)
IP 10.10.10.20 – dn01 (data node)
IP 10.10.10.21 – dn02 (data node)
APPLICATION STACK
– SO Linux CentOS 6.5 64bit Minimal
– VirtualBox 4.2.16
– Mysql Cluster Server gpl 7.3.5
– pfSense 2.1.3
ROADMAP
STEP 1. Preparazione ambiente
STEP 2. Setup Mysql Management nodes (mgm01, mgm02)
STEP 3. Setup Mysql Data nodes (dn01, dn02)
STEP 4. Setup Mysql Daemon nodes (mgm01, mgm02)
STEP 5. Setup pfSense Load Balancer
STEP 6. Test load balancer
STEP 1. Preparazione ambiente
Sono sufficienti solo due tipologie di installazione:
a) setup e post-conf di CentOS per le componenti del cluster Mysql
b) setup e post-conf di pfSense per il Load Balancer e Gateway virtuale interno
Creare la prima macchina virtuale mgm01. Dopo aver completato un’installazione minimal di CentOS effettuare alcune operazioni di post-conf.
$ vi /etc/selinux/config SELINUX=disabled $ chkconfig iptables off $ vi /etc/hosts 10.10.10.10 mgm01 10.10.10.11 mgm02 10.10.10.20 dn01 10.10.10.21 dn02
$ vi /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 NM_CONTROLLED=yes ONBOOT=yes BOOTPROTO=static IPADDR=10.10.10.1 NETMASK=255.255.255.0 GATEWAY=10.10.10.1
$ yum install ntp $ chkconfig ntpd on $ ntpdate pool.ntp.org $ /etc/init.d/ntpd start $ yum install perl $ wget http://dev.mysql.com/get/Downloads/MySQL-Cluster-7.3/MySQL-Cluster-server-gpl-7.3.5-1.el6.x86_64.rpm
Arrestare la macchina virtuale e procedere con la clonazione dell’istanza. Sono necessarie 4 macchine virtuali per configurare un Cluster Mysql (vedi immagine architettura), per cui clonare mgm01 fino ad ottenere mgm02, dn01 e dn02. Sulle tre nuove macchine clonate è necessario una rivisitazione delle impostazioni di rete. Ecco un pro memoria.
# Network interface $ vi /etc/sysconfig/network-scripts/ifcfg-eth0 # Hostname $ vi /etc/sysconfig/network
Prima di procedere con il passo successivo, si consiglia di effettuare uno snapshot dello stato delle macchine. In questo modo si avrà sempre a disposizione una versione “pulita” delle macchine, da cui ripartire velocemente in caso di errori o misconfigurazioni.
STEP 2. Setup Mysql Management nodes (mgm01, mgm02)
Procedere con la configurazione della componente Mysql Management in modalità failover. Questa procedura va ripetuta su entrambe le macchine mgm01 e mgm02.
$ rpm -Uhv --force MySQL-Cluster-server-gpl-7.3.5-1.el6.x86_64.rpm mkdir /var/lib/mysql-cluster
$ vi /etc/my.cnf [mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock user=mysql symbolic-links=0 ndbcluster ndb-connectstring=mgm01,mgm02 default-storage-engine=ndbcluster [mysqld_safe] log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid [mysql_cluster] ndb-connectstring=mgm01,mgm02
$ vi /var/lib/mysql-cluster/config.ini [ndbd default] NoOfReplicas=2 DataMemory=80M IndexMemory=18M [ndb_mgmd] NodeId=1 HostName=mgm01 DataDir=/var/lib/mysql-cluster [ndb_mgmd] NodeId=2 HostName=mgm02 DataDir=/var/lib/mysql-cluster [ndbd] HostName=dn01 DataDir=/var/lib/mysql-cluster/data [ndbd] HostName=dn02 DataDir=/var/lib/mysql-cluster/data [mysqld] HostName=mgm01 [mysqld] HostName=mgm02
# Start mysql management (mgm01) $ ndb_mgmd --ndb-nodeid=1 -f /var/lib/mysql-cluster/config.ini # Start mysql management (mgm02) $ ndb_mgmd --ndb-nodeid=2 -f /var/lib/mysql-cluster/config.ini
STEP 3. Setup Mysql Data nodes (dn01, dn02)
Procedere con la configurazione della componente Data Node. Queste configurazioni vanno replicate su entrambe le macchine dn01 e dn02.
$ rpm -Uhv --force MySQL-Cluster-server-gpl-7.3.5-1.el6.x86_64.rpm $ mkdir -p /var/lib/mysql-cluster/data
$ vi /etc/my.cnf [mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock user=mysql symbolic-links=0 ndbcluster ndb-connectstring=mgm01,mgm02 default-storage-engine=ndbcluster [mysqld_safe] log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid [mysql_cluster] ndb-connectstring=mgm01,mgm02
$ chkconfig --level 2345 mysqld off # Start mysql data $ ndbmtd
STEP 4. Setup Mysql Daemon nodes (mgm01, mgm02)
Procedere con la configurazione del servizio mysqld su entrambe le macchine mgm01 e mgm02. Dopo aver avviato il processo mysqld effettuare l’installazione del DB utilizzando la password autogenerata di default nel file /root/.mysql_secret. Infine, abilitare la replica sincrona dei privilegi sugli utenti. In questo modo si eviterà di eseguire ogni volta operazioni di “GRANT” sugli utenti su ciascun nodo del cluster.
# Start mysql service /etc/init.d/mysqld start # Installation using default random /root/.mysql_secret $ mysql_secure_installation
#Setup mysql privileges synchronous replication $ mysql -uroot -proot < /usr/share/mysql/ndb_dist_priv.sql $ mysql -uroot -proot
> SELECT ROUTINE_NAME, ROUTINE_SCHEMA, ROUTINE_TYPE FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_NAME LIKE 'mysql_cluster%' ORDER BY ROUTINE_TYPE; > CALL mysql.mysql_cluster_move_privileges(); > SELECT CONCAT('Conversion ', IF(mysql.mysql_cluster_privileges_are_distributed(), 'succeeded', 'failed'), '.') AS Result; > SELECT TABLE_NAME, ENGINE FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'mysql' AND TABLE_NAME LIKE '%backup' ORDER BY ENGINE; > GRANT USAGE ON *.* to root@'%' IDENTIFIED BY 'root'; > FLUSH PRIVILEGES;
# To check mysql cluster status $ ndb_mgm ndb_mgm> show Cluster Configuration --------------------- [ndbd(NDB)] 2 node(s) id=3 @10.10.10.20 (mysql-5.6.17 ndb-7.3.5, Nodegroup: 0, *) id=4 @10.10.10.21 (mysql-5.6.17 ndb-7.3.5, Nodegroup: 0) [ndb_mgmd(MGM)] 2 node(s) id=1 @10.10.10.10 (mysql-5.6.17 ndb-7.3.5) id=2 @10.10.10.11 (mysql-5.6.17 ndb-7.3.5) [mysqld(API)] 2 node(s) id=5 @10.10.10.10 (mysql-5.6.17 ndb-7.3.5) id=6 @10.10.10.11 (mysql-5.6.17 ndb-7.3.5)
STEP 5. Setup pfSense Load Balancer
Su Virtualbox creare una nuova macchina virtuale per pfSense con 2 schede di rete. Sulla prima viene configurata l’area WAN virtuale per l’accesso pubblico al dispositivo, sulla seconda l’area LAN interna in cui sono in esecuzione i nodi del cluster Mysql. Per il corretto funzionamento del balancer è necessario che i 2 nodi mgm abbiano impostato pfSense come gateway predefinito (10.10.10.1).
em0 --> WAN (Host Only) em1 --> LAN (Internal Network) IP class for mysql cluster
# Opening all inbound traffic Firewall > Rules > pass (WAN, LAN)
# Adding pool of resources for load balancer Services > Load Balancer > Pools >
# Adding a Virtual Server for load balancer Services > Load Balancer > Virtual Servers > Services > Load Balancer > Settings > interval 3 sec
# Check status of load balancer Status > Load Balancer > Pools >
#Check status of virtual server Status > Load Balancer > Virtual Servers >
STEP 6. Test load Balancer
Per effettuare dei test sul bilanciatore si può simulare una situazione di failure sulle istanze mgm01 e mgm02. Mettere in pausa una delle due macchine virtuali e tentare una connesione mysql con un client remoto.
Hi, Thank you for the post,
in the final step what credential do i need to put to access via the public ip i mean what user and pass?
everything seems to be working fine but i can´t connect via the pullic ip
Thank´s again
Hi,
in order to test a mysql connection through the public IP (wan) of the pfSense, you should open all inbound traffic for the wan and lan interfaces (check section: Firewall > Rules > pass WAN, LAN ).
Make sure that port 3306 on pfSense is open, you can run nmap or telnet to check it:
> telnet 192.168.56.117 3306
or
> nmap 192.168.56.117 | grep 3306
Giuseppe
Ciao Giuseppe.
Complimenti per la chiarezza di esposizione del tuo articolo.
Bye,
Antonio.
Grazie Antonio,
nell’articolo ho cercato proprio di fornire un quick tutorial facile da seguire.
Giuseppe