Clúster de alta disponibilidad de MySQL (MHA)

1. Descripción general del clúster de MHA

  • Definición de clúster: varios servidores brindan el mismo servicio juntos, como (clúster web), etc.
  • Clasificación de clusters comunes:
  1. LB (clúster de equilibrio de carga): los servidores comparten y procesan de manera conjunta y uniforme múltiples solicitudes de conexión de los clientes.
    HA (Clúster de alta disponibilidad): modo activo-en espera, el servidor en espera asumirá automáticamente el trabajo después de que el principal se apague.
  • Software de servicio de clúster común:
    LB: LVS, Nginx, haproxy, etc.
    HA: Keepalive, latido del corazón,

1.1 Introducción del software

  • MHA (maestro de alta disponibilidad)
  • Desarrollado por la empresa japonesa DeNA youshimaton a través del lenguaje de scripting perl.
  • Es una excelente solución para lograr una alta disponibilidad de MySQL.
  • La operación automática de conmutación por error de la base de datos se puede completar en 0~30 segundos.
  • MHA puede garantizar la máxima consistencia de datos durante la conmutación por error para lograr una verdadera alta disponibilidad.

1.2 Composición de MHA

  • Maestro MHA (nodo de gestión)
  • Administrar todos los servidores de bases de datos
  • Se puede implementar por separado en una máquina independiente
  • También se puede implementar en un servidor de base de datos.
  • Nodo MHA (nodo de datos)
  • Servidor MySQL para almacenar datos
  • ejecutar en cada servidor MySQL

1.3 Proceso de trabajo de la MHA

  • Diagrama de arquitectura de clúster de MHA:
    inserte la descripción de la imagen aquí
  • Proceso de trabajo de MHA:
  • El administrador detecta regularmente el nodo maestro en el clúster
  • Cuando el maestro falla, el administrador promoverá automáticamente el esclavo con los datos más recientes al nuevo maestro, y el otro host esclavo se convertirá automáticamente en la biblioteca esclava del nuevo maestro, por lo que los hosts en el grupo de clústeres deben tener un maestro. y estructura de múltiples esclavos.

1.4 Planificación de la PI

dirección IP Rol de sincronización maestro-esclavo rol de clúster nombre de la CPU
192.168.2.10 cliente ninguno cliente10
192.168.2.20 ninguno host de gestión mha20
192.168.2.30 biblioteca principal biblioteca principal actual mysql30
192.168.2.40 de la biblioteca biblioteca principal en espera mysql40
192.168.2.50 de la biblioteca biblioteca principal en espera mysql50
192.168.2.100 ninguno dirección vip ninguno

2. Implemente el clúster de MHA

2.1 Preparar el entorno del clúster

2.1.1 Instalar paquetes dependientes

  • Instale el paquete prel que viene con el sistema
##需要在mha20、mysql30、mysql40、mysql50安装
[root@mha20 ~]# yum  -y install perl-*
wget http://rpmfind.net/linux/epel/7/x86_64/Packages/p/perl-Email-Date-Format-1.002-15.el7.noarch.rpm
wget http://rpmfind.net/linux/epel/7/x86_64/Packages/p/perl-Mail-Sender-0.8.23-1.el7.noarch.rpm
wget http://rpmfind.net/linux/epel/7/x86_64/Packages/p/perl-Mail-Sendmail-0.79-21.el7.noarch.rpm
wget http://rpmfind.net/linux/epel/7/x86_64/Packages/p/perl-MIME-Lite-3.030-1.el7.noarch.rpm
wget http://rpmfind.net/linux/epel/7/x86_64/Packages/p/perl-MIME-Types-1.38-2.el7.noarch.rpm
wget http://rpmfind.net/linux/epel/7/x86_64/Packages/p/perl-Parallel-ForkManager-1.18-2.el7.noarch.rpm
wget http://rpmfind.net/linux/centos/7.9.2009/os/x86_64/Packages/perl-Config-Tiny-2.14-7.el7.noarch.rpm
wget http://rpmfind.net/linux/epel/7/x86_64/Packages/p/perl-Log-Dispatch-2.41-1.el7.1.noarch.rpm

