Mostrando las entradas con la etiqueta Replicación MySQL. Mostrar todas las entradas
Mostrando las entradas con la etiqueta Replicación MySQL. Mostrar todas las entradas

lunes, 14 de septiembre de 2015

MySQL autoincrement en replicación Master-Master

Un detalle que se nos presenta al momento de la replicación de Master-Master es con respecto a los campos que definimos como auto_increment dentro de la estructura de nuestras tablas.

La solución que se nos ofrece en este tipo de situaciones, sonara como una "Mexicanada".

Tenemos dos parámetros configurables: auto_increment_increment y auto_increment_offset.

Para configurar estas opciones lo podemos realizar al iniciar el servicio MySQL.


--auto_increment_increment= N --auto_increment_offset=#

donde:
N = Número de servidores que trabajaran con esta configuración.
# = Número entre 1 y N, cada servidor usara un diferente offset.


Ó mediante variables:

SET @@auto_increment_increment = N;
SET @@auto_increment_offset = #;


auto_increment_increment; es el numero en que el servidor incrementara cada vez que un valor sea incrementado. El default es 1, es decir que incrementara de 1 en 1, ejemplo 1, 2, 3, 4, 5, etc. Si el valor es un 2, incrementara en 2, ejemplo 1, 3, 5, 7, 9, etc. Si el valor es 3 incrementara, 1, 4, 7, 10, etc.
auto_increment_offset: No puede ser un valor mayor al de auto_increment_increment, este permite decirle cual sera el valor del servidor, si es par o non, si es 1 sera 1, 3, 5 y si es "2" entonces seran los valores 2, 4, 6, 8, No importa cual sea el valor actual del auto_increment, si es 132, continuara con 134, 136, etc.


También podemos declararlos de la siguiente manera:
Al detalle:
Configuraciones:
En servidor 1:
auto_increment_increment = 2    # Cantidad de servidors
auto_increment_offset = 1  # El número a incrementar (es non)
En servidor 2:
auto_increment_increment = 2   # Cantidad de servidores.
auto_increment_offset = 2  # El número a incrementar (es inpar)
De un inicio en cuanto activamos una replicación las tablas contaran con la misma información. Una vez que se configura como anteriormente se menciono, y se realizan insert sobre dichas tablas (con auto_increment) se insertaran algunos registros en servidor 1, y otros se insertaran en el servidor 2, todo con respecto a la configuración anterior. En un momento dado tendrán información diferente, pero al ejecutarse la replicación, ambos servidores contaran con la misma información.







jueves, 18 de junio de 2015

Configurar replicación Master-Master #MySQL

Configurando la replicación de master a master.

La replicación es un proceso de pasar la información de una base de datos de un servidor y se copia a otra base de datos a un segundo servidor.

Normalmente configuramos la replicación en espejo (master-slave), para tener un plan de contingencia ante una eventualidad donde podamos poner un servidor esclavo(slave) como master(maestro).

¿Para qué?

  • Permitir la escalibilidad de las aplicaciones.
  • Distribuir las cargas en dos servidores.
  • Redundancia e incrementar la eficiencia.


PASO 1: Instalar y configurar MySQL en el servidor 1

sudo apt-get install mysql-server mysql-client
Editar el archivo /etc/mysql/my.cnf y modificar los valores de las siguientes variables:
#server-id = 1
#log_bin = /var/log/mysql/mysql-bin.log #binlog_do_db = include_database_name bind-address = 127.0.0.1
server-id es un identificador único por servidor.
log_bin nombre de archivo donde se guardaran los logs.
bin_log_do_db nombre de la o las base de datos a replicar.
bind-address las ips donde se podrán o no conectar al servidor MySQL.

Debería quedar así:

server-id               = 1
log_bin                 = /var/log/mysql/mysql-bin.log
binlog_do_db            = basedatos_prueba
# bind-address            = 127.0.0.1
Ahora reiniciamos el servicio mysql.

sudo service mysql restart
Entramos a la consola con usuario root, nos pedirá la contraseña:

mysql -u root -p 
Ejecutaremos unas consultas, crearemos usuario para que se ejecute la replicación entre los servidores.

