因为使用MHA是需要保证mysql服务器主机之前都是配置好主从复制的,我们gtid 的主从复制防止方便更改master节点时复制数据
将所有节点的配置文件里添加的配置更新为
log-bin=mysql-bin
server-id=2
gtid_mode=ON
enforce-gtid-consistency=ON
log_slave_updates=ON
log_bin=binlog
更新配置后需要重启mysqld服务。
mysql的三台主机配置完成后,我们需要第4台主机来配置高可用,在这台主机上安装MHA的软件包,这里需要的模块事比较多的,都需要安装
[root@sever4 Downloads]# ls MHA-7/
mha4mysql-manager-0.58-0.el7.centos.noarch.rpm
mha4mysql-manager-0.58.tar.gz
mha4mysql-node-0.58-0.el7.centos.noarch.rpm
perl-Config-Tiny-2.14-7.el7.noarch.rpm
perl-Email-Date-Format-1.002-15.el7.noarch.rpm
perl-Log-Dispatch-2.41-1.el7.1.noarch.rpm
perl-Mail-Sender-0.8.23-1.el7.noarch.rpm
perl-Mail-Sendmail-0.79-21.el7.noarch.rpm
perl-MIME-Lite-3.030-1.el7.noarch.rpm
perl-MIME-Types-1.38-2.el7.noarch.rpm
perl-Parallel-ForkManager-1.18-2.el7.noarch.rpm
安装完成后,还需要做的一件事是,因为这台主机是作为manager的,方式是通过ssh连接其他的3台主机去进行change master的动作,所以要配置免密对其他3台服务器主机
ssh-keygen #生成密钥
#对三台mysql服务器进行加密
ssh-copy-id 172.25.254.5
ssh-copy-id 172.25.254.6
ssh-copy-id 172.25.254.7
免密设置完成后,将这台主机下家目录下的.ssh文件传给其他3台主机的家目录下,这样所有的主机就都是免密连接了。
然后将 mha4mysql-node-0.58-0.el7.centos.noarch.rpm 安装包在3台mysql服务器上都安装
完成后在manager这台主机上创建配置目录,自行编写配置文件
[root@sever4 MHA-7]# mkdir /etc/masterha
[root@sever4 MHA-7]# vim /etc/masterha/masterha.cnf
[server default]
manager_workdir=/etc/masterha #指定工作目录
manager_log=/var/log/masterha.log #指定日志存放路径
master_binlog_dir=/etc/masterha #指定binlog存放路径
user=root
password=He1234..
ping_interval=1 #隔1秒试一次
remote_workdir=/tmp #临时存放的目录
repl_user=redhat #复制所用的用户
repl_password=He1234.. #复制所用的用户的密码
ssh_user=root
#指定我们的mysql服务器主机
[server1]
hostname=172.25.254.5
port=3306
[server2]
hostname=172.25.254.6
port=3306
candidate_master=1 #可晋升为master
check_repl_delay=0
[server3]
hostname=172.25.254.7
port=3306
no_master=1 #设置这台主机不会成为master节点
因为我们设置的ssh使用root用户连接,所以需要在master节点对root进行权限设置,使支持远程连接
mysql> grant all on *.* to root@'%' identified by 'He1234..';
mysql> flush privileges;
配置完成后开始检测,检测结果是ok、successfully就是可以的
masterha_check_ssh --conf=/etc/masterha/masterha.cnf #检测主机间的ssh连接是否通畅
masterha_check_repl --conf=/etc/masterha/masterha.cnf #检测主从复制完整性
再来测试自动和手动节点的切换方式
manager是自动切换master节点的工具
开启测试,如果使用ps -ax查询进程正常就可以再去关闭
[root@sever4 masterha]# nohup masterha_manager --conf=/etc/masterha/masterha.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/masterha.log 2>&1 &
#--remove_dead_master_conf 移除无法使用的master节点
#--ignore_last_failover 忽略上一次的错误
[root@sever4 masterha]# masterha_stop --conf=/etc/masterha/masterha.cnf #关闭manager
开启正常后,来测试切换效果,开启manager进程时,会带有守护进程,如果mysql主机中的mysqld的进程被关闭,还会自动开启新的进程
自动切换的测试,开启manager进程,模拟关闭master节点的mysqld服务,看效果
关闭现master节点的mysqld服务,可以看到manager进程也会自动退出
但是完成了新master节点的转换工作,slave节点已经连接到新的master上了
这些自动的操作过程都是在 /var/log/masterha.log 的日志里
所以说自动切换是字可以使用一次,如果再出故障就需要人工操作了,毕竟数据库对一个企业的重要性不言而喻,多次出故障是必须要及时解决的。
检测手动切换
离线切换:
当master宕机了,这时可以手动操作去切换到可以成为master节点的新主机上,关闭master节点的myald服务,执行切换命令
[root@sever4 masterha]# masterha_master_switch --master_state=dead --conf=/etc/masterha/masterha.cnf --dead_master_host=172.25.254.5 --dead_master_port=3306 --new_master_host=172.25.254.6 --new_master_port=3306
如果中途出现错误卡顿不动等现象,修复后重新执行时需要删除 /etc/masterha/masterha.failover.error 这个文件,
如果在执行过程中没有报错,但是卡顿住了,这时可能是之前的实验操作影响了数据同步,可解决的方法是将MySQL的3台主机mysqld服务删除原有数据重新安全初始化,再去配置主从复制即可
切换执行成功后在172.25.254.7主机上查看slave状态,因为配置的它是不会成为master的,所以它的新master只能是172.25.254.6.
在线切换:
master正常运行中,想要去切换其他节点为新master节点,
首先开启刚才关闭的mysqld服务,并设置主从复制到新的master上,然后执行切换命令
masterha_master_switch --master_state=alive --conf=/etc/masterha/masterha.cnf --new_master_host=172.25.254.5 --new_master_port=3306 --orig_master_is_new_slave --running_updates_limit=10000
执行成功后,master节点就变回了172.25.254.5上,并且其他两台主机的master执行也是它
每次执行切换成功后需要删除 /etc/masterha/masterha.failover.complete 文件,因为它存在时不会允许再进行自动切换
当MySQL的master节点发生更换时,它的主机ip也是会改变的,但是对于外部访问来说,这样的改变用户是不知晓的,所以就会导致无法正常访问从而降低用户的好感度。
对于这种情况,我们需要配置vip去保证不管内部的MySQL服务服务器如何变化,外部的访问都是一样的。
这里的配置需要使用到MHA的脚本文件,这两个文件都是在MHA的包中
mha4mysql-manager-0.58.tar.gz 解压MHA的压缩包在里面找到需要的脚本文件
将这两个脚本放到执行manager进程的主机的 /usr/local/bin/ 目录下。并增加执行权限
首先编辑 master_ip_failover 脚本
需要添加的内容
35 my $vip = '172.25.254.100/24'; #设置的vip
36 my $ssh_start_vip = "/sbin/ip addr add $vip dev ens33"; #添加vip的方式
37 my $ssh_stop_vip = "/sbin/ip addr del $vip dev ens33"; #删除vip的方式
然后编辑 master_ip_online_change 脚本
31 my $vip = '172.25.254.100/24';
32 my $ssh_start_vip = "/sbin/ip addr add $vip dev ens33";
33 my $ssh_stop_vip = "/sbin/ip addr del $vip dev ens33";
34 my $exit_code = 0;
保存退出后
在/etc/masterha/masterha.cnf这个配置文件里需要添加这两个执行脚本进去
master_ip_failover_script= /usr/local/bin/master_ip_failover
master_ip_online_change_script= /usr/local/bin/master_ip_online_change
测试
目前我们的MySQL节点分布是server6是master节点,server5和server7都是slave节点,尝试切换前,我们还需要在server6上添加我们的vip
使用在线手动切换测试,将server5变为新的master
可以看到执行的过程中停止了server6上的vip,在server5上开启了vip
去主机上查看详细信息可以看到现在的vip存在于server5
上
并且msql的master节点也切换到server5上了
手动切换成功后,再来测试manager进程自动切换
开启manager进程
关闭目前的master节点server5的mysqld服务
查看vip情况,已经转移到server6上,并且server6成为新的master节点
mysql> show variables like '%log%';
| slow_query_log | OFF #慢查询
| slow_query_log_file | /var/lib/mysql/server5-slow.log #产生慢查询保存的日志
mysql> set global slow_query_log=1; #开启慢查询功能
mysql> select sleep(10); #我们使用睡眠10秒来强制开启慢查询
+-----------+
| sleep(10) |
+-----------+
| 0 |
+-----------+
1 row in set (10.00 sec)
产生慢查询后可以在指定的日志路径查看日志信息
日志里会详细写标识出使用慢查询的用户,以及慢查询的命令,然后就可以针对这个执行命令和结果去优化sql语句块,从而优化整个mysql数据库的服务。