[root@mha20 ~]# ls
perl-Config-Tiny-2.14-7.el7.noarch.rpm          perl-Mail-Sendmail-0.79-21.el7.noarch.rpm
perl-Email-Date-Format-1.002-15.el7.noarch.rpm  perl-MIME-Lite-3.030-1.el7.noarch.rpm
perl-Log-Dispatch-2.41-1.el7.1.noarch.rpm       perl-MIME-Types-1.38-2.el7.noarch.rpm
perl-Mail-Sender-0.8.23-1.el7.noarch.rpm        perl-Parallel-ForkManager-1.18-2.el7.noarch.rpm
##在mha20、mysql30、mysql40、mysql50安装
[root@mha20 ~]# yum -y install perl-*.rpm

2.1.2 Configurar el inicio de sesión de autenticación de par de claves ssh

  • Configure el host de administración mha20 para iniciar sesión en todos los servidores de bases de datos sin contraseña a través de ssh
##在mha20上创建秘钥对
[root@mha20 ~]# ssh-keygen  ---全部回车即可
##把秘钥对中公钥拷贝给mysql30、mysql40、mysql50
[root@mha20 ~]# ssh-copy-id [email protected]
[root@mha20 ~]# ssh-copy-id [email protected]
[root@mha20 ~]# ssh-copy-id [email protected]
##验证mha20 ssh登录mysql30、mysql40、mysql50是否需要密码,不用密码才是对的,这里不展示了。
  • Configure todos los servidores de bases de datos para permitir el inicio de sesión sin contraseña ssh entre sí
##在mysql30操作如下:
[root@mysql30 ~]# ssh-keygen
[root@mysql30 ~]# ssh-copy-id [email protected]
[root@mysql30 ~]# ssh-copy-id [email protected]
##在mysql40操作如下:
[root@mysql40 ~]# ssh-keygen
[root@mysql40 ~]# ssh-copy-id [email protected]
[root@mysql40 ~]# ssh-copy-id [email protected]
##在mysql50操作如下:
[root@mysql50 ~]# ssh-keygen
[root@mysql50 ~]# ssh-copy-id [email protected]
[root@mysql50 ~]# ssh-copy-id [email protected]
##执行完后验证mysql30、mysql40、mysql50是否可以彼此之间免密登录,这里就不展示了。

2.1.3 Configurar un maestro y múltiples esclavos

  • Firewall y selinux deben estar apagados

2.1.3.1 Configurar la biblioteca principal (mysql30)

##修改配置文件开启binlog日志
[root@mysql30 ~]# vim /etc/my.cnf
[mysqld]
....
log_bin=mysql30
server_id=30
##安装半同步模块
plugin-load=rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so
##启动半同步模块
rpl_semi_sync_master_enabled=1
rpl_semi_sync_slave_enabled=1
##禁止删除本机中继日志
relay_log_purge=0
##重启mysql服务
[root@mysql30 ~]# systemctl restart mysqld
##查看binlog日志文件名称和pos值
mysql> show master status;
+----------------+----------+--------------+------------------+-------------------+
| File           | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+----------------+----------+--------------+------------------+-------------------+
| mysql30.000001 |      154 |              |                  |                   |
+----------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
##创建授权用户
mysql> grant replication slave on *.* to 'master'@'%' identified by '1234';

2.1.3.2 Configuración del servidor esclavo (mysql40)

##修改配置文件
[root@mysql40 ~]# vim /etc/my.cnf
[mysqld]
....
server_id=40
log_bin=master40
plugin-load=rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so
rpl_semi_sync_master_enabled=1
rpl_semi_sync_slave_enabled=1
relay_log_purge=0

##重启服务
[root@mysql40 ~]# systemctl restart mysqld
##指定主服务器,pos的值必须是在主库创建授权用户之前,不然从库无法同步授权用户,需要手动创建授权用户。
mysql> change master to
    -> master_host="192.168.2.30",
    -> master_user="master",
    -> master_password="1234",
    -> master_log_file="mysql30.000001",
    -> master_log_pos=154;
##启动slave
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)
##查看是否配置成功
mysql> show slave status\G;  
查看Slave_IO_Running和Slave_SQL_Running是yes那就配置成功,这里不展示了。

2.1.3.3 Configuración del servidor esclavo (mysql50)

