Configuración y resolución de problemas de alta disponibilidad de la base de datos MySQL MHA

Descripción general de MHA

MHA (Master High Availability) es actualmente una solución relativamente madura para la alta disponibilidad de MySQL. Fue desarrollada por youshimaton (ahora trabajando en Facebook) de DeNA en Japón. Es un excelente conjunto de failover y Software de alta disponibilidad promovido por maestro y esclavo.
En el proceso de conmutación por error de MySQL, MHA puede completar automáticamente la operación de conmutación por error de la base de datos en 0 ~ 30 segundos, y durante el proceso de conmutación por error, MHA puede garantizar la consistencia de los datos en la mayor medida posible para lograr un verdadero Alta disponibilidad en el sentido.
El software consta de dos partes: MHA Manager (nodo de gestión) y MHA Node (nodo de datos). MHA Manager se puede implementar en una máquina separada para administrar múltiples clústeres maestro-esclavo, o se puede implementar en un nodo esclavo. El nodo MHA se ejecuta en cada servidor MySQL. MHA Manager detectará periódicamente el nodo maestro en el clúster. Cuando el maestro falla, puede actualizar automáticamente el esclavo con los datos más recientes al nuevo maestro y luego redirigir a todos los demás esclavos al nuevo maestro. El maestro. Todo el proceso de conmutación por error es completamente transparente para la aplicación.
Durante el proceso de conmutación por error automático de MHA, MHA intenta guardar el registro binario del servidor primario inactivo para garantizar que los datos no se pierdan en la mayor medida posible, pero esto no siempre es factible. Por ejemplo, si el hardware del servidor principal falla o no se puede acceder a él a través de ssh, MHA no puede guardar el registro binario y solo falla y pierde los datos más recientes. El uso de la replicación semisincrónica de MySQL puede reducir en gran medida el riesgo de pérdida de datos. MHA se puede combinar con la replicación semisincrónica. Si solo un esclavo ha recibido el último registro binario, MHA puede aplicar el último registro binario a todos los demás servidores esclavos, por lo que se puede garantizar la coherencia de los datos de todos los nodos.
En la actualidad, MHA admite principalmente una arquitectura de un maestro y varios esclavos. Para construir MHA, un clúster de replicación debe tener al menos tres servidores de base de datos, uno maestro y dos esclavos, es decir, uno sirve como maestro, otro como maestro en espera y el otro como base de datos esclava. Debido a que se requieren al menos tres servidores, Taobao también ha modificado sobre esta base debido a consideraciones de costo de la máquina. En la actualidad, Taobao TMHA ya admite un maestro y un esclavo.

Composición MHA

MHA Manager (nodo de gestión) se
utiliza para recibir señales externas y monitorear el estado de funcionamiento de los nodos de datos a continuación. El
nodo MHA (nodo de datos) es la
unidad de trabajo responsable del trabajo específico

Características de MHA

En el proceso de conmutación por error automática, MHA intenta guardar el registro binario del servidor principal inactivo para garantizar que los datos no se pierdan en la mayor medida
posible.La replicación semisincrónica de MySQL55 puede reducir en gran medida el riesgo de pérdida de datos.

Inserte la descripción de la imagen aquí
Sin embargo, en la arquitectura tradicional, solo hay un servidor maestro mysql, por lo que cuando ocurre un solo punto de falla, todo el clúster de servidores se paralizará.
Para resolver esta situación, necesitamos restablecer un servidor maestro cuando el servidor maestro está inactivo. Responsable del seguimiento y otros trabajos.

¡Dale! ¡Mostrar! !

Inserte la descripción de la imagen aquí
maestro 20.0.0.5
esclavo01 20.0.0.6
esclavo02 20.0.0.7

Compila e instala MySQL

Compile e instale mysql, porque el sistema que usamos es CentOS 7, así que use el compatible mah 0.5.7, y mysql usa el mysql5.6 más adecuado

yum -y install ncurses \
ncurses \
bison \
cmake \
gcc \
ncurses-devel \
gcc-c++

tar zxvf mysql-5.6.26.tar.gz
cd mysql-5.6.26/
cmake \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_EXTRA_CHARSETS=all \
-DSYSCONFDIR=/etc
make && make install

