Las capacidades de replicación de MySQL están implementadas
usando tres flujos (uno en el servidor maestro y dos en el
esclavo). Cuando se ejecuta un START SLAVE
, el
esclavo crea un flujo de entrada/salida, que conecta al maestro y
le pide que envíe los comandos guardados en su log binario. El
maestro crea un flujo para enviar los contenidos del log binario
al esclavo. Este flujo puede identificarse como el flujo
Binlog Dump
en la salida de SHOW
PROCESSLIST
en el maestro. El flujo de entrada/salida
del esclavo lee lo que el flujo Binlog Dump
del
maestro envía y copia estos datos en ficheros locales, llamados
logs retardados, en el directorio de datos
del esclavo. El tercer flujo es el flujo SQL, que crea el esclavo
para leer los logs retardados y para ejecutar las actualizaciones
que contiene.
En la descripción precedente, hay tres flujos por esclavo. Un maestro que tiene varios esclavos crea un flujo para cada esclavo conectado; cada esclavo tiene sus propios flujos de entrada/salida y SQL.
Leer dos comandos y ejecutarlos se divide en dos tareas independientes. La tarea de leer comandos no se ralentiza si la ejecución es lenta. Por ejemplo, si el servidor esclavo no ha estado en ejecución durante un periodo de tiempo, su flujo de entrada/salida puede tratar rápidamente todos los contenidos del log binario del maestro cuando arranca el esclavo, incluso si el flujo SQL se realentiza mucho. Si el esclavo para antes que el flujo SQL haya ejecutado todos los comandos tratados, el flujo de entrada/salida ha tratado todo de forma que hay una copia de los comandos almacenada localmente en los logs retardados, preparados para ejecutarse la siguiente vez que arranque el esclavo. Esto permite que se purguen los logs binarios del maestro, ya que no necesita esperar que los esclavos traten sus contenidos.
El comando SHOW PROCESSLIST
proporciona
información que le dice qué está ocurriendo en el maestro y en
el esclavo teniendo en cuenta la replicación.
El siguiente ejemplo ilustra cómo los tres flujos se muestran en
SHOW PROCESSLIST
.
En el servidor maestro, la salida de SHOW
PROCESSLIST
tiene este aspecto:
mysql> SHOW PROCESSLIST\G *************************** 1. row *************************** Id: 2 User: root Host: localhost:32931 db: NULL Command: Binlog Dump Time: 94 State: Has sent all binlog to slave; waiting for binlog to be updated Info: NULL
Aquí, el flujo 2 es un flujo de replicación para un esclavo conectado. La información indica que todas las actualizaciones se han enviado al esclavo y que el maestro está esperando más actualizaciones.
En el servidor esclavo, la salida para SHOW
PROCESSLIST
tiene este aspecto:
mysql> SHOW PROCESSLIST\G *************************** 1. row *************************** Id: 10 User: system user Host: db: NULL Command: Connect Time: 11 State: Waiting for master to send event Info: NULL *************************** 2. row *************************** Id: 11 User: system user Host: db: NULL Command: Connect Time: 11 State: Has read all relay log; waiting for the slave I/O thread to update it Info: NULL
Esta información indica que el flujo 10 es el flujo de
entrada/salida que se comunica con el maestro, y el flujo 11 es el
flujo SQL que procesa las actualizaciones almacenadas en los logs
retardados. Cuando se ejecuta SHOW PROCESSLIST
ambos flujos estaban en espera de actualizaciones nuevas.
Tenga en cuenta que los valores en la columna
Time
pueden mostrar la diferencia de tiempo en
la comparación del esclavo con el maestro. Consulte
Sección 6.9, “Preguntas y respuestas sobre replicación”.
La siguiente lista muestra los estados más comunes que puede
ver en la columna State
del flujo maestro
Binlog Dump
. Si no ve ningún flujo
Binlog Dump
en un servidor maestro, esto
significa que la replicación no está corriendo — esto
es, que no hay ningún esclavo conectado.
-
Envío de eventos del binlog al esclavo
Los logs binarios consisten en eventos, donde un evento usualmente es una actualicación más otra información. El flujo lee un evento del log binario y lo envía al esclavo.
-
Finished reading one binlog; switching to next binlog
El flujo ha acabado de leer un fichero de log binario y está abriendo el siguiente para enviar al esclavo.
-
Has sent all binlog to slave; waiting for binlog to be updated
El flujo ha leído todas las actualizaciones destacadas del log binario y las ha enviado al esclavo. El flujo ahora está en espera, esperando nuevos eventos en el log binario que resulten en nuevas actualizaciones en el maestro.
-
Waiting to finalize termination
Estado muy breve que ocurre cuando el flujo está parando.
La siguiente lista muestra los estados más comunes que puede
ver en la columna State
para un flujo de
entrada/salida en el servidor esclavo. Este estado también
aparece en la columna Slave_IO_State
mostrada
por SHOW SLAVE STATUS
. Esto significa que
puede obtener una vista muy buena de lo que ocurre simplemente
usando este comando.
-
Connecting to master
El flujo trata de conectar al maestro.
-
Checking master version
Estado que ocurre brevemente, inmediatamente tras establecer la conexión con el maestro.
-
Registering slave on master
Estado que ocurre brevemente, inmediatamente tras establecer la conexión con el maestro.
-
Requesting binlog dump
Estado que ocurre brevemente, inmediatamente tras establecer la conexión con el maestro. El flujo envía al maestro una petición para los contenidos de su log binario, comenzando por el nombre del log binario pedido y la posición.
-
Waiting to reconnect after a failed binlog dump request
Si la petición del volcado del log binario falla (debido a una desconexión), el flujo pasa a este estado mientras duerme, luego trata de reconectar periódicamente. El intervalo entre reintentos puede especificarse usando la opción
--master-connect-retry
. -
Reconnecting after a failed binlog dump request
El flujo está tratando de reconectar con el maestro.
-
Waiting for master to send event
El flujo ha conectado con el maestro y está esperando a que lleguen los eventos del log binario. Esto puede tardar un tiempo largo si el maestro está en espera. Si la espera dura
slave_read_timeout
segundos, se produce un timeout. En este punto, el flujo considera la conexión rota e intenta reconectar. -
Queueing master event to the relay log
El flujo ha leído un evento y lo está copiando en el log retardado para que el flujo SQL pueda procesarlo.
-
Waiting to reconnect after a failed master event read
Un error ocurre durante la lectura (debido a una desconexión). El flujo duerme durante
master-connect-retry
segundos antes de intentar reconectar. -
Reconnecting after a failed master event read
El flujo trata de reconectar con el maestro. Cuando la conexión se vuelve a establecer, el estado pasa a
Waiting for master to send event
. -
Waiting for the slave SQL thread to free enough relay log space
Está usando un valor
relay_log_space_limit
distinto a cero, y el log retardado ha crecido hasta que su tamaño combinado escede este valor. El flujo de entrada/salida está en espera hasta que el flujo SQL libera suficiente espacio procesando los contenidos del log retardado de forma que pueda leer algunos ficheros de log retardado. -
Waiting for slave mutex on exit
Estado que ocurre brevemente al parar el flujo.
La siguiente lista muestra los estados más comunes que puede
ver en la columna State
para el flujo SQL del
servidor esclavo:
-
Reading event from the relay log
El flujo ha leído un evente del log retardado para que el evento pueda ser procesado.
-
Has read all relay log; waiting for the slave I/O thread to update it
El flujo ha procesado todos los eventos en los ficheros de log retardado y está esperando que el flujo de entrada/salida escriba nuevos eventos en el log retardado.
-
Waiting for slave mutex on exit
Estado breve que ocurre cuando el flujo está parándose.
La columna State
para el flujo de
entrada/salida también puede mostrar el texto de un comando.
Esto indica que el flujo ha leído un evento del log retardado,
ha extraído el comando de él y lo ha ejecutado.
Por defecto, los logs retardados se nombran usando nombres de
ficheros de la forma
host_name
-relay-bin.nnnnnn
,
donde host_name
es el nombre del
servidor esclavo y nnnnnn
es un
número de secuencia. Los ficheros de logs retardados sucesivos
en MySQL 5.0 se crean usando números de secuencia sucesivos,
comenzando a partir de 000001
. El esclavo
guarda los logs retardados en unso en un fichero índice. El
nombre del índice del log retardado por defecto es
host_name
-relay-bin.index.
Por defecto, estos ficheros se crean en el directorio de datos
del esclavo. Por defecto los nombres de fichero pueden cambiarse
con las opciones de servidor --relay-log
y
--relay-log-index
. Consulte
Sección 6.8, “Opciones de arranque de replicación”.
Los logs retardados tienen el mismo formato que los logs
binarios, y pueden leerse usando mysqlbinlog.
Un log retardado se borra automáticamente por el flujo SQL en
cuanto ha ejecutado todos sus eventos y no los necesita más. No
hay mecanismo explícito para borrar logs retardados, ya que el
flujo SQL se encarga de ello. Sin embargo, FLUSH
LOGS
rota los logs retardados, lo que influye cuando
el flujo SQL los borra.
Un log retardado se crea bajo las siguientes condiciones:
-
En MySQL 5.0, se crea un nuevo log retardado cada vez que arranca el flujo de entrada/salida.
-
Cuando los logs se vuelcan; por ejemplo, con
FLUSH LOGS
o mysqladmin flush-logs. -
Cuando el tamaño del log retardado actual es demasiado grande. El significado de "muy grande" se determina así:
-
max_relay_log_size
, simax_relay_log_size
> 0 -
max_binlog_size
, simax_relay_log_size
= 0
-
Un servidor esclavo de replicación crea dos pequeños ficheros
adicionales en el directorio de datos. Estos ficheros
de estado se llaman master.info
y relay-log.info
por defecto. Contienen
información como la mostrada en la salida del comando
SHOW SLAVE STATUS
(consulte
Sección 13.6.2, “Sentencias SQL para el control de servidores esclavos” para una descripción de
este comando). Como ficheros en disco, sobreviven una parada del
servidor esclavo. La siguiente vez que arranca el servidor
esclavo, lee estos ficheros para determinar hasta dónde ha
procesado los logs binarios del maestro y sus propios logs
retardados.
El fichero master.info
lo actualiza el
flujo de entrada/salida. En MySQL 5.0, la correspondencia entre
las líneas en el fichero y las columnas mostradas
porSHOW SLAVE STATUS
es la siguiente:
Línea | Descripción |
1 | Número de líneas en el fichero |
2 |
Master_Log_File
|
3 |
Read_Master_Log_Pos
|
4 |
Master_Host
|
5 |
Master_User
|
6 | Contraseña (no mostrada por SHOW SLAVE STATUS ) |
7 |
Master_Port
|
8 |
Connect_Retry
|
9 |
Master_SSL_Allowed
|
10 |
Master_SSL_CA_File
|
11 |
Master_SSL_CA_Path
|
12 |
Master_SSL_Cert
|
13 |
Master_SSL_Cipher
|
14 |
Master_SSL_Key
|
El fichero relay-log.info
lo actualiza el
flujo SQL. La correspondencia entre las líneas en el fichero y
las columnas mostradas por SHOW SLAVE STATUS
se muestran aquí:
Línea | Descripción |
1 |
Relay_Log_File
|
2 |
Relay_Log_Pos
|
3 |
Relay_Master_Log_File
|
4 |
Exec_Master_Log_Pos
|
Cuando hace una copia de seguridad de los datos del esclavo,
debe incluir también estos dos ficheros, junto con sus ficheros
de log retardado. Son necesarios para reanudar la replicación
tras restaurar los datos del esclavo. Si pierde los logs
retardados pero todavía tiene el fichero
relay-log.info
, puede examinarlo para
determinar hasta dónde ha ejecutado el flujo SQL en el log
binario del maestro. Luego puede usar CHANGE MASTER
TO
con las opciones MASTER_LOG_FILE
y MASTER_LOG_POS
para decirle al esclavo que
vuelva a leer los logs binarios a partir de ese punto. Por
supuesto, esto requiere que los logs binarios existan en el
servidor maestro.
Si su esclavo está sujeto a replicación de comandos
LOAD DATA INFILE
, también debe incluir en
la copia de seguridad cualquier fichero
SQL_LOAD-*
que existe en el directorio que
el esclavo usa para este propósito. El esclavo necesita estos
ficheros para reanudar replicación de cualquier operación
LOAD DATA INFILE
interrumpida. La
localización del directorio se especifica usando la opción
--slave-load-tmpdir
. Si valor por defecto,
si no se especifica, es el valor de la variable
tmpdir
.