##修改配置文件
[root@mysql50 ~]# vim /etc/my.cnf
[mysqld]
....
server_id=50
log_bin=master50
plugin-load=rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so
rpl_semi_sync_master_enabled=1
rpl_semi_sync_slave_enabled=1
relay_log_purge=0

##重启服务
[root@mysql50 ~]# systemctl restart mysqld
##指定主服务器
mysql> change master to
    -> master_host="192.168.2.30",
    -> master_user="master",
    -> master_password="1234",
    -> master_log_file="mysql30.000001",
    -> master_log_pos=154;
##启动slave
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)
##查看是否配置成功
mysql> show slave status\G;  
查看Slave_IO_Running和Slave_SQL_Running是yes那就配置成功,这里不展示了。

2.2 Configurar el nodo de gestión (mha20)

2.2.1 Instalar el paquete mha

##下载软件包
[root@mha20 ~]# wget https://github.com/yoshinorim/mha4mysql-manager/releases/download/v0.58/mha4mysql-manager-0.58.tar.gz
[root@mha20 ~]# wget https://github.com/yoshinorim/mha4mysql-node/releases/download/v0.58/mha4mysql-node-0.58-0.el7.centos.noarch.rpm
##安装mha4mysql-node
[root@mha20 ~]# yum -y install mha4mysql-node-0.58-0.el7.centos.noarch.rpm
##源码编译安装mha4mysql-manager
[root@mha20 ~]# tar -xf mha4mysql-manager-0.58.tar.gz -C /usr/local/
[root@mha20 ~]#  cd /usr/local/mha4mysql-manager-0.58/
[root@mha20 ~]#  perl Makefile.PL  --预编译有报错很有可能是依赖包的问题。
[root@mha20 ~]# make;make install
##配置环境变量:
[root@mha20 ~]#  echo "export PATH=/usr/local/mha4mysql-manager-0.58/bin:$PATH" >/etc/profile.d/mha4mysql.sh
[root@mha20 ~]# . /etc/profile.d/mha4mysql.sh
[root@mha20 ~]# echo $PATH

2.2.2 Administrar comandos de clúster

[root@mha20 ~]# ls /usr/local/mha4mysql-manager-0.58/bin/
masterha_check_repl  masterha_check_status  masterha_manager         masterha_master_switch    masterha_stop
masterha_check_ssh   masterha_conf_host     masterha_master_monitor  masterha_secondary_check
Orden efecto
masterha_check_ssh Verifique el estado de configuración SSH de MHA
masterha_check_repl Comprobar el estado de replicación de MySQL
masterha_manager Iniciar MHA
masterha_check_status Verifique el estado de ejecución de MHA
masterha_stop Detener MHA
masterha_master_monitor Detectar si el maestro está caído
masterha_master_switch Conmutación por error de control (automática o manual)
maestroha_conf_host Agregar o eliminar información del servidor configurado

2.2.3 Modificar el archivo de configuración principal

##创建工作目录
[root@mha20 ~]# mkdir  /etc/mha
[root@mha20 ~]# cp -r /usr/local/mha4mysql-manager-0.58/samples/conf/app1.cnf /etc/mha/
## 修改配置文件
[root@mha20 mha]# vim /etc/mha/app1.cnf
修改内容如下:
[server default]          ---管理服务的默认配置
manager_workdir=/etc/mha      ---指定工作目录路径
manager_log=/etc/mha/manager.log    ---指定管理服务运行后日志文件的名称和存放路径
master_ip_failover_script=/etc/mha/master_ip_failover      ---指定故障切换脚本
ssh_user=root    ---指定ssh连接时候的用户名和端口号
ssh_port=22

repl_user=master       ---指定主库授权的用户名和密码
repl_password=1234

user=mysqldb				---指定监控用户和密码,三台mysql需要一样。
password=1234

ping_interval=1         ---ping间隔时长
[server1]       			---指定第一台mysql服务器
hostname=192.168.2.30       ---指定第一台mysqlIP地址
port=3306                   ---端口号
candidate_master=1          ---指定该数据库服务器参与竞选主库,1代表参与。

[server2]
hostname=192.168.2.40
port=3306
candidate_master=1

[server3]
hostname=192.168.2.50
port=3306
candidate_master=1

2.2.4 Creación de scripts de conmutación por error

