MySQL之MHA高可用配置及故障切换实现详细部署步骤
一、MHA介绍
(一)、什么是MHA
MHA(MasterHighAvailability)是一套优秀的MySQL高可用环境下故障切换和主从复制的软件。
MHA的出现就是解决MySQL单点的问题。
MySQL故障切换过程中,MHA能做到0-30秒内自动完成故障切换操作。
MHA能在故障切换的过程中最大程度上保证数据的一致性,以达到真正意义上的高可用。
(二)、MHA的组成
MHANode(数据节点)
MHANode运行在每台MySQL服务器上。
MHAManager(管理节点)
MHAManager可以单独部署在一台独立的机器上,管理多个master-slave集群;也可以部署在一台slave节点上。
MHAManager会定时探测集群中的master节点。当master出现故障时,它可以自动将最新数据的slave提升为新的master,然后将所有其他的slave重新指向新的master。整个故障转移过程对应用程序完全透明。
(三)、MHA的特点
- 自动故障切换过程中,MHA试图从宕机的主服务器上保存二进制日志,最大程度的保证数据不丢失
- 使用半同步复制,可以大大降低数据丢失的风险,如果只有一个slave已经收到了最新的二进制日志,MHA可以将最新的二进制日志应用于其他所有的slave服务器上,因此可以保证所有节点的数据一致性
- 目前MHA支持一主多从架构,最少三台服务,即一主两从
二、搭建MySQLMHA
(一)、实验思路:
1.MHA架构
1)数据库安装
2)一主两从
3)MHA搭建
2.故障模拟
1)主库失效
2)备选主库成为主库
3)原故障主库恢复重新加入到MHA成为从库
(二)、实验步骤
MHAmanager节点服务器:CentOS7.4(64位)manager/192.168.126.10,安装MHAnode和manager组件 Master节点服务器:CentOS7.4(64位)mysql1/192.168.126.20,安装mysql5.7、MHAnode组件 Slave1节点服务器:CentOS7.4(64位)mysql2/192.168.126.30,安装mysql5.7、MHAnode组件 Slave2节点服务器:CentOS7.4(64位)mysql3/192.168.126.40,安装mysql5.7、MHAnode组件
每台机子关闭防火墙
systemctlstopfirewalld systemctldisablefirewalld setenforce0
1、安装mysql15.7
Master、Slave1、Slave2节点上安装mysql5.7(mysql安装详见前期博文)
2、修改Master、Slave1、Slave2节点的主机名
hostnamectlset-hostnameMysql1 hostnamectlset-hostnameMysql2 hostnamectlset-hostnameMysql3
3、修改Master、Slave1、Slave2节点的Mysql主配置文件/etc/my.cnf
##Master节点##
vim/etc/my.cnf [mysqld] server-id=1 log_bin=master-bin log-slave-updates=true systemctlrestartmysqld
##Slave1、Slave2节点##
vim/etc/my.cnf server-id=2 #三台服务器的server-id不能一样 log_bin=master-bin relay-log=relay-log-bin relay-log-index=slave-relay-bin.index systemctlrestartmysqld
4.在Master、Slave1、Slave2节点上都创建两个软链接
ln-s/usr/local/mysql/bin/mysql/usr/sbin/ ln-s/usr/local/mysql/bin/mysqlbinlog/usr/sbin/
5.配置mysql一主两从
(1)所有数据库节点进行mysql授权
mysql-uroot-p grantreplicationslaveon*.*to'myslave'@'192.168.126.%'identifiedby'123'; #从数据库同步使用 grantallprivilegeson*.*to'mha'@'192.168.126.%'identifiedby'manager'; #manager使用 grantallprivilegeson*.*to'mha'@'Mysql1'identifiedby'manager'; #防止从库通过主机名连接不上主库 grantallprivilegeson*.*to'mha'@'Mysql2'identifiedby'manager'; grantallprivilegeson*.*to'mha'@'Mysql3'identifiedby'manager'; flushprivileges;
(2)在Master节点查看二进制文件和同步点
showmasterstatus;
(3)在Slave1、Slave2节点执行同步操作
changemastertomaster_host='192.168.126.20',master_user='myslave',master_password='123',master_log_file='master-bin.000001',master_log_pos=1747; startslave;
(4)在Slave1、Slave2节点查看数据同步结果
showslavestatus\G //确保IO和SQL线程都是Yes,代表同步正常。 Slave_IO_Running:Yes Slave_SQL_Running:Yes
(5)两个从库必须设置为只读模式:
setglobalread_only=1;
6.安装MHA软件
(1)所有服务器上都安装MHA依赖的环境,首先安装epel源
yuminstallepel-release--nogpgcheck-y
yuminstall-yperl-DBD-MySQL\ perl-Config-Tiny\ perl-Log-Dispatch\ perl-Parallel-ForkManager\ perl-ExtUtils-CBuilder\ perl-ExtUtils-MakeMaker\ perl-CPAN
(2)安装MHA软件包,先在所有服务器上必须先安装node组件
对于每个操作系统版本不一样,这里CentOS7.4必须选择0.57版本。
在所有服务器上必须先安装node组件,最后在MHA-manager节点上安装manager组件,因为manager依赖node组件。
安装包:
所有的服务器上必须安装node组件
cd/opt tarzxvfmha4mysql-node-0.57.tar.gz cdmha4mysql-node-0.57 perlMakefile.PL make&&makeinstall
(3)在MHAmanager节点上安装manager组件
cd/opt tarzxvfmha4mysql-manager-0.57.tar.gz cdmha4mysql-manager-0.57 perlMakefile.PL make&&makeinstall
manager组件安装后在/usr/local/bin下面会生成几个工具,主要包括以下几个:
- masterha_check_ssh检查MHA的SSH配置状况
- masterha_check_repl检查MySQL复制状况
- masterha_manger启动manager的脚本
- masterha_check_status检测当前MHA运行状态
- masterha_master_monitor检测master是否宕机
- masterha_master_switch控制故障转移(自动或者手动)
- masterha_conf_host添加或删除配置的server信息
- masterha_stop关闭manager
#node组件安装后也会在/usr/local/bin下面会生成几个脚本(这些工具通常由MHAManager的脚本触发,无需人为操作)主要如下:
save_binary_logs保存和复制master的二进制日志
apply_diff_relay_logs识别差异的中继日志事件并将其差异的事件应用于其他的slave
filter_mysqlbinlog去除不必要的ROLLBACK事件(MHA已不再使用这个工具)
purge_relay_logs清除中继日志(不会阻塞SQL线程)
7.在所有服务器上配置无密码认证
(1)在manager节点上配置到所有数据库节点的无密码认证
ssh-keygen-trsa#一路按回车键 ssh-copy-id192.168.126.20 ssh-copy-id192.168.126.30 ssh-copy-id192.168.126.40
(2)在mysql1上配置到数据库节点mysql2和mysql3的无密码认证
ssh-keygen-trsa ssh-copy-id192.168.126.30 ssh-copy-id192.168.126.40
(3)在mysql2上配置到数据库节点mysql1和mysql3的无密码认证
ssh-keygen-trsa ssh-copy-id192.168.126.20 ssh-copy-id192.168.126.40
(4)在mysql3上配置到数据库节点mysql1和mysql2的无密码认证
ssh-keygen-trsa ssh-copy-id192.168.126.20 ssh-copy-id192.168.126.30
8.在manager节点上配置MHA
(1)在manager节点上复制相关脚本到/usr/local/bin目录
cp-rp/opt/mha4mysql-manager-0.57/samples/scripts/usr/local/bin //拷贝后会有四个执行文件 ll/usr/local/bin/scripts/ master_ip_failover#自动切换时VIP管理的脚本 master_ip_online_change#在线切换时vip的管理 power_manager#故障发生后关闭主机的脚本 send_report#因故障切换后发送报警的脚本
(2)复制上述的自动切换时VIP管理的脚本到/usr/local/bin目录,这里使用master_ip_failover脚本来管理VIP和故障切换
cp/usr/local/bin/scripts/master_ip_failover/usr/local/bin
(3)修改内容如下:(删除原有内容,直接复制并修改vip相关参数)
vim/usr/local/bin/master_ip_failover #!/usr/bin/envperl usestrict; usewarningsFATAL=>'all'; useGetopt::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.126.200'; #指定vip的地址 my$brdc='192.168.126.255'; #指定vip的广播地址 my$ifdev='ens33'; #指定vip绑定的网卡 my$key='1'; #指定vip绑定的虚拟网卡序列号 my$ssh_start_vip="/sbin/ifconfigens33:$key$vip"; #代表此变量值为ifconfigens33:1192.168.126.200 my$ssh_stop_vip="/sbin/ifconfigens33:$keydown"; #代表此变量值为ifconfigens33:1192.168.126.200down my$exit_code=0; #指定退出状态码为0 #my$ssh_start_vip="/usr/sbin/ipaddradd$vip/24brd$brdcdev$ifdevlabel$ifdev:$key;/usr/sbin/arping-q-A-c1-I$ifdev$vip;iptables-F;"; #my$ssh_stop_vip="/usr/sbin/ipaddrdel$vip/24dev$ifdevlabel$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(); submain{ print"\n\nINSCRIPTTEST====$ssh_stop_vip==$ssh_start_vip===\n\n"; if($commandeq"stop"||$commandeq"stopssh"){ my$exit_code=1; eval{ print"DisablingtheVIPonoldmaster:$orig_master_host\n"; &stop_vip(); $exit_code=0; }; if($@){ warn"GotError:$@\n"; exit$exit_code; } exit$exit_code; } elsif($commandeq"start"){ my$exit_code=10; eval{ print"EnablingtheVIP-$viponthenewmaster-$new_master_host\n"; &start_vip(); $exit_code=0; }; if($@){ warn$@; exit$exit_code; } exit$exit_code; } elsif($commandeq"status"){ print"CheckingtheStatusofthescript..OK\n"; exit0; } else{ &usage(); exit1; } } substart_vip(){ `ssh$ssh_user\@$new_master_host\"$ssh_start_vip\"`; } AsimplesystemcallthatdisabletheVIPontheold_master substop_vip(){ `ssh$ssh_user\@$orig_master_host\"$ssh_stop_vip\"`; } subusage{ 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"; }
(4)创建MHA软件目录并拷贝配置文件,这里使用app1.cnf配置文件来管理mysql节点服务器
mkdir/etc/masterha cp/opt/mha4mysql-manager-0.57/samples/conf/app1.cnf/etc/masterha
vim/etc/masterha/app1.cnf #删除原有内容,直接复制并修改节点服务器的IP地址 [serverdefault] 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 password=manager ping_interval=1 remote_workdir=/tmp repl_password=123 repl_user=myslave secondary_check_script=/usr/local/bin/masterha_secondary_check-s192.168.126.30-s192.168.126.40 shutdown_script="" ssh_user=root user=mha [server1] hostname=192.168.126.20 port=3306 [server2] candidate_master=1 check_repl_delay=0 hostname=192.168.126.30 port=3306 [server3] hostname=192.168.126.40 port=3306
[serverdefault] manager_log=/var/log/masterha/app1/manager.log#manager日志 manager_workdir=/var/log/masterha/app1.log#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秒,尝试三次没有回应的时候自动进行failover remote_workdir=/tmp #设置远端mysql在发生切换时binlog的保存位置 repl_password=123 #设置复制用户的密码 repl_user=myslave #设置复制用户的用户 report_script=/usr/local/send_report#设置发生切换后发送的报警的脚本 secondary_check_script=/usr/local/bin/masterha_secondary_check-s192.168.126.30-s192.168.126.40 #指定检查的从服务器IP地址 shutdown_script="" #设置故障发生后关闭故障主机脚本(该脚本的主要作用是关闭主机防止发生脑裂,这里没有使用) ssh_user=root #设置ssh的登录用户名 user=mha #设置监控用户root [server1] hostname=192.168.126.20 port=3306 [server2] hostname=192.168.126.30 port=3306 candidate_master=1 #设置为候选master,设置该参数以后,发生主从切换以后将会将此从库提升为主库,即使这个主库不是集群中最新的slave check_repl_delay=0 #默认情况下如果一个slave落后master超过100M的relaylogs的话,MHA将不会选择该slave作为一个新的master,因为对于这个slave的恢复需要花费很长时间;通过设置check_repl_delay=0,MHA触发切换在选择一个新的master的时候将会忽略复制延时,这个参数对于设置了candidate_master=1的主机非常有用,因为这个候选主在切换的过程中一定是新的master [server3] hostname=192.168.126.40 port=3306
9.第一次配置需要在Master节点上手动开启虚拟IP
/sbin/ifconfigens33:1192.168.126.200/24
10.在manager节点上测试ssh无密码认证,如果正常最后会输出successfully,如下所示。
masterha_check_ssh-conf=/etc/masterha/app1.cnf
11.在manager节点上测试mysql主从连接情况,最后出现MySQLReplicationHealthisOK字样说明正常。如下所示。
masterha_check_repl-conf=/etc/masterha/app1.cnf
12.在manager节点上启动MHA
nohupmasterha_manager--conf=/etc/masterha/app1.cnf--remove_dead_master_conf--ignore_last_failover/var/log/masterha/app1/manager.log2>&1&
–remove_dead_master_conf:该参数代表当发生主从切换后,老的主库的ip将会从配置文件中移除。
–manger_log:日志存放位置。
–ignore_last_failover:在缺省情况下,如果MHA检测到连续发生宕机,且两次宕机间隔不足8小时的话,则不会进行Failover,之所以这样限制是为了避免ping-pong效应。该参数代表忽略上次MHA触发切换产生的文件,默认情况下,MHA发生切换后会在日志记目录,也就是上面设置的日志app1.failover.complete文件,下次再次切换的时候如果发现该目录下存在该文件将不允许触发切换,除非在第一次切换后收到删除该文件,为了方便,这里设置为–ignore_last_failover。
13.查看MHA状态,可以看到当前的master是Mysql1节点。
masterha_check_status--conf=/etc/masterha/app1.cnf
14.查看MHA日志,也以看到当前的master是192.168.126.20,如下所示。
cat/var/log/masterha/app1/manager.log|grep"currentmaster"
查看Mysql1的VIP地址192.168.126.200是否存在,这个VIP地址不会因为manager节点停止MHA服务而消失。
ifconfig //若要关闭manager服务,可以使用如下命令。 masterha_stop--conf=/etc/masterha/app1.cnf 或者可以直接采用kill进程ID的方式关闭。
(三)、故障模拟
#在manager节点上监控观察日志记录
tail-f/var/log/masterha/app1/manager.log
#在Master节点Mysql1上停止mysql服务
systemctlstopmysqld 或 pkill-9mysql
#正常自动切换一次后,MHA进程会退出。HMA会自动修改app1.cnf文件内容,将宕机的mysql1节点删除。查看mysql2是否接管VIP
ifconfig
故障切换备选主库的算法:
1.一般判断从库的是从(position/GTID)判断优劣,数据有差异,最接近于master的slave,成为备选主。
2.数据一致的情况下,按照配置文件顺序,选择备选主库。
3.设定有权重(candidate_master=1),按照权重强制指定备选主。
(1)默认情况下如果一个slave落后master100M的relaylogs的话,即使有权重,也会失效。
(2)如果check_repl_delay=0的话,即使落后很多日志,也强制选择其为备选主。
故障修复步骤:
1.修复mysql
systemctlrestartmysqld
2.修复主从
#在现主库服务器Mysql2查看二进制文件和同步点 showmasterstatus;
#在原主库服务器mysql1执行同步操作 changemastertomaster_host=‘192.168.126.30',master_user=‘myslave',master_password=‘123',master_log_file=‘master-bin.000001',master_log_pos=1747; startslave; showslavestatus\G
3.在manager节点上修改配置文件app1.cnf(再把这个记录添加进去,因为它检测掉失效时候会自动消失)
vim/etc/masterha/app1.cnf ...... secondary_check_script=/usr/local/bin/masterha_secondary_check-s192.168.126.20-s192.168.126.40 ...... [server1] hostname=192.168.126.30 port=3306 [server2] candidate_master=1 check_repl_delay=0 hostname=192.168.126.20 port=3306 [server3] hostname=192.168.126.40 port=3306
4.在manager节点上启动MHA
nohupmasterha_manager--conf=/etc/masterha/app1.cnf--remove_dead_master_conf--ignore_last_failover/var/log/masterha/app1/manager.log2>&1&
#解决中英字不兼容报错的问题 dos2unix/usr/local/bin/master_ip_failover
到此这篇关于MySQL之MHA高可用配置及故障切换实现详细部署步骤的文章就介绍到这了,更多相关MySQLMHA高可用配置内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。