Copiar archivos de configuración y scripts de inicio del servicio

[root@5centos mysql-5.6.26]# cp support-files/my-default.cnf /etc/my.cnf
cp:是否覆盖"/etc/my.cnf"? y
[root@5centos mysql-5.6.26]# cp support-files/mysql.server /etc/rc.d/init.d/mysqld

Agregar servicio mysqld

[root@5centos mysql-5.6.26]# chmod +x /etc/rc.d/init.d/mysqld
[root@7CentOS mysql-5.6.26]# chkconfig --add mysqld

Agregar variables de entorno

[root@5centos mysql-5.6.26]# echo "PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile
[root@5centos mysql-5.6.26]# source /etc/profile

Agregar usuario en ejecución del programa

[root@5centos mysql-5.6.26]# groupadd mysql
[root@5centos mysql-5.6.26]# useradd -M -s /sbin/nologin mysql -g mysql
[root@5centos mysql-5.6.26]# chown -R mysql.mysql /usr/local/mysql

Inicializar la base de datos

/usr/local/mysql/scripts/mysql_install_db \
--basedir=/usr/local/mysql \
--datadir=/usr/local/mysql/data \
--user=mysql

Modificar el archivo de configuración de Matser

[root@5centos mysql-5.6.26]# vim /etc/my.cnf
server-id = 1	##三台MySQLserver-id不能一样
log_bin = master-bin
log-slave-updates = true

Modificar archivos de configuración esclavo01 y esclavo02

[root@localhost mysql-5.6.26]# vim /etc/my.cnf
server-id = 2  ##02我写的3
log_bin = master-bin
relay-log = relay-log-bin
relay-log-index = slave-relay-bin.index
[root@7CentOS mysql-5.6.26]# systemctl restart mysqld

Los tres servicios de inicio

ln -s /usr/local/mysql/bin/mysql /usr/sbin/
ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin/
/usr/local/mysql/bin/mysqld_safe --user=mysql &

Entrar en la base de datos

[root@5centos mysql-5.6.26]# mysql -u root -p
Enter password:   ##仅实验,所以懒一点使用空密码
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.6.26-log Source distribution

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

Configurar el inicio de sesión remoto

GRANT ALL ON *.* TO 'remote_user'@'%' IDENTIFIED BY 'abc123';

Configurar el servicio maestro-esclavo

mysql_slave se usa para la sincronización maestro-esclavo de la base de datos
mha_manager se usa para que el administrador se conecte a MySQL

