Вы находитесь на странице: 1из 5

introducción a la replicación

La replicación de bases de datos es una funcionalidad que permite que toda


acción realizada a un servidor de base de datos se replique automáticamente
en otro servidor. Bajo este concepto, cualquier insert, update, delete, optimize o
cualquier otra consulta que modifique la base de datos en cuestión, se
ejecutará de la misma forma en el servidor replicado.
Es extremadamente útil cuando se trabaja con servidores en distintas
ubicaciones geograficas y forman parte de un mismo sistema. También para
realizar backups automáticamente y tener las mismas bases de datos
disponibles todo el tiempo en diferentes servidores.
Esta funcionalidad se basa en un sistema cliente-servidor aunque mysql lo
llama esclavo-maestro (slave-master). Funcionalmente es el servidor esclavo
quien lee y ejecuta todas las instrucciones que un maestro ejecutó. Estas
instrucciones son registradas en un log binario en el maestro y el esclavo
mantiene un log de las posiciones que ya leyó y ejecutó del maestro.
Toda esta operación se realiza de forma asíncrona. Es decir, no hace falta que
la conexión entre el esclavo y el maestro este constantemente activa ya que el
maestro sigue logueando en su log y el esclavo lo leerá y ejecutará desde la
última posición registrada cuando detecte nuevamente la conexión. Claro está
que si se da esta asincronía, el esclavo no este siempre actualizado, sino sólo
después de leer la ultima posición del master. Si la conexión es permanente,
los datos serán los mismos ya que la replicación es inmediata.
Podemos realizar tantas conexiones slave-master como sean necesario
siempre y cuando un mismo slave no tenga 2 masters, esto generaría
inconsistencias. Incluso es posible, aunque no recomendado si no se esta
completamente seguro, que dos servidores sean slave-master entre ellos y
viceversa siempre y cuando se filtren los datos a replicar, es decir, que lo que
se replique desde el master al slave, no regrese. Si esto ocurriese, tendríamos
una recursividad sin final pasando datos a diestra y siniestra.

Hablando desde mi experiencia, creo que la replicación es una forma muy fácil,
rápida y económica de incrementar la escalabilidad de un sistema ya que si
bien no funciona como cluster, podemos balancear la carga entre los n
servidores que disponemos. Hay que aclarar que el número mínimo de
servidores para un cluster es de 4 y que el cambio es significativamente grande
ya que utiliza otro tipo de estructura MySql.

Caso Práctico de replicación de bases de datos

Imaginemos que tenemos sistema requiere de dos servidores de base de datos


que tengan la misma información. Pero como nuestro sistema tiene un módulo
de estadísticas, necesitamos que uno de ellos mantenga históricamente todos
los registros mientras que el otro sólo mantenga los últimos 30 días para que
las consultas sean mucho más rápidas ya que es información que se vuelve
obsoleta y por lo tanto innecesaria fuera del módulo de estadísticas.
Realizar dos conexiones a dos bases de datos distintas para ejecutar nuestros
inserts/updates es poco eficiente y poco seguro, sería común ver
inconsistencias. Para este caso, entonces, nada mejor que realizar una
replicación.
Configuraremos entonces para que que el servidor maestro replique hacia el
slave todos los inserts y updates que se ejecuten en éste y se configurará un
cron en el esclavo que borre diariamente todos los listings anteriores a 30 días.
De esta forma cada insert o update que se realice en el maestro se realizará
también en el esclavo que, además, borrará los registros viejos todos los días.
Esto es mucho más seguro, porque todos los inserts/updates son logueados y
controlados. Podemos saber y corregir en todo momento cual es la
inconsistencia si la hubiese entre ambos servidores.
A continuación les presento un ejemplo de cómo configurar esta funcionalidad
en ambos servidores para que cumplan su papel.
Configurar el servidor Maestro (Master)

1) Como primer paso, debemos decirle al servidor Master dónde va a loguear


toda su actividad; qué va a loguear, es decir que base de datos queremos que
loguee y además le asignaremos un identificador. Para esto debemos editar el
my.cnf de mysql agregando líneas como éstas:
server-id=1
binlog-do-db=nuestra_DB
log-bin = /var/log/mysql/mysql-bin.log

También debemos decir que permita el acceso remoto, no sólo el acceso


desde el localhost; por lo que debemos comentar estos parámetros en caso de
que existan.
#bind-address
#skip-networking
2) Reiniciamos el servidor de mysql desde la consola de linux y nos logueamos
por consola al mysql con acceso root
# /etc/init.d/mysql restart
# mysql -u root -p

3) Como próximo paso, debemos crear un usuario con acceso a la replicación.


Este usuario es el que usará el Slave para identificarse. En la consola MySql y
con acceso root, podrán crear el usuario de esta forma (también pueden usar
phpMyAdmin para crearlo)
GRANT REPLICATION SLAVE ON *.* TO 'slave1'@'%' IDENTIFIED BY
'slave_password';
FLUSH PRIVILEGES;
slave1: será el nombre de usuario
slave_password: será el password de ese usuario
4) Ahora necesitamos saber la información del log para configurar el servidor
slave, lo podremos hacer con el siguiente comando tambien en la consola
MySql:
USE exampledb;
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;

Les aparecerá una tabla con la el nombre del log, la posición, la base, etc.
Copien esa info a algun archivo de texto a menos que tengan mucha memoria
fotográfica.
Para terminar con el servidor Maestro sólo resta desbloquear las tablas
bloqueadas en el paso anterior desde la consola MySql:
UNLOCK TABLES;
quit;
Configurar el servidor esclavo

1) Suponiendo que ya creamos la base de datos con el mismo nombre que la


del Maestro, vamos directamente a editar la configuración del archivo my.cnf de
mysql agregando/editando estas líneas:
# Servirá como identificador
server-id=2
# El ip del servidor Master
master-host=190.17.9.105
# El monbre de usuario que configuramos en el master
master-user=slave_user
# El password del usuario que configuramos en el master
master-password=slave_password
# Segundos antes de reintentar conectarse
master-connect-retry=60
# Base de datos a replicar
replicate-do-db=nuestra_DB
2) Reiniciamos entonces el servidor esclavo para que tome la nueva
configuración:
# /etc/init.d/mysql restart

3) Nos logueamos como root al MySql y le decimos al esclavo que carge la info
que exista en la DB del maestro para tener como punto de partida:
#mysql -u root -p
# Enter password:

LOAD DATA FROM MASTER;

4) En este paso, le vamos a tener que proveer a nuestro slave, la info que
guardamos en el txt acerca del log del master parando la replicación (estos
valores son de ejemplo, cambienlo por el que tienen ustedes):
SLAVE STOP;

CHANGE MASTER TO MASTER_HOST='190.17.9.105',


MASTER_USER='slave_user',
MASTER_PASSWORD='slave_password',
MASTER_LOG_FILE='mysql-bin.002',
MASTER_LOG_POS=4;
5) Reiniciamos el servicio esclavo y ya tenemos nuestra replicación andando:
START SLAVE;
quit;
Para saber si la replicación está andando sólo basta con poner el siguiente
comando en la consola MySql
SHOW SLAVE STATUS G;
Esto fue todo en cuanto a la configuración de los servidores, espero que
puedan seguir los pasos sin mayores inconvenientes.

Вам также может понравиться