Cree un esclavo MySQL de otro esclavo, pero apúntelo al maestro

8

Problema

Tengo la configuración de replicación MySQL entre 2 servidores, maestro ( A ) y esclavo ( B ). Necesito agregar un nuevo esclavo a la mezcla ( C ). Quiero que este esclavo obtenga sus actualizaciones directamente del maestro, no quiero la replicación en cadena del esclavo. Sin embargo, el maestro está "activo", generalmente uso Xtrabackup para crear una copia de seguridad completa del maestro, pero esto lo bloqueará durante unos 10 minutos, ya que la base de datos tiene un tamaño de alrededor de 20 GB.

Solución posible

ENJUAGUE LAS TABLAS CON READ LOCK en el esclavo B , use SHOW SLAVE STATUS en B , escriba binlog y posición. Luego haga una copia de seguridad de la base de datos con Xtrabackup, envíe la copia de seguridad a C y úsela para crear el esclavo, y configure la replicación para que apunte a A con la posición binlog que acabo de escribir.

Pregunta

¿Hay alguna forma mejor que no requiera que bloquee B por tanto tiempo? ¿O algo que se automatice más fácilmente?

Alex Recarey
fuente

Respuestas:

20

Hola, conozco un método loco para crear un esclavo sin aumentar ninguna operación de maestro (ServerA) o esclavo (ServerB)

Paso 1) Configurar un nuevo servidor (ServerC)

Paso 2) En ServerC, instale MySQL (misma versión que ServerB)

Paso 3) En ServerC, servicio mysql stop

Paso 4) Copie /etc/my.cnf de ServerB a ServerC

Paso 5) En ServerC, cambie server_id a un valor diferente de ServerA y ServerB

Paso 6) rsync / var / lib / mysql en ServerB a ServerC

Paso 7) Cuando se complete rsync, ejecute "STOP SLAVE"; en ServerB

Paso 8) rsync / var / lib / mysql en ServerB a ServerC

Paso 9) En el ServidorB, ejecuta "INICIAR ESCLAVO";

Paso 10) En ServerC, inicie el servicio mysql

Paso 11) En ServerC, ejecuta "INICIAR ESCLAVO"; (Haga esto si skip-slave-start está en /etc/my.cnf)

Darle una oportunidad !!!

Por cierto, tengo la máxima confianza de que esto funcionará porque acabo de hacer esto para el cliente en los últimos 2 días. El cliente tenía 2,7 TB de datos en un esclavo. Me conecté a otro servidor mientras el esclavo todavía estaba activo. rsync tomó como 11 horas. Entonces corrí STOP SLAVE; en el primer esclavo y ejecutó rsync nuevamente. Eso tomó otra hora. Luego realicé el paso anterior y todo está hecho.

RolandoMySQLDBA
fuente
Jajaja Iba a comentar sobre el OP para utilizar su sugerencia, y bajo y he aquí su Sr. Rolando el DBA "Fridge". Rolando golpeó el clavo en la cabeza y este es el método preferido sin tener que detener a ningún Maestro y sin detener a tu esclavo B por un período demasiado largo.
coderwhiz
2
Sé que esta es una publicación bastante antigua, pero alguien me preguntó sobre este método. Esto funciona bien suponiendo que el nuevo esclavo y el viejo esclavo sean EXACTAMENTE iguales. Si el nuevo esclavo es un arco diferente, no funcionará (iirc). Y estoy casi seguro de que si está utilizando espacios de tabla innodb por archivo, no funcionará. La solución más segura es hacer una copia de seguridad completa del maestro si hay alguna duda.
lusis
@lusis: tu comentario es muy cierto. En un mundo perfecto, que la mayoría de los clientes mysql imaginan que tienen, quieren que esto se haga ya que todas las especificaciones de hardware son idénticas. En configuraciones donde el hardware difiere, mysqldumps y reload son las más seguras. Debes enviar tu comentario como respuesta. Yo lo votaría. ¡A ver si otros lo harán!
RolandoMySQLDBA
Seguí el procedimiento. Después de iniciar mysql nuevamente en SlaveC, aparece un error que dice "Su base de datos puede estar dañada o puede haber copiado el espacio de tabla de InnoDB pero no los archivos de registro de InnoDB". Y en start slave(SlaveC) me aparece "Error al abrir el registro de retransmisión '/var/log/mysql/mysql-relay-bin.001603"
Hussain Tamboli
De esta manera, puede perder datos fácilmente en ServerC.
akuzminsky
3

Cuando agregamos un esclavo a nuestra mezcla, hacemos lo siguiente:

  • desconectar a un esclavo
  • copie el directorio de datos de la base de datos en el nuevo esclavo (los ajustes del esclavo - posición del registro, host maestro, etc. - serán correctos ya que copiamos de un esclavo)
  • poner en marcha el esclavo original
  • modificar id-servidor en my.cnf para el nuevo esclavo
  • comenzar nuevo esclavo
sreimer
fuente
Solo tuve que hacer esto esta tarde
sreimer
1

Hice lo que @RolandoMySQLDBA sugiere pero también agregué unos pasos de 6 ' y 8' (esto resuelve lo que comenta @Hussain Tamboli ):

Paso 1) Configurar un nuevo servidor (ServerC)

Paso 2) En ServerC, instale MySQL (misma versión que ServerB)

Paso 3) En ServerC, servicio mysql stop

Paso 4) Copie /etc/my.cnf de ServerB a ServerC

Paso 5) En ServerC, cambie server_id a un valor diferente de ServerA y ServerB

Paso 6) rsync / var / lib / mysql en ServerB a ServerC

Paso 6 ') rsync / var / log / mysql en ServerB to ServerC

Paso 7) Cuando se complete rsync, ejecute "STOP SLAVE"; en ServerB

Paso 8) rsync / var / lib / mysql en ServerB a ServerC

Paso 8 ') rsync / var / log / mysql en ServerB to ServerC

Paso 9) En el ServidorB, ejecuta "INICIAR ESCLAVO";

Paso 10) En ServerC, inicie el servicio mysql

Paso 11) En ServerC, ejecuta "INICIAR ESCLAVO"; (Haga esto si skip-slave-start está en /etc/my.cnf)

Pere Barceló
fuente
Su respuesta no es completa y hace referencia a otras cosas. no es un foro, mejora tu respuesta para que se complete por sí solo.
asdmin
0

Tiene la opción "CARGAR DATOS DEL MAESTRO", pero eso no se recomienda.

¿Hace copias de seguridad nocturnas / semanales en su sistema? Si es así, también tenga en cuenta la posición con su copia de seguridad, entonces puede usar esa copia de seguridad para configurar un nuevo esclavo. Simplemente déjelo en paz y permita que se actualice por un tiempo.

jishi
fuente
0

Intenté las respuestas de Rolando y funcionó bien, pero comencé a reproducir desde el principio y tuve que agregar más código de error para omitir (sé que no es recomendable, pero sé lo que estaba haciendo).

Una vez hecho el paso 7, revisé el registro mysql y anoté el nombre y la posición del registro bin y continué hasta el noveno paso. Antes del décimo paso, acabo de ejecutar change masterel archivo de registro y la posición del registro. Y continuó desde el paso 11. Todo me parece bien.

Espiga
fuente
-2

Debe cambiar el uuid de esclavo en auto.cnf para que el maestro pueda diferenciar a los dos esclavos.

Nazgul
fuente