mysql> GRANT REPLICATION SLAVE ON *.* TO 'mysql_slave'@'20.0.0.%'  IDENTIFIED BY 'abc123';
Query OK, 0 rows affected (0.00 sec)
mysql> GRANT ALL PRIVILEGES ON *.* TO 'mha_manager'@'20.0.0.%'  IDENTIFIED BY 'abc123';
Query OK, 0 rows affected (0.00 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

Las siguientes tres autorizaciones no necesitan agregarse de acuerdo con la teoría, pero al realizar el entorno del experimento, verifique el informe de error maestro-esclavo de MySOL e informe que las dos bibliotecas esclavas no pueden conectarse a la biblioteca maestra a través del nombre de host, por lo que todas las bases de datos agregan las siguientes autorizaciones

mysql> GRANT ALL PRIVILEGES ON *.* TO 'mha_manager'@'master' IDENTIFIED BY 'abc123';
Query OK, 0 rows affected (0.00 sec)
mysql> GRANT ALL PRIVILEGES ON *.* TO 'mha_manager'@'slave1' IDENTIFIED BY 'abc123';
Query OK, 0 rows affected (0.00 sec)
mysql> GRANT ALL PRIVILEGES ON *.* TO 'mha_manager'@'slave2' IDENTIFIED BY 'abc123';
Query OK, 0 rows affected (0.00 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

Ver estado maestro

mysql> show master status;
+-------------------+----------+--------------+------------------+-------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000001 |     1739 |              |                  |                   |
+-------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

Configurar servicio esclavo

mysql> CHANGE MASTER TO MASTER_HOST='20.0.0.5', MASTER_USER='mysql_slave', MASTER_PASSWORD='abc123', MASTER_LOG_FILE='master-bin.000001', MASTER_LOG_POS=1739;
Query OK, 0 rows affected, 2 warnings (0.01 sec)

mysql> START SLAVE;
Query OK, 0 rows affected (0.00 sec)
mysql> show slave status\G;
*************************** 1. row ***************************
            Slave_IO_State: Waiting for master to send event
            ……省略部分……
            Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

Establecer dos bibliotecas esclavas como de solo lectura

mysql> set global read_only=1;
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)

Instalar MHA

Instale el nodo en todos los servidores, incluidas las
dependencias necesarias para la instalación de MHA que no se utilizaron antes

[root@localhost bao]# yum install epel-release --nogpgcheck -y
[root@localhost bao]# yum install -y perl-DBD-MySQL \
> perl-Config-Tiny \
> perl-Log-Dispatch \
> perl-Parallel-ForkManager \
> perl-ExtUtils-CBuilder \
> perl-ExtUtils-MakeMaker \
> perl-CPAN

Compilar e instalar el nodo

[root@localhost bao]# tar zxvf mha4mysql-node-0.57.tar.gz 
[root@localhost bao]# cd mha4mysql-node-0.57/
perl Makefile.PL
make &&make install

Administrador de compilación e instalación, solo instalado en MHA

[root@localhost mha4mysql-node-0.57]# cd ..
[root@localhost bao]# tar zxvf mha4mysql-manager-0.57.tar.gz
[root@localhost mha4mysql-manager-0.57]# perl Makefile.PL
[root@localhost mha4mysql-manager-0.57]# make&&make install

Después de instalar el administrador, se generarán varias herramientas en / usr / local / bin, que incluyen principalmente las siguientes:
masterha_check_ssh comprueba el estado de configuración SSH de MHA
masterha_check_repl comprueba el estado de replicación de MySQL
masterha_manger inicia el script del administrador
masterha_check_status detecta el estado de ejecución actual de MHA
masterha_master_monitor detecta si el maestro
Tiempo de inactividad masterha_master_switch control failover (automático o manual)
masterha_conf_host agregar o eliminar la información del servidor configurado
masterha_stop cerrar el administrador

Después de instalar el nodo, se generarán varios scripts en / usr / local / bin (estas herramientas generalmente son activadas por scripts de MHA Manager sin operación humana). Los principales son los siguientes:
save_binary_logs save and copy master binary log
purge_relay_logs clear relay log ( (No bloquea el hilo SQL)
apply_diff_relay_logs identifica eventos de registro de relé diferencial y aplica los eventos diferenciales a otros esclavos
filter_mysqlbinlog para eliminar eventos ROLLBACK innecesarios (MHA ya no usa esta herramienta)

[root@localhost mha4mysql-manager-0.57]# cd /usr/local/bin/
[root@localhost bin]# ls
apply_diff_relay_logs  masterha_conf_host        masterha_stop
filter_mysqlbinlog     masterha_manager          purge_relay_logs
masterha_check_repl    masterha_master_monitor   save_binary_logs
masterha_check_ssh     masterha_master_switch
masterha_check_status  masterha_secondary_check

Configuración SSH

MHA

[root@localhost bin]# ssh-keygen -t rsa
##然后回车,最后按y
[root@localhost bin]# ssh [email protected]
[root@localhost bin]# ssh [email protected]
[root@localhost bin]# ssh [email protected]

Maestro

ssh-keygen -t rsa
ssh [email protected]
ssh [email protected]

esclavo01

ssh-keygen -t rsa
ssh [email protected]
ssh [email protected]

esclavo02

ssh-keygen -t rsa
ssh [email protected]
ssh [email protected]

Configurar componentes de MHA-Manager

##在mha节点上复制相关脚本到/usr/local/bin目录
[root@mha ~]# cp -ra /root/mha4mysql-manager-0.57/samples/scripts /usr/local/bin
[root@mha ~]# ll /usr/local/bin/scripts/
总用量 32
-rwxr-xr-x. 1 1001 1001  3648 5月  31 2015 master_ip_failover ##自动切换时 VIP管理的脚本
-rwxr-xr-x. 1 1001 1001  9870 5月  31 2015 master_ip_online_change ##在线切换VIP的管理
-rwxr-xr-x. 1 1001 1001 11867 5月  31 2015 power_manager ##故障发生后关闭主机的脚本
-rwxr-xr-x. 1 1001 1001  1360 5月  31 2015 send_report ##因故障切换后发送报警的脚本
[root@mha ~]# cp /usr/local/bin/scripts/master_ip_failover /usr/local/bin/ ##自动切换时 VIP管理的脚本

Modificar el script master_ip_failover

[root@mha ~]# vim /usr/local/bin/master_ip_failover  '删除全部后,重写'
#!/usr/bin/env perl
use strict;
use warnings FATAL => 'all';

use Getopt::Long;

my (
$command, $ssh_user, $orig_master_host, $orig_master_ip,
$orig_master_port, $new_master_host, $new_master_ip, $new_master_port
);
#########################################################
my $vip = '20.0.0.200';      ##浮动路由的ip地址
my $brdc = '20.0.0.255';     ##广播地址
my $ifdev = 'ens33';              ##网卡名
my $key = '1';
my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";
my $exit_code = 0;
#my $ssh_start_vip = "/usr/sbin/ip addr add $vip/24 brd $brdc dev $ifdev label $ifdev:$key;/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 label $ifdev:$key";
#########################################################
GetOptions(
'command=s' => \$command,
'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' => \$new_master_ip,
'new_master_port=i' => \$new_master_port,
);

exit &main();

sub main {
    
    

print "\n\nIN SCRIPT TEST====$ssh_stop_vip==$ssh_start_vip===\n\n";

if ( $command eq "stop" || $command eq "stopssh" ) {
    
    

my $exit_code = 1;
eval {
    
    
print "Disabling the VIP on old master: $orig_master_host \n";
&stop_vip();
$exit_code = 0;
};
if ($@) {
    
    
warn "Got Error: $@\n";
exit $exit_code;
}
exit $exit_code;
}
elsif ( $command eq "start" ) {
    
    

my $exit_code = 10;
eval {
    
    
print "Enabling the VIP - $vip on the new master - $new_master_host \n";
&start_vip();
$exit_code = 0;
};
if ($@) {
    
    
warn $@;
exit $exit_code;
}
exit $exit_code;
}
elsif ( $command eq "status" ) {
    
    
print "Checking the Status of the script.. OK \n";
exit 0;
}
else {
    
    
&usage();
exit 1;
}
}
sub start_vip() {
    
    
`ssh $ssh_user\@$new_master_host \" $ssh_start_vip \"`;
}
# A simple system call that disable the VIP on the old_master
sub stop_vip() {
    
    
`ssh $ssh_user\@$orig_master_host \" $ssh_stop_vip \"`;
}

sub usage {
    
    
print
"Usage: master_ip_failover --command=start|stop|stopssh|status --orig_master_host=host --orig_master_ip=ip --orig_master_port=port --new_master_host=host --new_master_ip=ip --new_master_port=port\n";
}

Cree el directorio del software MHA y copie los archivos de configuración

[root@mha ~]# cd /usr/local/bin/scripts/
[root@mha scripts]# cp master_ip_online_change /usr/local/bin/
[root@mha scripts]# cp send_report /usr/local/
[root@mha scripts]# mkdir /etc/masterha
[root@mha ~]# cp /root/mha4mysql-manager-0.57/samples/conf/app1.cnf /etc/masterha
[root@mha ~]# vim /etc/masterha/app1.cnf  ##删除内容,重新填写
[server default]
manager_log=/var/log/masterha/app1/manager.log  ##manager日志
manager_workdir=/var/log/masterha/app1    ##manager工作目录
master_binlog_dir=/usr/local/mysql/data    ##master保存binlog的位置,这里的路径要与master里配置的binlog的路径一直,以便mha能找到
master_ip_failover_script=/usr/local/bin/master_ip_failover  ##设置自动failover时候的切换脚本,也就是上边的那个脚本
master_ip_online_change_script=/usr/local/bin/master_ip_online_change ##设置手动切换时候的切换脚本
password=manager  ##设置mysql中root用户的密码,这个密码是前文中创建监控用户的那个密码
ping_interval=1  ##设置监控主库,发送ping包的时间间隔,默认是3秒,尝试三次没有回应的时候自动进行rail
remote_workdir=/tmp  ##设置远端mysql在发生切换时binlog的保存位置
repl_password=123  ##设置复制用户的密码
repl_user=myslave   ##设置复制用户的用户
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 20.0.0.6 -s 20.0.0.7 ##设置从服务器的地址
shutdown_script="" ##设置故障发生后关闭故障主机脚本(该脚本的主要作用是关闭主机放在发生脑裂,这里没有使用)'
ssh_user=root  ##设置ssh的登录用户名
user=mha

[server1]
hostname=20.0.0.5
port=3306

[server2]
candidate_master=1  ##设置为候选master
hostname=20.0.0.6
check_repl_delay=0  ##默认情况下如果一个slave落后master 100M的relay logs 的话,mha将不会选择该slave作为一个新的master
port=3306

[server3]
hostname=20.0.0.7
port=3306

Prueba SSH sin autenticación de contraseña

SSH no tiene autenticación de contraseña, se generará correctamente al final si es normal

[root@mha ~]# masterha_check_ssh -conf=/etc/masterha/app1.cnfThu Aug 27 23:19:44 2020 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Thu Aug 27 23:19:44 2020 - [info] Reading application …省略部分…
Thu Aug 27 23:19:51 2020 - [info] All SSH connection tests passed successfully.

Para verificar la replicación de mysql, se debe iniciar mysql

[root@mha ~]# masterha_check_repl -conf=/etc/masterha/app1.cnf
IN SCRIPT TEST====/sbin/ifconfig ens33:1 down==/sbin/ifconfig ens33:1 20.0.0.200===

Checking the Status of the script.. OK 
Thu Aug 27 23:21:00 2020 - [info]  OK.
Thu Aug 27 23:21:00 2020 - [warning] shutdown_script is not defined.
Thu Aug 27 23:21:00 2020 - [info] Got exit code 0 (Not master dead).

MySQL Replication Health is OK.

Iniciar MHA

La primera configuración debe ir al maestro para abrir manualmente la IP virtual

[root@mysql1 ~]# /sbin/ifconfig ens33:1 20.0.0.200/24
[root@mha ~]# masterha_check_status --conf=/etc/masterha/app1.cnf
app1 (pid:65368) is running(0:PING_OK), master:20.0.0.5

Compruebe si existe la dirección VIP 20.0.0.200 de mysql1, esta dirección VIP no desaparecerá porque el nodo mha detiene el servicio mha

[root@mysql1 ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 20.0.0.5  netmask 255.255.255.0  broadcast 20.0.0.255
        inet6 fe80::1301:89f0:4405:2aad  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:a9:8d:f9  txqueuelen 1000  (Ethernet)
        RX packets 9588  bytes 10245457 (9.7 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 4708  bytes 579551 (565.9 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens33:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 20.0.0.200  netmask 255.255.255.0  broadcast 20.0.0.255
        ether 00:0c:29:a9:8d:f9  txqueuelen 1000  (Ethernet)

autenticando

Ver registro de observación de monitoreo

[root@mha ~]# tailf /var/log/masterha/app1/manager.log

Fallo simulado

[root@mysql1 ~]# pkill -9 mysql

Ver 200 direcciones

[root@mysql2 ~]# ifconfig 
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 20.0.0.6  netmask 255.255.255.0  broadcast 20.0.0.255
        inet6 fe80::1301:89f0:4405:2aad  prefixlen 64  scopeid 0x20<link>
        inet6 fe80::769:c122:2af2:c353  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:c2:17:3b  txqueuelen 1000  (Ethernet)
        RX packets 9714  bytes 10234408 (9.7 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 5441  bytes 741224 (723.8 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens33:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 20.0.0.200  netmask 255.255.255.0  broadcast 20.0.0.255
        ether 00:0c:29:c2:17:3b  txqueuelen 1000  (Ethernet)

Supongo que te gusta

Origin blog.csdn.net/Ora_G/article/details/108265112
Recomendado
Clasificación