create user 'replicator'@'%' identified by 'password'; 
Otorgamos los derechos al usuario a las base de datos.

grant replication slave on *.* to 'replicator'@'%'; 
Finalmente obtener información del servidor configurado para despues ser utilizada (GUARDAR LOS DATOS EXTRAIDOS)

show master status; 
La salida similar a esta:

+------------------+----------+----------------+------------------+
| File             | Position | Binlog_Do_DB   | Binlog_Ignore_DB |
+------------------+----------+----------------+------------------+
| mysql-bin.000001 |      59 | basedatos_prueba|                  |
+------------------+----------+----------------+------------------+
1 row in set (0.00 sec)
PASO 2: Instalar y configurar MySQL en el servidor 2

sudo apt-get install mysql-server mysql-client
Editar el archivo /etc/mysql/my.cnf y AHORA cambiaremos el id, por otro numero único:
#server-id = 1
#log_bin = /var/log/mysql/mysql-bin.log #binlog_do_db = include_database_name bind-address = 127.0.0.1
Debería quedar así:

server-id               = 2
log_bin                 = /var/log/mysql/mysql-bin.log
binlog_do_db            = basedatos_prueba
# bind-address            = 127.0.0.1
Después de cambiar el archivo reiniciamos el servicio mysql.

sudo service mysql restart
Entramos a la consola con usuario root, nos pedirá la contraseña:

mysql -u root -p 
Crearemos usuario para que se ejecute la replicación entre los servidores.

create user 'replicator'@'%' identified by 'password'; 
Creamos la base de datos que queremos replicar, si ya existe se omite el paso.

create database basedatos_prueba; 
Otorgamos los derechos al usuario a las base de datos.

grant replication slave on *.* to 'replicator'@'%'; 
El siguiente paso permitirá comenzar con la replica de los datos, detenemos el espejo, configuramos con la información que extrajimos con anterioridad con el comando "show master status"

slave stop; 
CHANGE MASTER TO MASTER_HOST = '3.3.3.3', MASTER_USER = 'replicator', MASTER_PASSWORD = 'password', MASTER_LOG_FILE = 'mysql-bin.000001', MASTER_LOG_POS = 54; 
slave start; 
Necesitamos remplazar la contraseña por la que elegimos anteriormente cuando se creo el usuario y se dio derechos.


Lo ultimo que tenemos que realizar es obtener los datos del master (segundo servidor) para realizar la sincronización en el sentido contrario.

SHOW MASTER STATUS; 
La salida será similar a esta:

+------------------+----------+-----------------+------------------+
| File             | Position | Binlog_Do_DB    | Binlog_Ignore_DB |
+------------------+----------+-----------------+------------------+
| mysql-bin.000004 |      125 | basedatos_prueba|                  |
+------------------+----------+-----------------+------------------+
1 row in set (0.00 sec)
Guardamos los datos nuevamente, para aplicarlos en el primer servidor y que la replicación sea en ambos sentidos.

PASO 3:  Configuración del regreso de la replicación

En el primer servidor, ejecutar lo siguiente en la linea de comandos.

 
slave stop; 
CHANGE MASTER TO MASTER_HOST = '4.4.4.4', MASTER_USER = 'replicator', MASTER_PASSWORD = 'password', MASTER_LOG_FILE = 'mysql-bin.000004', MASTER_LOG_POS = 125; 
slave start; 
PASO 4: Probar la replicación

Si no existiera la base de datos configurada:

create database basedatos_prueba; 
Se crea la tabla en el primer servidor.

CREATE TABLE basedatos_prueba.ejemplo (`id` integer(10)); 
Revisamos en el segundo servidor que exista la tabla (comprobar que se replico):

SHOW TABLES IN basedatos_prueba; 
En ese mismo segundo servidor eliminamos la tabla:

DROP TABLE basedatos_prueba.ejemplo; 
Y comprobamos que no exista en el primer servidor.




Nota: Tener cuidado al realizar este tipo de replicación cuando se tengan estructuras de tabla donde existan campos que sean auto_increment.