1. Conocimientos relacionados con MHA
1.1 Qué es MHA
MHA (MasterHigh Availability) es un excelente conjunto de software para conmutación por error y replicación maestro-esclavo en un entorno MySQL de alta disponibilidad.
La aparición de MHA es para resolver el problema del punto único de falla de MySQL.
Durante el proceso de conmutación por error de MySQL, MHA puede completar automáticamente la operación de conmutación por error en 0-30 segundos.
MHA puede garantizar la mayor coherencia de los datos durante el proceso de conmutación por error para lograr una alta disponibilidad en el verdadero sentido.
1.2 Composición de MHA
1) Nodo MHA (nodo de datos)
MHA Node se ejecuta en cada servidor MySQL.
2) MHA Manager (nodo de gestión)
MHA Manager se puede implementar en una máquina independiente para administrar múltiples clústeres maestro-esclavo; también se puede implementar en un nodo esclavo.
MHA Manager detectará regularmente el nodo maestro en el clúster. Cuando el maestro falla, puede promocionar automáticamente al esclavo con los datos más recientes como el nuevo maestro y luego volver a apuntar a todos los demás esclavos al nuevo maestro. Todo el proceso de conmutación por error es completamente transparente para la aplicación.
El principio de funcionamiento de MHA se resume de la siguiente manera:
MHA Manager detectará periódicamente el nodo maestro en el clúster
Cuando el maestro falle, guarde los eventos de registro binario (binlog events) del maestro fallado;
Identificar el esclavo con la última actualización;
Aplicar registros de relés diferenciales a otros esclavos;
Aplicar eventos de registro binario (binlog events) guardados desde el maestro;
Promover un esclavo a un nuevo maestro y hacer que otros esclavos se conecten al nuevo maestro para la replicación;
1.3 Características de MHA
En el proceso de conmutación por error automática, MHA intenta guardar el registro binario del servidor maestro de tiempo de inactividad, para garantizar que los datos no se pierdan en la mayor medida posible.
El uso de la replicación semisincrónica puede reducir en gran medida el riesgo de pérdida de datos.Si solo un esclavo ha recibido el registro binario más reciente, MHA puede aplicar el registro binario más reciente a todos los demás servidores esclavos, lo que garantiza la coherencia de los datos de todos los nodos.
En la actualidad, MHA soporta una arquitectura maestra y múltiples esclavos, con al menos tres servidores, es decir, un maestro y dos esclavos.
2. El diseño experimental de la implementación de un maestro y dos esclavos de MHA
cumple con los requisitos: crear un clúster mysql de replicación de lectura y escritura de alta disponibilidad con un maestro y dos esclavos. Las actualizaciones de datos completas reemplazarán el servidor maestro y ocuparán el VIP, para garantizar un funcionamiento normal.
componentes experimentales
Operación específica del experimento, paso
1: Configurar la replicación maestro-esclavo ( 1 ) Modificar el nombre de host
del servidor de nodos mysql # Nodo Slave2 ## hostnamectl set-hostname mysql3 su ##manager## hostnamectl set-hostname manager su
(2) Agregue la relación de mapeo mysql maestro-esclavo
y agregue los tres hosts:
vim /etc/hosts
192.168.73.105 mysql1
192.168.73.106 mysql2
192.168.73.107 mysql3
(3) Modifique el archivo de configuración principal de Mysql /etc/my.cnf
Nota:
Nodo maestro, abra el registro binario.
Nodos Slave1, Slave2, abra el registro binario y el registro de retransmisión.
##Nodo maestro##
vim /etc/my.cnf
[mysqld]
server-id = 1
log-bin = master-bin #Abrir el registro binario, especificar la ubicación de almacenamiento
log-slave-updates = true
#Permitir que el esclavo se escriba a sí mismo al copiar datos desde el maestro En el registro binario de
systemctl
, reinicie mysqld #restart mysql
##
Slave1 node##
vim /etc/my.cnf
[mysqld]
server-id = 2 #El server-id de los tres servidores no puede ser el mismo
log-bin = master-bin
relay-log = relay-log-bin
relay-log-index = esclavo-relé -bin.index
systemctl
reiniciar mysqld
##
Nodo esclavo2##
vim /etc/my.cnf
[mysqld]
server-id = 3 #El server-id de los tres servidores no puede ser el mismo
log-bin = master-bin
relay-log = relay-log-bin
relay-log-index = slave-relay -bin.index
systemctl
restart mysqld #Restart mysql
(4) Crear un enlace suave en el servidor de nodos mysql
Se crean los tres servidores de nodos mysql:
* a 'mha'@'mysql2' identificado por 'manager'; otorgar todos los privilegios en *.* a 'mha'@'mysql3' identificado por 'manager';
Privilegios de vaciado
(6) Configurar la sincronización maestro-esclavo
Ver archivos binarios y puntos de sincronización (es decir, compensaciones) en el nodo maestro y realizar operaciones de sincronización en los nodos Esclavo1 y Esclavo2.
##(1) Ver el archivo binario y el punto de sincronización (es decir, el desplazamiento) en el nodo maestro ##
mostrar el estado del maestro;
#Razones posibles generales para "Slave_IO_Running: No":
1. No se puede acceder a la red
2. Hay un problema con la configuración de my.cnf (se repite la identificación del servidor)
3. La contraseña, el nombre del archivo y el desplazamiento pos son incorrectos
4. El cortafuegos no está cerrado.
##Realizar una operación síncrona en los nodos Slave1 y Slave2##
cambiar maestro a master_host='192.168.73.105', master_user='myslave', master_password='123123',
master_log_file='master-bin.000006', master_log_pos=
154
; esclavo; #Iniciar sincronización, si hay un error, ejecutar reset esclavo;
##
Verificar el estado del nodo en Slave1 y Slave2##
mostrar el estado del esclavo\G
##Las dos bibliotecas esclavas deben configurarse en modo de solo lectura##
establecer global read_only=1;
##
Insertar datos en la biblioteca principal maestra, probar la sincronización de la base de datos##
mysql> use db_test
mysql> crear información de tabla (id int ,name char (10));
mysql> insertar en valores de información (1, 'datos de mysql1');
#Verificar
si la sincronización es exitosa desde la base de datos
Paso 2: Configurar MHA
Nota: La instalación de origen de epel aquí no se puede instalar desde la fuente local La fuente local de centos7 no está disponible, debe modificarse a una fuente en línea para la instalación
1) Instale el software MHA en todos los servidores
## (1) Instale el entorno dependiente de MHA en todos los servidores, primero instale el origen de epel ##
yum install epel-release --nogpgcheck -y
#Instale
el entorno dependiente de MHA
yum install -y perl- DBD-MySQL \
perl-Config-Tiny \
perl-Log-Dispatch \
perl-Parallel-ForkManager \
perl-ExtUtils-CBuilder \
perl-ExtUtils-MakeMaker \
perl-CPAN
##
(2) Para instalar el paquete MHA , primero debe instalar los componentes del nodo en todos los servidores ##
#Cargar el paquete de instalación en el directorio /opt/, descomprimir e instalar los componentes del nodo##
cd /opt
tar zxvf mha4mysql-node-0.57.tar.gz
cd mha4mysql-node- 0.57
perl Makefile.PL
make && make install
##
(3) Finalmente, instale el componente administrador en el nodo administrador MHA## (el componente administrador depende del componente nodo)
cd /opt/
tar zxvf mha4mysql-manager-0.57.tar.gz
cd mha4mysql-manager-0.57
perl Makefile.PL
hacer && hacer instalar --------------------- -
Las líneas punteadas son comentarios -------------------------------------------- ------ #manager Después de instalar el componente, se generarán varias herramientas en /usr/local/bin, incluidas principalmente las siguientes: masterha_check_ssh #Verificar el estado de configuración SSH de MHA masterha_check_repl #Verificar el estado de replicación de MySQL masterha_manger #Iniciar el script del administrador masterha_check_status #Detectar el estado actual de ejecución de MHA masterha_master_monitor #Detectar si el maestro está inactivo masterha_master_switch #Controlar la conmutación por error (automática o manual) masterha_conf_host #Agregar o eliminar información del servidor configurado masterha_stop #Cerrar administrador
Después de instalar el componente #node, se generarán varios scripts en /usr/local/bin (estas herramientas generalmente se activan mediante scripts de MHAManager sin operación manual), principalmente de la siguiente manera: save_binary_logs #Guarde y copie el registro binario del maestro apply_diff_relay_logs #Identificar
la
diferencia de eventos de registro de retransmisión y aplicar la diferencia de eventos a otros esclavos
filter_mysqlbinlog #Eliminar eventos de ROLLBACK innecesarios (MHA ya no usa esta herramienta)
purge_relay_logs #Borrar registros de retransmisión (no bloquea subprocesos de SQL)
(2) Configure la autenticación sin contraseña en todos los servidores
## (1) Configure la autenticación sin contraseña para todos los nodos de la base de datos en el nodo administrador
ssh-keygen -t rsa #Presione la tecla Intro hasta el final para generar una clave. "-t rsa" especifica el tipo de clave. ssh-copy-id 192.168.73.105 #Pase la clave pública a todos los nodos de la base de datos
para formar una conexión sin contraseña para iniciar sesión en mysql1 Autenticación sin contraseña de los nodos de la base de datos mysql2 y mysql3 ssh-keygen -t rsa ssh-copy-id 192.168.73.106 #Pase la clave pública a dos nodos esclavos para formar una conexión sin contraseña para iniciar sesión ssh-copy-id 192.168. 73.107 ## (3) Configurar la autenticación sin contraseña en mysql2 para los nodos de base de datos mysql1 y mysql3 ssh-keygen -t rsa ssh-copy-id 192.168.73.105 ssh-copy-id 192.168.73.107 ## (4) Configurar en mysql3 para Autenticación sin contraseña para nodos de base de datos mysql1 y mysql2 ssh-keygen -t rsa
ssh-copia-id 192.168.73.105
ssh-copia-id 192.168.73.106
(3) Configure MHA en el nodo administrador
## (1) Copie los scripts relevantes en el directorio /usr/local/bin en el nodo administrador
cp -rp /opt/mha4mysql-manager-0.57/samples/scripts /usr/local /bin
#Después de copiar, habrá cuatro archivos ejecutables
ll /usr/local/bin/scripts/
------------
La línea punteada es un comentario --------- ----- --------------------------------------------
master_ip_failover #Script de administración VIP al cambiar automáticamente
master_ip_online_change #Script de administración de VIP al cambiar
power_manager en línea #Script para apagar el host después de que ocurra una falla
send_report #Script para enviar alarma después de la conmutación por error
---------------- ------ -------------------------------------------- ------ -------- ##
(2) Copie el script de administración VIP mencionado anteriormente durante el cambio automático al directorio /usr/local/bin, aquí use el script master_ip_failover para administrar VIP y conmutación por error
cp /usr/local/bin/scripts/master_ip_failover /usr/local/bin ##
(3) Modifique el contenido de la siguiente manera: (Elimine el contenido original, copie directamente y modifique los parámetros relacionados con vip. Puede ingresar: establecer pegar antes de copiar Resolver vim pegar fuera de servicio) vim /usr/local/bin/master_ip_failover #!/usr/bin/env perl use strict; use warnings FATAL => 'all'; use Getopt::Long; my ( $ comando, $ssh_user, $orig_master_host, $orig_master_ip, $orig_master_port, $new_master_host, $new_master_ip, $new_master_port ); ######################### ## ## Agregar sección de contenido ####################################### mi $vip = '192.168.73.66'; #Especifique la dirección de vip
my $brdc = '192.168.73.255'; #Especifique la dirección de transmisión de vip
my $ifdev = 'ens33'; #Especifique la tarjeta de red vinculada a vip
my $key = '1'; #Especifique el número de serie de la red virtual tarjeta vinculada a vip
my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip"; #Representa el valor de esta variable ifconfig ens33:1 192.168.72.100 my
$ssh_stop_vip = "/sbin/ifconfig ens33:$key down" ; #Representa el valor de esta variable For ifconfig ens33:1 192.168.72.100 down
my $exit_code = 0; #Especifique el código de estado de salida como 0
#my $ssh_start_vip = "/usr/sbin/ip addr add $vip/24 brd $ brdc dev $ifdev etiqueta $ifdev: $clave;/usr/sbin/arping -q -A -c 1 -I $ifdev $vip;iptables -F;"; #my $ssh_stop_vip = "/usr/sbin/ip
addr del $vip/24 dev $ifdev etiqueta $ifdev:$clave";
############################################## ##############################
ObtenerOpciones
(
'comando=s' => $comando,
'ssh_user=s' => $ssh_user,
'orig_master_host=s' => $orig_master_host,
'orig_master_ip=s' => $orig_master_ip,
'orig_master_port=i' => $orig_master_port,
'new_master_host=s' => $new_master_host,
'new_master_ip=s' => $nueva_ip_maestra,
'nueva_puerto_maestra=i' => $nueva_puerto_maestra,
);
exit
&main();
sub
main { print "\n\nIN SCRIPT TEST====$ssh_stop_vip==$ssh_start_vip===\n\n"; if ($command eq "stop" | | $command eq "stopssh" ) {
mi $exit_code = 1;
eval { print "Deshabilitar el VIP en el maestro antiguo: $orig_master_host \n"; &stop_vip(); $codigo_salida = 0; }; if ($@) { advertir "Error recibido:
print "Comprobando el estado del script... OK \n";
salida 0;
}
más { &uso(); salida 1; } } sub start_vip() { `ssh $ssh_user@$new_master_host " $ssh_start_vip "`; } ## Una simple llamada al sistema que deshabilita el VIP en el old_master sub stop_vip() { `ssh $ssh_user@$orig_master_host " $ssh_stop_vip "`; } sub uso { print "Uso: master_ip_failover --command=start|stop|stopssh|status --orig_master_host=host --orig_master_ip=ip --orig_master_port=puerto --new_master_host=host --new_master_ip=ip --new_master_port= puerto\n"; }
(4) El nodo administrador edita el archivo de configuración y administra el servidor de nodos mysql
mkdir /etc/masterha
cp /opt/mha4mysql-manager-0.57/samples/conf/app1.cnf /etc/masterha/ #copiar archivo de configuración
vim
/ etc/masterha /app1.cnf #Elimine el contenido original, copie y modifique directamente la dirección IP del servidor de nodo
[predeterminado del servidor]
manager_log=/var/log/masterha/app1/manager.log
manager_workdir=/var/log/masterha /app1
master_binlog_dir=/usr/local/mysql/data
master_ip_failover_script=/usr/local/bin/master_ip_failover
master_ip_online_change_script=/usr/local/bin/master_ip_online_change
user=mha
contraseña=administrador
ping_interval=1
remote_workdir=/tmp
repl_password=123123
repl_user= mi esclava
second_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.73.106
-s 192.168.73.107
shutdown_script=""
ssh_user=usuario raíz
=mha
[
servidor1]
hostname=192.168.73.105
puerto=3306
[
servidor2]
candidato_maestro=1
check_repl_delay =0
nombre de host=192.168.73.106
puerto=3306
[
servidor3]
nombre de host=192.168.73.107
puerto=3306
[predeterminado del servidor]
manager_log=/var/log/masterha/app1/manager.log #registro del administrador manager_workdir
=/var/log/masterha/app1 #directorio de trabajo del administrador
master_binlog_dir=/usr/local/mysql/data/ #master save binlog ubicación, la ruta aquí debe ser coherente con la ruta del binlog configurado en el maestro, de modo que MHA pueda encontrar
master_ip_failover_script=/usr/local/bin/master_ip_failover
#Configurar el script de conmutación para la conmutación por error automática, que es el script anterior
master_ip_online_change_script= /usr /local/bin/master_ip_online_change
#Establecer el script de cambio para el cambio manual
usuario=mha #Establecer el usuario de mysql, el usuario creado al autorizar al administrador
contraseña=administrador #Establecer la contraseña del usuario de mysql, que es la contraseña utilizada para cree el usuario de monitoreo en el artículo anterior
ping_interval=1
#Establezca el intervalo de tiempo para monitorear la biblioteca principal y enviar paquetes de ping, el valor predeterminado es de 3 segundos y la conmutación por error se realizará automáticamente cuando no haya respuesta después de tres intentos remote_workdir=/
tmp #Establecer la ubicación de almacenamiento binlog cuando el mysql remoto cambia
repl_password=123123 #Establecer la contraseña del usuario replicado (el usuario y la contraseña creados durante la autorización de sincronización maestro-esclavo)
repl_user=myslave #Establecer el usuario del usuario replicado
report_script=/usr/local/send_report #Establecer el script del alarma enviada después de que se produzca el cambio
.
host después de que ocurra una falla (la función principal de este script es apagar el host para evitar que ocurra Split brain, no se usa aquí, puede usar power_manager que viene con el sistema) ssh_user=root #Establezca el nombre de usuario de inicio de sesión
de ssh
[
servidor1] #master
hostname=192.168.73.105
puerto=3306
[
servidor2] #slave1
hostname=192.168.73.106
puerto=3306
candidato_maestro=1
#Establecer como maestro candidato Después de configurar este parámetro, la biblioteca esclava será promovida a biblioteca maestra después de que se produzca el cambio maestro-esclavo, incluso si la biblioteca esclava no es la última
esclava
check_repl_delay=0
#De manera predeterminada, si un esclavo va a la zaga del maestro por más de 100 millones de registros de retransmisión, MHA no seleccionará al esclavo como nuevo maestro, porque lleva mucho tiempo restaurar el esclavo; configurando check_repl_delay=0, MHA desencadena el cambio e ignorará el retraso de replicación al seleccionar un nuevo maestro. Este parámetro es muy útil para hosts con candidato_maestro=1, porque el maestro candidato debe ser el nuevo maestro durante el proceso de cambio[servidor3] # slave2 hostname =
192.168.73.107 puerto=3306
(5) La primera configuración necesita abrir manualmente la IP virtual en el nodo maestro
/sbin/ifconfig ens33:1 192.168.73.66/24
(6) Pruebe la autenticación sin contraseña ssh en el nodo administrador
masterha_check_ssh -conf=/etc/masterha/app1.cnf
(7) Pruebe la conexión mysql maestro-esclavo en el nodo administrador
masterha_check_repl -conf=/etc/masterha/app1.cnf
Pruebe la conexión maestro-esclavo de mysql en el nodo administrador, y las palabras MySQL Replication Health is OK aparecen al final, lo que indica que es normal
(8) Inicie MHA nohup en el nodo administrador
masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/masterha/app1/manager.log 2>&1 & -------------------------------
Las siguientes son notas------------ - ------------------------------------------------- remove_dead_master_conf #Este parámetro significa que cuando ocurra el cambio maestro-esclavo, la ip de la antigua biblioteca maestra se eliminará del archivo de configuración. --manger_log #Ubicación de almacenamiento de registro. --ignore_last_failover #De forma predeterminada, si MHA detecta un tiempo de inactividad continuo y el intervalo entre dos tiempos de inactividad es inferior a 8 horas, no se realizará la conmutación por error. El motivo de esta limitación es evitar el efecto ping-pong (cambiar de un lado a otro conduce a cerebro dividido). Este parámetro significa ignorar el archivo generado por el último interruptor de activación de MHA. De forma predeterminada, después de que se produzca el cambio de MHA, se registrará en el archivo de registro app1.failover.complete. Si se encuentra que el archivo existe en el directorio cuando se el cambio se vuelve a hacer la próxima vez, no se permitirá activar el cambio, a menos que el archivo se elimine después del primer cambio, por conveniencia, aquí se establece en --ignore_last_failover.
-------------------------------------------------- --------------------------------------------------
Use
y ejecute el programa en segundo plano: se mostrará el resultado al terminal; use Ctrl+C envía una señal SIGINT, y el programa es inmune; cierra la sesión y envía una señal SIGHUP, y el programa se cierra.
●Use nohup para ejecutar el programa: el resultado se enviará a nohup.out de manera predeterminada; use Ctrl+C para enviar una señal SIGINT y el programa se cerrará; cierre la sesión y envíe una señal SIGHUP y el programa se inmune.
● Use nohup y & para iniciar el programa nohup ./test &: Simultáneamente inmune a las señales SIGINT y SIGHUP.
(9) Verifique el estado de MHA y el registro de MHA en el nodo administrador, y podrá ver la dirección del maestro
#Verifique el estado de MHA, y podrá ver que el maestro actual es el nodo Mysql1.
masterha_check_status --conf=/etc/masterha/app1.cnf
#Revise
el registro de MHA, también puede ver que el maestro actual es 192.168.73.105
cat /var/log/masterha/app1/manager.log | grep "maestro actual "
(10) Verifique si la dirección VIP existe en Mysql1
ifconfig
#Para
cerrar el servicio del administrador, puede usar el siguiente comando.
masterha_stop --conf=/etc/masterha/app1.cnf
#O puede cerrarse directamente eliminando el ID del proceso.
Paso 3: Prueba de fallas
------------------------ Algoritmo para la conmutación por error de la biblioteca principal alternativa ------------- - ---------- Algoritmo para
conmutación por error 1. Generalmente, la biblioteca esclava se juzga desde (posición/GTID) para juzgar si es buena o mala, y los datos son diferentes. El esclavo más cercano al maestro se convierte en el maestro candidato. 2 Si los datos son consistentes, seleccione una biblioteca principal alternativa según el orden de los archivos de configuración. 3 Establezca el peso (candidate_master=1), y el maestro candidato debe ser designado de acuerdo con el peso. ( 1) De forma predeterminada, si un esclavo se retrasa 100M con respecto a los registros de relé del maestro, fallará incluso si tiene peso. ( 2) Si check_repl_delay=0, incluso si hay muchos registros detrás, se fuerza que se seleccione como maestro de respaldo.
##(1) Detenga el servicio mysql en el nodo maestro Mysql1
systemctl stop mysqld
or
pkill -9 mysql
##
(2) Supervise y observe los registros en el nodo administrador
tail -f /var/log/masterha/app1/manager .log ##
(3) Después de un cambio automático normal, el proceso MHA se cerrará. MHA modificará automáticamente el contenido del archivo app1.cnf y eliminará el nodo mysql1 de tiempo de inactividad. vim /etc/masterha/app1.cnf #Ver el archivo de configuración del nodo administrador ## (4) Verificar si mysql2 se hace cargo de VIP ifconfig
3. Repare el maestro defectuoso
(1) Repare mysql1 (es decir, repare el nodo maestro original)
systemctl reinicie mysqld
(2) Reparar datos maestro-esclavo
mysql -u root -p
mysql> show master status;
mysql -u root -p
cambiar maestro a master_host='192.168.73.106',master_user='myslave',master_password='123123',master_log_file='master-bin.000002',master_log_pos=154;
(3) Modifique el archivo de configuración app1.cnf en el nodo administrador
vi /etc/masterha/app1.cnf
......
second_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.72.192 -s 192.168.72.80
. . ....
[servidor1]
nombre de host=192.168.72.60
puerto=3306
[
servidor2]
candidato_maestro=1
check_repl_delay=0
nombre de host=192.168.72.192
puerto=3306
[
servidor3]
nombre de host=192.168.72.80
puerto=3306
(4) Inicie MHA en el nodo administrador
masterha_stop --conf=/etc/masterha/app1.cnf
nohup masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var /log/masterha/app1/manager.log 2>&1 &
(5) Reinicie mysql1 y mysql2
systemctl reinicie mysqld