Directorio de artículos
- Descripción general de MHA
- ¡Dale! ¡Mostrar! !
-
- Compila e instala MySQL
-
- Copiar archivos de configuración y scripts de inicio del servicio
- Agregar servicio mysqld
- Agregar variables de entorno
- Agregar usuario en ejecución del programa
- Inicializar la base de datos
- Modificar el archivo de configuración de Matser
- Modificar archivos de configuración esclavo01 y esclavo02
- Entrar en la base de datos
- Configurar el inicio de sesión remoto
- Configurar el servicio maestro-esclavo
- Ver estado maestro
- Configurar servicio esclavo
- Establecer dos bibliotecas esclavas como de solo lectura
- Instalar MHA
-
- Administrador de compilación e instalación, solo instalado en MHA
- Configuración SSH
- Configurar componentes de MHA-Manager
- Modificar el script master_ip_failover
- Cree el directorio del software MHA y copie los archivos de configuración
- Prueba SSH sin autenticación de contraseña
- Para verificar la replicación de mysql, se debe iniciar mysql
- Iniciar MHA
- autenticando
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.
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! !
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)