JTorrents
Mis experiencias en TI

Percona XtraDB Cluster - MySQL Clustering and High Availability

Percona XtraDB Cluster es una solución de alta disponibilidad y alta escalabilidad para clústeres MySQL ®. Percona XtraDB Cluster integra Percona Server con la biblioteca Galera de MySQL.

Las características de Percona XtraDB incluyen:

  •      Replicación síncrona
  •      Admite la replicación multi-master
  •      Replicación en paralelo

En esta entrada intentare explicar cómo instalar un clúster con 3 nodos (configuración multi-master en anillo) que es el mínimo recomendado por el fabricante del software. La referencia: Percona Ubuntu Howto

El software lo podemos instalar desde paquetes binarios o en el genérico tar.gz, en mi caso utilizo la última Debian7 estable.

Añadimos la clave de Percona al apt:

$ apt-key adv --keyserver keys.gnupg.net --recv-keys 1C4CBDCDCD2EFD2A

Editamos el fichero /etc/apt/sources.list , y reemplazamos VERSIÓN con el nombre de la distribución utilizada (wheezy):

deb http://repo.percona.com/apt VERSION main
deb-src http://repo.percona.com/apt VERSION main

Actualizamos la cache de apt:

$ apt-get update

Instalamos los paquetes necesarios:

$ apt-get install percona-xtradb-cluster-server-5.6 percona-xtradb-cluster-client-5.6 percona-xtradb-cluster-galera-3.x

Utilizaremos apt-pinning para evitar actualizaciones indeseadas desde los repositorios de la distribución, para ello creamos un nuevo fichero  /etc/apt/preferences.d/00percona.pref y añadimos las siguientes líneas:

Package: *
Pin: release o=Percona Development Team
Pin-Priority: 1001
Configuración de los nodos:

En este ejemplo el clúster está formado por los siguientes nodos:

node #1
hostname: pxc1
IP: 192.168.70.61
node #2
hostname: pxc2
IP: 192.168.70.62
node #3
hostname: pxc3
IP: 192.168.70.63

Primer nodo:

El archivo de configuración /etc/mysql/my.cnf para el primer nodo debe ser similar a:

[mysqld]
datadir=/var/lib/mysql
user=mysql
# Path to Galera library
wsrep_provider=/usr/lib/libgalera_smm.so
# Empty gcomm address is being used when cluster is getting bootstrapped
wsrep_cluster_address=gcomm://
# Cluster connection URL contains the IPs of node#1, node#2 and node#3
#wsrep_cluster_address=gcomm://192.168.70.61,192.168.70.62,192.168.70.63
# In order for Galera to work correctly binlog format should be ROW
binlog_format=ROW
# MyISAM storage engine has only experimental support
default_storage_engine=InnoDB
# This is a recommended tuning variable for performance
innodb_locks_unsafe_for_binlog=1
# This changes how InnoDB autoincrement locks are managed and is a requirement for Galera
innodb_autoinc_lock_mode=2
# Node #1 address
wsrep_node_address=192.168.70.61
# SST method
wsrep_sst_method=xtrabackup
# Cluster name
wsrep_cluster_name=my_ubuntu_cluster
# Authentication for SST method
wsrep_sst_auth="sstuser:s3cretPass"

