Dicembre 16, 2019

Mysql Cluster con Load Balancer pfSense

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:

  1. Management Node (mgm): funzione gestione e monitoraggio cluster
  2. Data Node (dn): contenitore dati
  3. 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.

giuseppe-urso--mysql-cluster-con-load-balancer-pfsense-01

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
giuseppe-urso--mysql-cluster-con-load-balancer-pfsense-02

 

# Opening all inbound traffic 
Firewall > Rules > pass (WAN, LAN)
giuseppe-urso--mysql-cluster-con-load-balancer-pfsense-03

 

# Adding pool of resources for load balancer
Services > Load Balancer > Pools >
giuseppe-urso--mysql-cluster-con-load-balancer-pfsense-04

 

# Adding a Virtual Server for load balancer
Services > Load Balancer > Virtual Servers > 
Services > Load Balancer > Settings > interval 3 sec
giuseppe-urso--mysql-cluster-con-load-balancer-pfsense-05

 

# Check status of load balancer
Status > Load Balancer > Pools >
giuseppe-urso--mysql-cluster-con-load-balancer-pfsense-06

 

#Check status of virtual server
Status > Load Balancer > Virtual Servers >
giuseppe-urso--mysql-cluster-con-load-balancer-pfsense-07

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.

giuseppe-urso--mysql-cluster-con-load-balancer-pfsense-09

giuseppe-urso--mysql-cluster-con-load-balancer-pfsense-08

giuseppe-urso--mysql-cluster-con-load-balancer-pfsense-10

Related posts

4 Comments

  1. zakarya

    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

    Reply
    1. Giuseppe Urso

      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

Leave a Reply

Your email address will not be published.