Bienvenidos sean a este post, hoy veremos como hacer varios chequeos sobre las replicaciones.
La mejor forma de asegurarnos que todos los datos en el amo y los esclavos son exactamente iguales es con el calculo de los checksums, este checksum puede ser usado en dos situaciones:
- Despues de cargar datos en un esclavo, para asegurarnos que todo se hizo apropiadamente
- En servidores activos o cuando sospechamos que en una replicacion ocurrio un error
El segundo caso es mas complicado porque durante la ejecucion normal los esclavos pueden demorarse con respecto a sus amos, como vimos en este post, sin embargo existe una herramienta que ejecuta automaticamente este chequeo, esperando hasta que los esclavos alcancen un cierto evento de log binario, hay al menos tres metodos para hacer esto:
- Usando la instruccion CHECKSUM TABLE
- Usando la herramienta de Percona llamada pt-table-checksum
- Calculando un checksum de los archivos fisicos (solo para backups fisicos)
Aunque en algunas ocasiones solo queremos chequear una pequeña porcion de los datos en lugar de todas las tablas, una opcion es hacer una serie de queries y hacer un checksum de los resultados obtenidos.
Hablemos primero sobre la instruccion CHECKSUM TABLE, esta nos devuelve el checksum de una o mas tablas, veamos su sintaxis:
CHECKSUM TABLE <lista_tablas> [ QUICK | EXTENDED ]
El unico dato obligatorio es lista_tablas donde debemos pasar uno o mas tablas, los otros son opcionales, veamos el primero:
- QUICK, solo trabaja con las tablas de MyIsam y Aria, estos motores calculan un checksum para las tablas que han sido creadas con la opcion CHECKSUM o TABLE_CHECKSUM con el valor de 1, la opcion nos devolvera este valor
- EXTENDED, calcula un checksum de las tablas leyendo todas las filas, puede ser muy lento
Si no se especifica alguna opcion se utiliza a QUICK, algunos motores no soportan esta instruccion por lo tanto devuelven un valor NULL, en cambio si el valor es 0 significa que la tabla esta vacia, veamos un ejemplo:
MariaDB [(none)]> checksum tables base1.tabla3, base1.tabla4, base1.empresaA;
+----------------+------------+
| Table | Checksum |
+----------------+------------+
| base1.tabla3 | 3235112450 |
| base1.tabla4 | 0 |
| base1.empresaA | 4048581935 |
+----------------+------------+
3 rows in set (0.003 sec)
MariaDB [(none)]>
Otra opcion que podemos usar es pt-table-checksum y esta incluida en la suite de herramientas de Percona, su proposito principal es devolver un checksum confiable y el numero de filas de cada tabla, esto lo hace sin frenar demasiado al servidor inclusive con bases grandes, como dijimos esta calcula el checksum de cada tabla, para ello cada tabla no es leida por un query que lo bloquee por mucho tiempo, sino que usa pequeños queries relativamente pequeños para dividir tablas en pequeños conjuntos, basado en los tiempos de respuesta del servidor la herramienta compone queries que no son demasiado pesados para su carga de trabajo actual, ademas establece a @@innodb_lock_wait a un segundo en el nivel de sesion, asi que se desconecta cuando una tabla es bloqueada por otra sesion por un tiempo largo.
Esta herramienta de manera predeterminada detecta si los esclavos estan corriendo y en caso de ser verdadero se conecta a ellos, esto es porque la herramienta corre cada cierto tiempo un SHOW PROCESSLIST para monitorear a los esclavos conectados, si hay esclavos con demoras o se desconectan la herramienta espera a que se recuperen, despues que se calculo el checksum de una tabla esta procede a conectarse a los esclavos y calcula los mismos checksum para verificar que sean identicos, luego nos muestra los checksums y el numero de filas, y no comenzara hasta que el trabajo fue finalizado, si bien tiene una buena tolerancia a las fallas, este puede tener un error que no pueda manejar y hace que se detenga, si ocurre esto podemos usar la opcion –resume al volverlo ejecutar para que todo lo que hizo no se pierda.
Tambien podemos calcular el checksum de los archivos de un backup fisico antes de iniciar un esclavo, para esto podemos usar la herramienta md5sum que usualmente viene incluida en Linux, esto nos devolvera el valor de uno o mas archivos, veamos un ejemplo:
root@this:/usr/local/mysql/data/open_fatture# md5sum --binary fornitori.frm fornitori.ibd
4582a1f51dea7980cb739b1a055d3ba7 *fornitori.frm
de8ffec76f0303d0c129a536e015e14d *fornitori.ibd
La opcion –binary informa a md5sum que los archivos especificados contienen datos binarios de manera predeterminada, si usamos a –text trata el contenido de los archivos como texto, este ultimo es mas util para cuando las tablas son de tipo CONNECT o CSV y archivos de log.
Por ultimo tambien podemos hacer checksum de queries, por ejemplo podemos hacer un query que solo verifica los ultimos ingresos o filas modificadas recientemente, podemos usar este query desde el cliente y en conjunto con md5sum podemos verificar que no ocurrio ningun error en la replicacion, veamos un ejemplo:
root@this:/usr/local/mysql# bin/mysql -uroot -proot --execute="SELECT * FROM gest_pescara.orders WHERE o_time > NOW() - INTERVAL 2 DAY;" | md5sum
a50786099fb580c0dcb564323103bee2 -
En resumen, hoy hemos visto como chequear las replicas, ya sea desde una instruccion como CHECKSUM TABLES, pasando por una herramienta llamada pt-table-checksum y por ultimo por medio de md5sum que es un comando de Linux, espero les haya sido de utilidad sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.


Donación
Es para mantenimento del sitio, gracias!
$1.50