[root@mha20 mha]# cp -r /usr/local/mha4mysql-manager-0.58/samples/scripts/master_ip_failover /etc/mha/
##给脚本添加执行权限
[root@mha20 mha]# chmod +x /etc/mha/master_ip_failover
##下面是完整的脚本文件,需要修改VIP地址和网卡名称。
[root@mha20 mha]# vim  /etc/mha/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 = '192.168.2.100/24';     #指定VIP地址
my $key = '1';
my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";   #这里需要注意的就是网卡名称,没人的主机网卡名不一样需要注意。
my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";

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 \"`;
}
sub stop_vip() {
    
    
    return 0  unless  ($ssh_user);
    `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";
}

2.2.5 Crear una dirección VIP en la base de datos principal (mysql30)

[root@mysql30 ~]# ifconfig ens33:1 192.168.2.100
[root@mysql30 ~]# ifconfig ens33:1
ens33:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.2.100  netmask 255.255.255.0  broadcast 192.168.2.255
        ether 00:0c:29:88:4f:b0  txqueuelen 1000  (Ethernet)

2.3 Configurar el servidor de base de datos (mysql30-50)

2.3.1 Instale el paquete mha4mysql-node en el servidor de la base de datos

##在mysql30、mysql40、mysql50执行如下命令
[root@mysql30 ~]# wget https://github.com/yoshinorim/mha4mysql-node/releases/download/v0.58/mha4mysql-node-0.58-0.el7.centos.noarch.rpm
[root@mysql30 ~]# yum -y install mha4mysql-node-0.58-0.el7.centos.noarch.rpm

2.3.2 Crear usuario de monitoreo

##监控用户是在管理服务器配置文件上指定的:user=xxx,password=xxxx
##在主库上执行,从库自然同步过去。
mysql> grant all on *.* to 'mysqldb'@'%' identified by '1234';
Query OK, 0 rows affected, 1 warning (0.00 sec)

3. Verificar la configuración

3.1 Probar la configuración de ssh

##在mha20服务器上执行测试:
[root@mha20 ~]# masterha_check_ssh --conf=/etc/mha/app1.cnf
....
All SSH connection tests passed successfully    ---最后出现这个就说明配置正确。

3.2 Prueba de configuración maestro-esclavo

[root@mha20 ~]# masterha_check_repl --conf=/etc/mha/app1.cnf
...
MySQL Replication Health is OK.    ---出现这个说明MySQL复制运行状况正常

3.3 Iniciar el servicio de gestión

  • Inicie el servicio de administración con el comando masterha_manager

—— --remove_dead_master_conf significa que cuando la biblioteca principal está inactiva, la configuración de la biblioteca principal inactiva se eliminará, de lo contrario, el servicio no se iniciará después de que la biblioteca principal esté inactiva --ignore_last_failover significa ignorar el archivo xxx.health, que significa que cuando la biblioteca principal está inactiva después del host, el servicio se conectará a los servidores esclavos restantes dentro del tiempo especificado para elegir la biblioteca maestra. Si no agrega esta opción al iniciar el servicio, no cambiará a la biblioteca principal si no se ha conectado dentro del tiempo especificado. Después de agregar esta opción, no podrá conectarse a los esclavos restantes dentro del tiempo especificado. El servidor continuará intentando conectarse después, hasta que se elija cambiar la biblioteca principal.

##启动
[root@mha20 ~]# masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf   --ignore_last_failover
##后台启动
nohup  masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf   --ignore_last_failover  &
##查看mha运行状态:
[root@mha20 ~]# masterha_check_status --conf=/etc/mha/app1.cnf
app1 (pid:39934) is running(0:PING_OK), master:192.168.2.30
##如果想停止服务可以输入下面命令
[root@mha20 ~]# masterha_stop --conf=/etc/mha/app1.cnf

4 Prueba de alta disponibilidad

4.1 Simular la falla del servidor de la base de datos principal

  • Métodos para simular fallas:
  • detener el servicio mysqld
  • cerrar
  • Proceso de conmutación por error:
    cuando el host de administración no puede conectarse al servidor maestro mysql, se considera que el servidor maestro mysql está inactivo, y luego el servicio del host de administración se detiene automáticamente, y luego se llama al script de conmutación por error para eliminar el contenido sobre el servidor maestro mysql en el host de administración (/etc/mha/app1.cnf) Luego, el script creará una dirección VIP en el servidor maestro elegido.
##在mysql30主服务关闭mysql服务
[root@mysql30 ~]# systemctl stop mysqld.service
##检查管理主机的配置文件是否删除mysql30的信息。
[root@mha20 ~]# grep "192.168.2.30" /etc/mha/app1.cnf   --执行这条命令可以看的出来,已经没有mysql30的信息了。
##在管理主机上查看日志文件master现在是哪台?
[root@mha20 ~]# grep "new master" /etc/mha/manager.log
Fri Feb 24 14:58:16 2023 - [info] Searching new master from slaves..
192.168.2.40(192.168.2.40:3306) (new master)
Fri Feb 24 14:58:16 2023 - [info] Getting new master's binlog name and position..
Enabling the VIP - 192.168.2.100/24 on the new master - 192.168.2.40
Fri Feb 24 14:58:17 2023 - [info]  Resetting slave 192.168.2.50(192.168.2.50:3306) and starting replication from the new master 192.168.2.40(192.168.2.40:3306)..
Fri Feb 24 14:58:18 2023 - [info] Resetting slave info on the new master..
Selected 192.168.2.40(192.168.2.40:3306) as a new master.
##可以看的出来mysql40被选举出来作为master
##在mysql40上查看VIP地址是否在
[root@mysql40 ~]# ifconfig ens33:1
ens33:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.2.100  netmask 255.255.255.0  broadcast 192.168.2.255
        ether 00:0c:29:83:e3:d4  txqueuelen 1000  (Ethernet)
##查看mysql50的slave状态
[root@mysql50 ~]# mysql -uroot -p1234 -e "show slave status \G;"|head -13|tail -11
mysql: [Warning] Using a password on the command line interface can be insecure.
                  Master_Host: 192.168.2.40     ---可以看的出来mysql40已经是masterl 
                  Master_User: master
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master40.000001
          Read_Master_Log_Pos: 154
               Relay_Log_File: mysql50-relay-bin.000002
                Relay_Log_Pos: 319
        Relay_Master_Log_File: master40.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes	
##启动管理主机的mha服务
[root@mha20 ~]# nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf   --ignore_last_failover &
##查看mha状态
[root@mha20 ~]# masterha_check_status  --conf=/etc/mha/app1.cnf
app1 (pid:57758) is running(0:PING_OK), master:192.168.2.40

4.2 Reparación de un servidor de base de datos fallido

4.2.1 Configuración del servidor de datos

  • El funcionamiento específico es el siguiente:
  1. iniciar el servicio mysql
  2. De acuerdo con los datos del servidor maestro
  3. Especificar la información del servidor maestro
  4. Iniciar el proceso esclavo
  5. Ver información de estado del esclavo
## 启动mysql30服务
[root@mysql30 ~]# systemctl start mysqld
##指定主库服务器信息。
mysql> change master to
    -> master_host="192.168.2.40",
    -> master_user="master",
    -> master_password="1234",
    -> master_log_file="master40.000001",
    -> master_log_pos=154;
Query OK, 0 rows affected, 2 warnings (0.00 sec)
##注意这里指定的binlog的文件名称master40.000001的原因是因为mysql40第一次变成master所以他的文件名是从master40.000001开始的。
##然而pos值=154的原因是为了mysql30和mysql40数据一致,因为假如你查看现在的mysql40的pos值应该会有变化,因为mysql30宕机后生产环境下肯定会往里面写入数据,但是pos值是从154开始的所以直接指定154才能很快的保证数据一致。
mysql> start slave;
##这里就不显示slave的状态了。

4.2.2 Configurar host de gestión

##停止mha服务
[root@mha20 ~]# masterha_stop   --conf=/etc/mha/app1.cnf
##修改mha主配置文件
[root@mha20 ~]# vim /etc/mha/app1.cnf
....
##添加如下:
[server1]
candidate_master=1
hostname=192.168.2.30
port=3306
##启动mha服务
[root@mha20 ~]# nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf   --ignore_last_failover &
##查看mha状态
[root@mha20 ~]# masterha_check_status   --conf=/etc/mha/app1.cnf
app1 (pid:60567) is running(0:PING_OK), master:192.168.2.40

Supongo que te gusta

Origin blog.csdn.net/weixin_45625174/article/details/129158002
Recomendado
Clasificación