Este articulo se basa en MariaDB Cluster, sin Galera.
Hacer esto con MariaDB sera mas sencillo de cuando escribí el articulo de Mysql Cluster , En las versiones actuales tanto Mysql como MariaDB pueden replicarse de una forma muy fácil
Con este tipo de cluster las consultas se pueden realizar en los servicios esclavos de MariaDB, pero los insert, creación de tablas, en general cualquier modificación de la base de datos debe hacerse en el servicio Maestro de MariaDB
Para este ejemplo tendré un nodo Maestro y 2 Esclavos
El maestro tiene la ip 192.168.5.200
los esclavos 192.168.5.201 y 192.168.5.202
Estoy usando el MariaDB que viene incluido en CentOS 7
La configuración de cada MariaDB en cada nodo.
Se agrega en /etc/my.cnf :
server-id=1
log-bin=”mysql_log.bin”
binlog-do-db=cluster
replicate-do-db=cluster
server-id es la identificación de cada nodo en el cluster, el maestro sera el 1 y los esclavos 2 y 3.
log-bin es un registro binario de transacciones
binlog-do-db y replicate-do-db se igualan a la base de datos que sera repartida por el cluster. En este jemplo la base de datos de cluster se llama “ cluster “
La configuración es igual en cada nodo, excepto que en los otros nodos el server-id debe ser diferente, para un eslclavo 2 , para el otro 3 y si hubieran mas esclavos, 4, 5, 7 …..
Preferentemente se debe crear la DB antes de iniciar la configuracion.
mysqladmin create cluster
Configuración en el MariaDB Maestro.
Crear el usuario que tendrá privilegios para replicar en los escalvos, para este articulo use clusterReplica y que puede recibir conexiones desde cualquier IP , su clave sera cluster
grant replication slave on *.* to ‘clusterReplica’@’%’ identified by ‘cluster’;
flush privileges;
Configuración en los esclavos :
change master to master_host=’192.168.5.200′,master_user=’clusterReplica’, master_password=’cluster’,master_log_file=’XX’, master_log_pos=YY;
Los valores de master_log_file=’XX’ master_log_pos=YY no son YY ni XX, estos valores se obtienen de una consulta en el nodo maestro con show master status;
si se obtiene algo como:
MariaDB [(none)]> show master status;
+——————+———-+————–+——————+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+——————+———-+————–+——————+
| mysql_log.000002 | 245 | cluster | |
+——————+———-+————–+——————+
1 row in set (0.00 sec)
entonces la sentencia change es la siguiente.
change master to master_host='192.168.5.200',master_user='clusterReplica', master_password='cluster',master_log_file='mysql_log.000002', master_log_pos=245;
antes de insertar el change master en cada uno de los esclavos debe realizar la consulta show master status; en el nodo maestro debido a que el valor de la posición puede cambiar
finalmente se activa el nodo como esclavo con:
start slave;
Conclusiones:
Esta configuración es muy fácil de realizar, es fácil de usar si el desatollo es propio pues los insert a la db se tienen que hacer en el nodo maestro y las consultas en los escalvos, en el código del programa se debe tener una cuenta para los insert, delete y update y otra de solo lectura para los select. Debido a que hacer insert en los nodos esclavos no haría que el datos insertado se replique en los nodos del cluster.
Cuando el desarrollo no es propio y se usan apps como WordPress, Joomla o cualquier otra que no esta pensanda en este tipo de solucion ocurre que intentan hacer los insert en sus nodos esclavos haciendo que no se sincronicen los nodos del cluster.
Hay 2 soluciones a esto, si eres programador puedes modificar estas aplicaciones para que los insert los haga en el maestro y todas las lecturas en los esclavos. ¿ No eres un programador ? aun así puedes clusterizar correctamente pero solo escalaria a un maximo de 2 nodos de cluster.
Cada nodo puede ser esclavo y maestro al mismo tiempo
Si tienes 2 servidores puedes tener una replica de maestro-esclavo a maestro-esclavo, la configuración. Significa que el nodo maestro server-id = 1 sera esclavo del server-id = 2 , el server-id = 2 sera el esclavo del server-id=1
Es tan simple como agregar la configuración de servidor y esclavo en el mismo nodo solo que uno apuntando al otro en el change master, de esta forma lo que escribe el nodo 2 se replica al nodo 1 como si fuera un esclavo, y lo que escribe el nodo 1 se replica al nodo 2 como si fuera un esclavo.
Por que solo puede hacerse entre 2 servidores.
En la versión que viene con CentOS y las que actualmente se consideran estables y probadas, los nodos esclavos solo pueden tener un maestro lo que los encasilla en solo 2 servidores por cluster cuando ambos son maestros.
Existe otra solución lógica pero no la he logrado hacer funcionar. Una solución en anillo.
Si hay 3 nodos.
El nodo maestro 1 tiene por esclavo al nodo 2
El nodo maestro 2 tiene por esclavo al nodo 3
El nodo maestro 3 tiene por esclavo al nodo 1
El teoría debe funcionar, sin embargo si el nodo 1 hace un insert el nodo 2 lo recibe, pero no lo replica al nodo 3, si el nodo 3 hace un insert el nodo 1 lo recibe pero no se replica a el nodo 2 . Supongo que solo los eventos de insert, update o delete son transmitidos a los esclavos y los que llegan por replicación no disparan los eventos necesarios para lanzar la replicación al siguiente esclavo.
Las versiones de la serie 10 de MariaDB incluyen un nuevo concepto llamado multi-sourcing o multi fuente, esto permite que cada esclavo tenga mas de un maestro, con esto se puede lograr una lógica de cluster en estrella.
Finalmente pudiera usarse Galera como opción a clusterizar de maestro a multi maestro.
A continuación un vídeo que muestra la configuración descrita en el articulo.