La replicación de MySQL® permite que un servidor de base de datos (denominado servidor de origen en este artículo) se replique en uno o más servidores de base de datos (denominados servidores de réplica en este artículo). Con MySQL, la replicación es asíncrona. Esto significa que los servidores de réplica no necesitan estar conectados de forma permanente para recibir actualizaciones del servidor de origen. Por ejemplo, puede detener el subproceso de réplica en el servidor de réplica y reiniciarlo más tarde, y se sincroniza automáticamente con el origen.
Este tutorial proporciona una configuración sencilla (un único servidor de origen que se replica en un único servidor de réplica) que replica todas las bases de datos desde el origen hasta la réplica.
Requisitos
Antes de comenzar este tutorial, complete los siguientes pasos.
- Instala tu sistema operativo. (Los pasos de este artículo se completan con un sistema operativo CentOS®)
- Instalar mysql
- Instalar mysql-devel
- Instalar servidor mysql
Recopilar información de IP
La configuración de MySQL en este artículo se replica sobre las IP privadas de su servidor en la nube. Tome nota de la IP privada de cada servidor.
Fuente:
[user@mysql-source ~]$ /sbin/ifconfig
eth0 Link encap:Ethernet HWaddr 40:40:51:B7:A4:2E
inet addr:67.23.9.185 Bcast:67.23.9.255 Mask:255.255.255.0
inet6 addr: fe80::4240:51ff:feb7:a42e/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:28878 errors:0 dropped:0 overruns:0 frame:0
TX packets:15147 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:37708534 (35.9 MiB) TX bytes:1129533 (1.0 MiB)
eth1 Link encap:Ethernet HWaddr 40:40:1A:AF:35:F2
inet addr:10.176.41.72 Bcast:10.176.63.255 Mask:255.255.224.0
inet6 addr: fe80::4240:1aff:feaf:35f2/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:3 errors:0 dropped:0 overruns:0 frame:0
TX packets:13 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:230 (230.0 b) TX bytes:762 (762.0 b)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
Desea anotar la IP que se muestra para eth1
. La dirección IP aparece justo después de inet addr:
. En este ejemplo, la IP privada del servidor de origen es 10.176.41.72. Repita esto en el servidor de réplica y anote la IP privada.
Réplica:
[user@mysql-replica ~]$ /sbin/ifconfig
eth0 Link encap:Ethernet HWaddr 40:40:BE:90:EB:1E
inet addr:67.23.10.69 Bcast:67.23.10.255 Mask:255.255.255.0
inet6 addr: fe80::4240:beff:fe90:eb1e/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:29047 errors:0 dropped:0 overruns:0 frame:0
TX packets:13527 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:37743828 (35.9 MiB) TX bytes:1473375 (1.4 MiB)
eth1 Link encap:Ethernet HWaddr 40:40:AE:5B:35:3A
inet addr:10.176.41.207 Bcast:10.176.63.255 Mask:255.255.224.0
inet6 addr: fe80::4240:aeff:fe5b:353a/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:3 errors:0 dropped:0 overruns:0 frame:0
TX packets:13 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:230 (230.0 b) TX bytes:762 (762.0 b)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
La dirección IP de nuestro servidor de réplica en este ejemplo es 10.176.41.207. Cuando tenga ambas direcciones IP privadas anotadas en alguna parte, estará listo para comenzar a configurar.
Configurar el servidor
Fuente
-
Edite el /etc/my.cnf archivo en el servidor de origen para habilitar el registro binario y establecer el nombre del servidor.
[user@mysql-source ~]$ sudo vi /etc/my.cnf
-
Agregue estas líneas debajo de
mysqld
sección.log-bin=/var/lib/mysqllogs/RackspaceServerID-theServerShortName-binary-log expire_logs_days=7 server-name=<server_number>
-
Configure el usuario de replicación.
mysql> GRANT REPLICATION SLAVE ON *.* to 'replicant'@'slaveIP' IDENTIFIED BY 'somepassword';
La fuente my.cnf la configuración está completa.
Preparación de réplicas
-
Verifique que las zonas horarias coincidan entre la fuente y la réplica.
-
Configure los siguientes elementos:
relay-log=/var/lib/mysqllogs/RackspaceServerID-theServerShortName-relay-log relay-log-space-limit = 16G read-only=1 server-name=<server_number>
Copia inicial de datos para replicar
Elija una de las siguientes opciones para copiar datos en la réplica.
- mysqldump
- Copie los archivos planos
mysqldump
Considere esta opción si el directorio de datos tiene un tamaño razonable y si puede tener sus tablas bloqueadas durante la duración del procedimiento.
mysqldump -A --flush-privileges --master-data=1 | gzip -1 > ~rack/master.sql.gz
Transfiere el archivo de volcado a la réplica e impórtalo.
Copiar los archivos planos
Para este método, detenga MySQL en ambos servidores y mueva el directorio de datos fuera del camino en la réplica. Si MySQL no se detiene en ambos servidores, es necesario hacer una copia de seguridad:
# mv /var/lib/mysql{,.prereplication}
Utilice uno de los métodos enumerados anteriormente para convertir el directorio de datos de la réplica en una copia del origen. Por ejemplo:
# rsync -azv --progress --delete /var/lib/mysql/ slave:/var/lib/mysql/
Cuando finalice la copia de datos, reinicie MySQL en ambos servidores. Verifique que innodb-log-file-size
en /etc/my.cnf se establece igual para la réplica y la fuente, o MySQL no se iniciará en la réplica.
Si la réplica es una versión más nueva de MySQL, ejecute mysql_upgrade
en la réplica antes de emitir el start slave
comando.
Adjuntar réplica a la fuente
Necesita el nombre del archivo de registro binario y la posición de la fuente que corresponde con la copia de seguridad. Si está utilizando mysqldump
, esto se incluirá en el master.sql.gz archivo en sí mismo.
# zgrep -m 1 -P 'CHANGE MASTER' master.sql.gz
CHANGE MASTER TO MASTER_LOG_FILE = '<binary log filename>', MASTER_LOG_POS = <binary log position>;
Para una copia a nivel de archivo, como una copia en frío obtenida al cerrar MySQL y usar rsync
, el nombre del archivo de registro binario y la posición serán el primer archivo de registro creado después de reiniciar MySQL.
Puede obtenerlo siguiendo estos pasos:
# service mysqld stop
# tail -n 1 /var/lib/mysqllogs/db1-1234-bin-log.index
/var/lib/mysqllogs/db1-1234-bin-log.000001
# rsync ...
# service mysqld start
En este caso, comience en el nombre de archivo db1-bin-log.000001 + 1 = db1-1234-bin-log.000002
al principio de este archivo. Obtendrá este resultado:
MASTER_LOG_FILE = 'db1-1234-bin-log.000002', MASTER_LOG_POS = 4
Ahora ejecuta CHANGE MASTER
en la réplica para configurar las credenciales para conectarse a la fuente, así como el archivo de registro binario y la posición desde la que iniciar la replicación.
mysql> change master to master_host='master-ip',master_user='userSetAbove', master_password='passwordSetAbove',master_log_file='logfile-from-above-command', master_log_pos=4;
mysql> start slave;
Credenciales raíz de MySQL
Asegúrese de que la nueva réplica tenga las mismas credenciales en /root/.my.cnf archivo como el servidor de origen. La base de datos MySQL y la tabla de permisos de usuario también se sincronizan con la réplica.
Holanda
Debido a que importó la base de datos MySQL desde la fuente, todas las contraseñas ahora son las mismas. Así como actualizó /root/.my.cnf en dbReplica para que coincida con dbSource, es posible que deba actualizar /etc/holland/backupsets/default.conf archivo para usar las mismas credenciales que la fuente para rackspace_backup
.
Prueba
Pruebe su configuración creando una base de datos ficticia en la fuente y verificando que aparezca en la réplica. Una vez verificada, puede descartar la base de datos ficticia y confirmar que la réplica la elimina automáticamente.
Si ve un error como Last_IO_Error: error connecting to master
, pruebe manualmente el usuario de replicación. Desde la réplica, prueba dos cosas:
nc masterIP 3306
Si ve un error aquí, su concesión es incorrecta, probablemente porque se encuentra en un segmento de red diferente de lo que pensaba. El error parecerá Host dbSlave is not allowed to connect to this MySQL server
.
mysql -ureplicant -hmasterDb -p
Si obtiene un error, su subvención es incorrecta.
Si alguno de ellos no se conecta, es posible que deba ajustar el firewall o verificar que está haciendo las suposiciones correctas sobre cómo está configurada la red para este cliente.
Filtrado
Se recomienda que no utilice el filtrado de replicación. Si desea excluir algunas tablas de la réplica, el único método recomendado es con uno de los siguientes my.cnf opciones configuradas en la réplica:
replicate-wild-do-table=dbase1.%
replicate-wild-do-table=dbase3.%
replicate-wild-ignore-table=dbase2.%
replicate-wild-ignore-table=dbase4.someTable
Los patrones pueden contener los caracteres comodín %
y \_
, que tienen el mismo significado que LIKE
Operador de coincidencia de patrones. Si necesita usar un carácter literal_, escápelo de la siguiente manera:
replicate-wild-ignore-table=%.%\_tmp
En MySQL 5.5, las opciones de filtrado a nivel de base de datos distinguen entre mayúsculas y minúsculas en las plataformas que admiten la distinción entre mayúsculas y minúsculas en los nombres de archivo. Las opciones de filtrado a nivel de tabla no distinguen entre mayúsculas y minúsculas en ninguna plataforma, independientemente del valor de lower_case_table_names
variable del sistema.
Eventos
Si mi.cnf ha sido habilitado en la fuente, puede deshabilitarlo en la réplica. Si el programador de eventos necesita estar habilitado en la réplica, verifique que los eventos existentes se hayan creado con CREATE EVENT ... DISABLE ON SLAVE
con algo como:select db, name from mysql.event where status not in
(‘disabled’,‘slavename_disabled’);
Supervisión
Supervise siempre la replicación. En Emergente, generalmente usamos Coincidencia de contenido de SiteScope con check_replication.php , que normalmente vive en snamee httpd ejecutándose en la réplica.
Debe emitir GRANT para esto en la fuente, que se replica en la réplica:
GRANT REPLICATION CLIENT ON *.* TO 'rep_monitor'@'slavePrimaryIP' IDENTIFIED BY 'somePassword';
Suponiendo que está detrás de un firewall, el 'slavePrimaryIP' debe ser la dirección IP interna del servidor de réplica [192.168.100.x]. En el check_replication.php secuencia de comandos, establezca host=‘192.168.100.x
, la IP interna del servidor en el que se ejecuta el script. Suele ser lo mismo que slavePrimaryIP
.
Póngase en contacto con su administrador de cuentas y solicite la configuración del monitor de SiteScope. La URL debe ser la IP pública del servidor de monitoreo, por ejemplo https://68.23.45.32/check_replication.php
dsn list
array y verifique varias réplicas con una sola sonda de SiteScope. La documentación de PHP establece que la coma después del último elemento de la matriz es opcional y se puede omitir. Sin embargo, con la sonda de SiteScope comprobando varias réplicas, podría resultar menos claro qué réplica tenía un problema cuando la alerta desaparece rápidamente. En este sentido, puede tener sentido tener un check_replication.php y la sonda de SiteScope correspondiente ejecutándose en cada réplica.
Ahora siéntese y deje que su servidor de réplica replique desde la fuente. ¡Asegúrese de no realizar ninguna escritura en el servidor de réplica porque eso interrumpe la replicación! Todas las escrituras realizadas en el origen se envían automáticamente a la réplica a través del registro binario y la replicación. Para obtener más información sobre la replicación de MySQL, consulte https://dev.mysql.com/doc/refman/5.0/en/replication.html.