Replicacion en MYSQL entre 2 servidores Apache2

  • Categoría: Linux
  • Publicado hace más de 3 años
¿Que es la replicacion?

 
La Replicación es un mecanismo mediante el cual los cambios efectuados a una base de datos (MASTER) impactan inmediatamente sobre otra/s (SLAVES) permitiendo poseer contenido sincronizado y distribuído entre varios servidores mysql: ideal para balancear carga entre nodos. Sin  embargo, replicar de este modo no constituye un método eficiente para garantizar la integridad de la información ni una solución de Backup dado que un eventual daño a la BD MASTER se replicará inmediatamente a las SLAVES.
 
Este método (MASTER->SLAVE) supone además la limitación de que sólo la Base de Datos Master es suceptible de operaciones INSERT/UPDATE/DELETE, en tanto que la Slave se encuentra limitada a SELECTS. Si bien no es la mejor solución para desarrollar una estrategia de HA veremos cómo implementarla y dejaremos para la próxima edición un modelo de Replicación más efectivo (MASTER-MASTER) a la hora de pensar en Load Balancing y HA.
 




 

 
Presentacion del Escenario
 

 
Vamos a explicar cómo implementar un mecanismo de Replicación MASTER-SLAVE entre dos bases de datos Mysql alojadas en dos Servidores Apache2 corriendo Debian Squeeze. Este artículo asume que se poseen dos computadoras en Red corriendo Linux con LAMPP instalado en ambos casos. Presentemos el escenario:

 
Server 1 (Master): 192.168.1.33
 Server 2 (Slave): 192.168.1.34
 Base de Datos MYSQL en Server 1: mibase (la base de datos debe tener al menos 1 tabla con datos para poder verificar la replicación)



 Manos a la Obra: configurando el MASTER (192.168.1.33)
 
Trabajaremos primero en el Servidor MASTER. Vamos a realizar las configuraciones pertinentes al archivo my.cnf y crearemos un usuario mysql con privilegios ALL + REPLICATION. A lo largo de este breve tutorial trabajaremos exclusivamente con una terminal o en modo texto. Esta es una buena práctica dado que la mayoría de las veces realizaremos estas tareas administrativas vía ssh en servidores remotos o bien en boxes que, por cuestiones de rendimiento, no tienen Interface Gráfica.
 
Lo primero que haremos es editar el archivo de configuración de MYSQL que se encuentra en /etc/mysql/my.cnf. Recordemos que para editar estos archivos debemos loguearnos como root.

 

Cita: Mostrar

Al abrir el fichero nos encontraremos con los parametros que configuran el Motor de Base de Datos Mysql. Buscamos en el archivo la sección con cabecera [mysqld]. Lo primero es encontrar la línea bind-address cuyo valor estará por defecto en 127.0.0.1. Esta línea limita el alcance del Servicio Mysql al Servidor 1 y, dado que necesitaremos comunicarnos con el Servidor 2, la comentamos agregado un # delante de suerte que quedará:
 
#bind-address = 127.0.0.1
 
Si bajamos un poco más en el fichero (siempre dentro de la cabecera [mysqld]) encontraremos los siguientes valores que estarán comentados con # y deben ser descomentados y configurados del siguiente modo:

 server-id=1
log_bin = /var/log/mysql/mysql-bin.log
binlog_do_db = nombredelabasededatos

Guardamos los cambios al fichero my.cnf y luego reiniciamos MYSQL

 
Cita: Mostrar

Con esto tenemos la configuración lista. Procedemos a la creación de un usuario mysql que será el encargado de tramitar la Replicación. Para mantener los comandos claros digamos que el usuario mysql que crearemos tendrá como nombre daniel y como clave demichele. Procedemos entonces a la creación del usuario ingresando a mysql como root

 
Cita: Mostrar

Cada uno de los comandos escritos en la shell de mysql terminan en ; y deben ingresarse de a uno seguidos de la tecla Enter. Terminada esta rutina, el comando SHOW MASTER STATUS nos mostrará una tabla de este tipo:

 



 
Al finalizar la configuración del Server 2 necesitaremos los datos que aparecen listados en las columnas File y Position de la tabla obtenida por lo que es recomendable guardarlos.
 
Por último quitamos el Read Lock que habíamos puesto a las tablas y salimos de la shell mysql. Hemos terminado la configuración del Server 1 con la Base de Datos MASTER.
 mysql> UNLOCK TABLES;