Nota: wsrep_cluster_address: Inicialmente indicamos el string de conexión vacío/sin direcciones ip (gcomm://) para inicializar (bootstrapping) el clúster y una vez esté formado, debemos sustituirla por la cadena (comentada con ###) que tiene todas las direcciones ip correspondientes a los nodos del clúster.

Nota: wsrep_sst_auth: Autenticación (usuario:contraseña) para unir nodos al clúster.

Reiniciamos mysql:

[root@pxc1 ~]# /etc/init.d/mysql restart

Entramos como root en la consola de mysql y realizamos un check:

mysql@pxc1> show status like 'wsrep%';
+----------------------------+--------------------------------------+
| Variable_name              | Value                                |
+----------------------------+--------------------------------------+
| wsrep_local_state_uuid     | b598af3e-ace3-11e2-0800-3e90eb9cd5d3 |
...
| wsrep_local_state          | 4                                    |
| wsrep_local_state_comment  | Synced                               |
...
| wsrep_cluster_size         | 1                                    |
| wsrep_cluster_status       | Primary                              |
| wsrep_connected            | ON                                   |
...
| wsrep_ready                | ON                                   |
+----------------------------+--------------------------------------+
40 rows in set (0.01 sec)

La variable wsrep_cluster_size  indica 1, este resultado muestra que el clúster se ha iniciado con éxito.

En el mismo nodo, creamos el usuario que se usará para hacer el SST (State Snapshot Transfer):

mysql@pxc1> CREATE USER 'sstuser'@'localhost' IDENTIFIED BY 's3cretPass';
mysql@pxc1> GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'sstuser'@'localhost';
mysql@pxc1> FLUSH PRIVILEGES;

Nota: Para las transferencias SST podemos utilizar el usuario root pero se recomienda utilizar un usuario diferente (no root) para esto.

Segundo nodo:

El archivo de configuración /etc/mysql/my.cnf para el segundo nodo debe ser similar a:

[mysqld]
datadir=/var/lib/mysql
user=mysql
# Path to Galera library
wsrep_provider=/usr/lib/libgalera_smm.so
# Cluster connection URL contains IPs of node#1, node#2 and node#3
wsrep_cluster_address=gcomm://192.168.70.61,192.168.70.62,192.168.70.63
# In order for Galera to work correctly binlog format should be ROW
binlog_format=ROW
# MyISAM storage engine has only experimental support
default_storage_engine=InnoDB
# This is a recommended tuning variable for performance
innodb_locks_unsafe_for_binlog=1
# This changes how InnoDB autoincrement locks are managed and is a requirement for Galera
innodb_autoinc_lock_mode=2
# Node #2 address
wsrep_node_address=192.168.70.62
# Cluster name
wsrep_cluster_name=my_ubuntu_cluster
# SST method
wsrep_sst_method=xtrabackup
#Authentication for SST method
wsrep_sst_auth="sstuser:s3cretPass"

Reiniciamos mysql:

[root@pxc2 ~]# /etc/init.d/mysql restart

Entramos como root en la consola de mysql y realizamos un check:

mysql@pxc2> show status like 'wsrep%';
+----------------------------+--------------------------------------+
| Variable_name              | Value                                |
+----------------------------+--------------------------------------+
| wsrep_local_state_uuid     | b598af3e-ace3-11e2-0800-3e90eb9cd5d3 |
...
| wsrep_local_state          | 4                                    |
| wsrep_local_state_comment  | Synced                               |
...
| wsrep_cluster_size         | 2                                    |
| wsrep_cluster_status       | Primary                              |
| wsrep_connected            | ON                                   |
...
| wsrep_ready                | ON                                   |
+----------------------------+--------------------------------------+
40 rows in set (0.01 sec)

La variable wsrep_cluster_size  indica 2, este resultado muestra que el segundo nodo del clúster se ha iniciado con éxito.

Tercer nodo:

El archivo de configuración /etc/mysql/my.cnf para el tercer nodo debe ser similar a:

[mysqld]
datadir=/var/lib/mysql
user=mysql
# Path to Galera library
wsrep_provider=/usr/lib/libgalera_smm.so
# Cluster connection URL contains IPs of node#1, node#2 and node#3
wsrep_cluster_address=gcomm://192.168.70.61,192.168.70.62,192.168.70.63
# In order for Galera to work correctly binlog format should be ROW
binlog_format=ROW
# MyISAM storage engine has only experimental support
default_storage_engine=InnoDB
# This is a recommended tuning variable for performance
innodb_locks_unsafe_for_binlog=1
# This changes how InnoDB autoincrement locks are managed and is a requirement for Galera
innodb_autoinc_lock_mode=2
# Node #3 address
wsrep_node_address=192.168.70.63
# Cluster name
wsrep_cluster_name=my_ubuntu_cluster
# SST method
wsrep_sst_method=xtrabackup
#Authentication for SST method
wsrep_sst_auth="sstuser:s3cretPass"

Reiniciamos mysql:

[root@pxc3 ~]# /etc/init.d/mysql restart

Entramos como root en la consola de mysql y realizamos un check:

mysql@pxc3> show status like 'wsrep%';
+----------------------------+--------------------------------------+
| Variable_name              | Value                                |
+----------------------------+--------------------------------------+
| wsrep_local_state_uuid     | b598af3e-ace3-11e2-0800-3e90eb9cd5d3 |
...
| wsrep_local_state          | 4                                    |
| wsrep_local_state_comment  | Synced                               |
...
| wsrep_cluster_size         | 3                                    |
| wsrep_cluster_status       | Primary                              |
| wsrep_connected            | ON                                   |
...
| wsrep_ready                | ON                                   |
+----------------------------+--------------------------------------+
40 rows in set (0.01 sec)

La variable wsrep_cluster_size  indica 3, este resultado muestra que el tercer nodo del clúster se ha iniciado con éxito.

Con esto ya tenemos el clúster de 3 nodos MySQL montado y funcionando por Unicast.

Nota: En el caso de que el tráfico de red entre nodos del clúster sea elevado debido a la configuración unicast podemos emplear multicast. Más información aquí.

Anexo:

Para equilibrar la carga podemos utilizar HAproxy (información aquí) o bien si tenemos una zona DNS interna podemos utilizar round robin (ojo, ver este post).

En caso de utilizar DNS round robin simplemente creamos una entrada en el fichero de zona similar a esta:

  ; Round Robin Percona cluster
  percona IN A 192.168.70.61
          IN A 192.168.70.62
          IN A 192.168.70.63

 

Escrito por Joan Torrents el Thursday January 2, 2014
Enlace permanente -

« dpkg (debian) y directorios temporales con el flag noexec -