MHA是Master High Availability的缩写,它是目前MySQL高可用方面的一个相对成熟的解决方案,其核心是使用perl语言编写的一组脚本,是一套优秀的做为MySQL高可用性环境下故障切换和主从提高的高可用软件。在MySQL故障切换过程当中,MHA能作到在0~30秒以内自动完成数据库的故障切换操做,而且能在最大程度上保证数据的一致性,以达到真正意义上的高可用。前端
基于MHA的架构不像MMM那样须要搭建主主复制,只须要搭建基本的主从复制架构便可。由于MHA在主库挂掉时,是在多个从库中选取出一个从库做为新的主库。MHA集群中的各节点彼此之间均须要基于ssh
互信通讯,以实现远程控制及数据管理功能。node
MHA提供了什么功能:mysql
MHA故障转移过程:git
ssh
登陆到宕机崩溃的Master节点上保存二进制日志事件(binlog events);MHA的架构图以下:github
本文中所使用的机器说明:sql
名称 | IP | 角色 |
---|---|---|
master | 192.168.190.151 | 主库 |
slave-01 | 192.168.190.152 | 从库 |
slave-02 | 192.168.190.154 | 从库 |
manager | 192.168.190.153 | 集群管理节点(MHA) |
环境版本说明:数据库
另外的说明:vim
一、在全部主从节点上使用以下语句建立用于主从复制的MySQL用户,由于每一个从库都有可能会被选举为主库,因此都须要拥有用于复制的用户:centos
create user 'repl'@'%' identified with mysql_native_password by 'Abc_123456'; grant replication slave on *.* to 'repl'@'%'; flush privileges;
二、而后修改master
节点上的MySQL配置文件:安全
[root@master ~]# vim /etc/my.cnf [mysqld] # 设置当前节点的id server_id=101 # 开启binlog,并指定binlog文件的名称 log_bin=mysql_bin # 开启relay_log,并指定relay_log文件的名称 relay_log=relay_bin # 将relaylog的同步内容记录到binlog中 log_slave_updates=on # 开启GTID复制模式 gtid_mode=ON enforce_gtid_consistency=1
三、在slave-01
的配置文件中也是添加同样配置,只不过server_id
不同:
[root@slave-01 ~]# vim /etc/my.cnf [mysqld] server_id=102 log_bin=mysql_bin relay_log=relay_bin log_slave_updates=on gtid_mode=ON enforce_gtid_consistency=1
四、接着是配置slave-02
:
[root@slave-02 ~]# vim /etc/my.cnf [mysqld] server_id=103 log_bin=mysql_bin relay_log=relay_bin log_slave_updates=on gtid_mode=ON enforce_gtid_consistency=1
完成以上配置文件的修改后,分别重启这三个节点上的MySQL服务:
[root@master ~]# systemctl restart mysqld [root@slave-01 ~]# systemctl restart mysqld [root@slave-02 ~]# systemctl restart mysqld
slave-01
对master
的主从关系进入slave-01
节点的MySQL命令行终端,分别执行以下语句来配置主从复制链路:
mysql> stop slave; -- 中止主从同步 mysql> change master to master_host='192.168.190.151', master_port=3306, master_user='repl', master_password='Abc_123456', master_auto_position=1; -- 配置master节点的链接信息 mysql> start slave; -- 启动主从同步
配置完主从复制链路后,使用show slave status\G;
语句查看主从同步状态,Slave_IO_Running
和Slave_SQL_Running
的值均为Yes
才能表示主从同步状态是正常的:
slave-02
对master
的主从关系一样的步骤,进入slave-02
节点的MySQL命令行终端,分别执行以下语句来配置主从复制链路:
mysql> stop slave; -- 中止主从同步 mysql> change master to master_host='192.168.190.151', master_port=3306, master_user='repl', master_password='Abc_123456', master_auto_position=1; -- 配置master节点的链接信息 mysql> start slave; -- 启动主从同步
配置完主从复制链路后,使用show slave status\G;
语句查看主从同步状态,Slave_IO_Running
和Slave_SQL_Running
的值均为Yes
才能表示主从同步状态是正常的:
配置集群内全部主机之间可以经过ssh
免密登陆,由于MHA是基于ssh
去实现远程控制及数据管理的。例如,故障转移过程当中保存原Master节点的二进制日志以及配置虚拟IP等。
一、生成ssh
登陆密钥:
[root@master ~]# ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /root/.ssh/id_rsa. Your public key has been saved in /root/.ssh/id_rsa.pub. The key fingerprint is: SHA256:LzRXziRQPrqaKEteH6KrZpCiV6uGP6GTi6RonE7Hhms root@master The key's randomart image is: +---[RSA 2048]----+ | ... | | o | | + o | | . B | | . S . o | |+ + . . = | |=Bo*o.. o . | |%EOo.+ + . | |%XB*. + | +----[SHA256]-----+
二、将密钥拷贝到其余服务器上:
[root@master ~]# ssh-copy-id -i /root/.ssh/id_rsa root@192.168.190.151 [root@master ~]# ssh-copy-id -i /root/.ssh/id_rsa root@192.168.190.152 [root@master ~]# ssh-copy-id -i /root/.ssh/id_rsa root@192.168.190.154 [root@master ~]# ssh-copy-id -i /root/.ssh/id_rsa root@192.168.190.153
而后到集群中其余节点上进行一样的操做,因为是重复的操做这里就不演示了。最后简单测试下可否正常免密登陆便可:
[root@master ~]# ssh root@192.168.190.152 Last failed login: Sat Feb 1 15:29:38 CST 2020 from 192.168.190.151 on ssh:notty There was 1 failed login attempt since the last successful login. # 没有要求输入密码,测试成功 Last login: Sat Feb 1 14:14:03 2020 from 192.168.190.1 [root@slave-01 ~]#
一、首先在全部的节点上安装mha4mysql-node
软件包,安装包可到以下地址进行下载:
下载好的rpm
文件以下:
[root@master ~]# ls *.rpm mha4mysql-node-0.58-0.el7.centos.noarch.rpm [root@master ~]#
在安装该rpm
包以前须要先安装perl相关依赖:
[root@master ~]# yum -y install epel-release [root@master ~]# yum -y install perl-DBD-MySQL perl-DBI ncftp
如今就能够安装mha4mysql-node
了,命令以下:
[root@master ~]# rpm -ivh mha4mysql-node-0.58-0.el7.centos.noarch.rpm
二、接着是在监控节点manager
上安装mha4mysql-manager
软件包,安装包到以下地址进行下载:
下载好的rpm
文件以下:
[root@manager ~]# ls *.rpm mha4mysql-manager-0.58-0.el7.centos.noarch.rpm [root@manager ~]#
一样,在安装该rpm
包以前须要先安装perl相关依赖:
[root@manager ~]# yum -y install epel-release [root@manager ~]# yum -y install perl-Config-Tiny perl-Time-HiRes perl-Parallel-ForkManager perl-Log-Dispatch perl-DBD-MySQL ncftp
而后安装mha4mysql-manager
包,命令以下:
[root@manager ~]# rpm -ivh mha4mysql-manager-0.58-0.el7.centos.noarch.rpm
一、建立MHA的配置文件存放目录和工做目录:
[root@manager ~]# mkdir /etc/mha [root@manager ~]# mkdir /home/mysql_mha
二、建立MHA的配置文件,并添加以下内容:
[root@manager ~]# vim /etc/mha/mysql_mha.cnf [server default] # mha用于访问数据库的帐户和密码 user=mha password=Abc_123456 # 指定mha的工做目录 manager_workdir=/home/mysql_mha # mha日志文件的存放路径 manager_log=/home/mysql_mha/manager.log # 指定mha在远程节点上的工做目录 remote_workdir=/home/mysql_mha # 可使用ssh登陆的用户 ssh_user=root # 用于主从复制的MySQL用户和密码 repl_user=repl repl_password=Abc_123456 # 指定间隔多少秒检测一次 ping_interval=1 # 指定master节点存放binlog日志文件的目录 master_binlog_dir=/var/lib/mysql # 指定一个脚本,该脚本实现了在主从切换以后,将虚拟IP漂移到新的Master上 master_ip_failover_script=/usr/bin/master_ip_failover # 指定用于二次检查节点状态的脚本 secondary_check_script=/usr/bin/masterha_secondary_check -s 192.168.190.151 -s 192.168.190.152 -s 192.168.190.154 # 配置集群中的节点信息 [server1] hostname=192.168.190.151 # 指定该节点能够参与Master选举 candidate_master=1 [server2] hostname=192.168.190.152 candidate_master=1 [server3] hostname=192.168.190.154 # 指定该节点不能参与Master选举 no_master=1
三、编写配置文件中所配置的master_ip_failover
脚本,该脚本是根据MHA的官方示例修改的,MHA默认并无提供。须要注意脚本中的几处地方须要根据实际状况进行修改,已用注释标明:
[root@manager ~]# vim /usr/bin/master_ip_failover #!/usr/bin/env perl use strict; use warnings FATAL => 'all'; use Getopt::Long; my ( $command, $orig_master_host, $orig_master_ip,$ssh_user, $orig_master_port, $new_master_host, $new_master_ip,$new_master_port, $orig_master_ssh_port,$new_master_ssh_port,$new_master_user,$new_master_password ); # 这里定义的虚拟IP能够根据实际状况进行修改 my $vip = '192.168.190.80/24'; my $key = '1'; # 这里的网卡名称 “ens32” 须要根据你机器的网卡名称进行修改 my $ssh_start_vip = "sudo /sbin/ifconfig ens32:$key $vip"; my $ssh_stop_vip = "sudo /sbin/ifconfig ens32:$key down"; my $ssh_Bcast_arp= "sudo /sbin/arping -I bond0 -c 3 -A $vip"; 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, 'orig_master_ssh_port=i' => \$orig_master_ssh_port, 'new_master_host=s' => \$new_master_host, 'new_master_ip=s' => \$new_master_ip, 'new_master_port=i' => \$new_master_port, 'new_master_ssh_port' => \$new_master_ssh_port, 'new_master_user' => \$new_master_user, 'new_master_password' => \$new_master_password ); exit &main(); sub main { $ssh_user = defined $ssh_user ? $ssh_user : 'root'; print "\n\nIN SCRIPT TEST====$ssh_user|$ssh_stop_vip==$ssh_user|$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(); &start_arp(); $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() { `ssh $ssh_user\@$orig_master_host \" $ssh_stop_vip \"`; } sub start_arp() { `ssh $ssh_user\@$new_master_host \" $ssh_Bcast_arp \"`; } sub usage { print "Usage: master_ip_failover --command=start|stop|stopssh|status --ssh_user=user --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"; }
还须要给该脚本添加可执行权限,不然MHA是没法调用的:
[root@manager ~]# chmod a+x /usr/bin/master_ip_failover
四、根据配置文件中remote_workdir
的配置,需在其余节点上建立MHA的远程工做目录:
[root@master ~]# mkdir /home/mysql_mha [root@slave-01 ~]# mkdir /home/mysql_mha [root@slave-02 ~]# mkdir /home/mysql_mha
五、在配置文件中指定了让manager
使用mha
这个用户来访问数据库节点,因此须要在master
节点上建立mha
用户:
create user 'mha'@'%' identified with mysql_native_password by 'Abc_123456'; grant all privileges on *.* to 'mha'@'%'; flush privileges;
六、完成以上全部步骤后,在manager
节点上使用masterha_check_ssh
和masterha_check_repl
对配置进行检查,其中masterha_check_ssh
用于检查ssh
登陆是否正常,而masterha_check_repl
则用于检查主从节点的复制链路是否正常:
[root@manager ~]# masterha_check_ssh --conf=/etc/mha/mysql_mha.cnf [root@manager ~]# masterha_check_repl --conf=/etc/mha/mysql_mha.cnf
执行结果以下:
七、以上检测都经过后,就能够启动MHA服务了。启动命令以下:
[root@manager ~]# nohup masterha_manager --conf=/etc/mha/mysql_mha.cnf &
启动完成后,可使用ps
命令查看masterha_manager
进程是否存在,以下存在则表明启动成功:
[root@manager ~]# ps aux |grep masterha_manager root 2842 0.3 1.1 299648 22032 pts/0 S 18:30 0:00 perl /usr/bin/masterha_manager --conf=/etc/mha/mysql_mha.cnf root 2901 0.0 0.0 112728 976 pts/0 R+ 18:31 0:00 grep --color=auto masterha_manager [root@manager ~]#
八、最后咱们须要到master
节点上,手动去配置虚拟IP。由于MHA只会在主从切换时漂移虚拟IP到新的Master节点,而不会在第一次启动时主动去设置Master的虚拟IP,因此咱们须要手动设置。设置虚拟IP的命令以下:
[root@master ~]# ifconfig ens32:1 192.168.190.80/24
设置成功后,使用ip addr
命令能够看到网卡上绑定的虚拟IP:
到此为止,咱们就已经完成了MHA高可用架构的搭建,接下来咱们对其进行一些简单的测试。例如,测试下是否能正常ping
通虚拟IP,毕竟应用端访问数据库时链接的是虚拟IP,因此首先得确保虚拟IP是可以被访问的。以下:
能ping
通以后,使用Navicat等远程链接工具测试下可否正常经过虚拟IP链接上数据库:
肯定了虚拟IP能正常访问后,接着测试MHA是否可以正常进行主从切换,首先将master
节点上的MySQL服务给停掉,模拟Master宕机:
[root@master ~]# systemctl stop mysqld
正常状况下,此时master
节点上的网卡就不会再绑定该虚拟IP:
而是会被MHA漂移到slave-01
节点的网卡上,由于此时该Slave就是新的Master:
接着进入slave-02
节点上的MySQL命令行终端,确认下该Slave是否已经正常与新的Master进行同步。以前咱们配置slave-02
的主库是master
,如今将master
停掉后,能够看到slave-02
的Master_Host
已经被MHA切换成了slave-01
的IP:
通过以上测试后,能够看到咱们搭建的MHA架构是可以正常运行的,已经使得Replication集群拥有了基本的高可用能力,即使Master下线后也能正常从Slave中选举新的Master并进行切换,也正确创建了其余Slave与新Master的复制链路。
ssh
免密登陆,存在必定的安全隐患