mysql> QUIT;
[email protected]:/#
Configurando el Server Slave (192.168.1.34)

 
Vamos a comenzar nuevamente por editar el fichero de configuración de MYSQL, ubicado en /etc/mysql/my.cnf.
 Al igual que en servidor MASTER, comentaremos la línea que limita el alcance del servicio a la interface local (bind-address).
 
Comentada la línea debemos introducir los siguientes cambios bajo la cabecera [mysqld] de modo que el fichero quede así:

 
Cita: Mostrar


Guardamos los cambios y reiniciamos Mysql:

 
Cita: Mostrar

 
Aquí debemos detenernos un segundo para explicar un posible problema con el que yo me encontré y quizás muchos se ahorren.
 
Hemos, en los ficheros my.cnf de los dos servidores, comentado la línea bind-address = 127.0.0.1 por la evidente razón de que necesitaremos que mysql interactuara dentro de la Red local con su box vecino (por ejemplo, le decimos al Slave que su Master está en 192.168.1.33).
 
Ahora bien, MYSQL utiliza el puerto 3306 y ocurre, en algunos casos, que este puerto no se encuentra abierto (ya sea en el Firewall del OS o bien en el Router). Uno  puede realmente perder mucho tiempo recibiendo errores de acceso denegado para el usuario mysql creado hasta darse cuenta de que no hay comunicación entre los boxes.
 
Para verificar que el usuario creado (daniel) desde el Server MASTER tiene acceso al SLAVE (es decir, que hay comunicación vía el puerto 3306 entre los 2 equipos) intentaremos loguearnos a mysql en el SLAVE del siguiente modo:

 
Cita: Mostrar

Si obtenemos la shell mysql (mysql>) entonces estamos listos para continuar. Si, por el contrario, recibimos un error que alude a que el usuario no posee acceso, tendremos que abrir el puerto vía iptables del siguiente modo:

 
Cita: Mostrar

Agregada la regla en el Server 2, reintentamos:

 
Cita: Mostrar

Si esto no funcionara, queda agregar al Firewall del Router una Regla LAN TO LAN que permita el tráfico vía el puerto 3306. Este no es un escenario muy común, pero en mi opinión (IMHO) nada se pierde con agregar una regla en el ámbito local para garantizar que el tráfico de box a box fluya por el puerto en cuestión.
 
Como último paso para probar la Replicación tendremos que crear una Base de Datos en el Servidor Slave que lleve el mismo nombre que la MASTER (mibase). Para esto:

 
Cita: Mostrar


Y ha llegado la hora de revisar la Base de Datos que acabamos de crear en el Servidor SLAVE: una copia exacta de los contenidos de la Base MASTER debería estar ahora en la SLAVE. Hemos replicado los contenidos con la instrucción LOAD DATA FROM MASTER.
 
Nos queda un último y fundamental paso: el de automatizar el proceso de Replicación de modo que los cambios realizados en la Base Master impacten a la Slave al instante y sin intervención de ninguna clase.
 
Para esto, reconectamos a la shell de mysql, detenemos la Base de Datos SLAVE, introducimos los valores que determinarán la configuración automática de la Replicación reemplazando los valores de MASTER_LOG_FILE y MASTER_LOG_POST por los obtenidos en la tabla que arrojó la sentencia SHOW MASTER STATUS en Server MASTER y, por útimo, volvemos a iniciar la Base SLAVE.

 
Cita: Mostrar

Ahora nos vamos a la Base Master, realizamos cuantos cambios queramos y constatamos la Replicación inmediata en su par SLAVE. Si se diera el caso de que queremos optimizar rendimiento de Mysql a través de este modelo de Replicación podríamos instruir nuestra aplicación en Server para que Sirviera todos los requests que involucren SELECTS de SLAVE y trabajara con MASTER sólo en los casos en que las operaciones de Alteración de datos son requeridas.




Replicacion en MYSQL entre 2 servidores Apache2 con Debian Squeeze
Replicacion en MYSQL entre 2 servidores Apache2
17 Puntos Score: 4.3/10
Visitas: 697 Favoritos: 10
Ver los usuarios que votaron...
1 Comentarios Replicacion en MYSQL entre 2 servidores Apache2
Para dejar un comentario Registrate! o.. eres ya usuario? Accede!