MySQL的主从能解决读操作的可用性,如果从节点挂掉,也可以通过其他从节点继续提供读的操作,但是主节点的单点问题没有解决,因此在日常生产中会利用MHA配合主从架构来实现数据库的高可用。
MHA工作逻辑:
MHA会利用Select 1 As Value指令判断master服务器的健康性,一旦master down机之后,MHA从down机崩溃的master中把二进制日志保存下来,然后判断有最新数据更新的slave,
数据最全的slave应用中继日志的数据差,把差异数据同步到其他slave上,使之与其数据保持一致
应用从master上保存的二进制日志同步到所有slave节点上
这样所有节点上的数据都是一致的,
提升一个slave为新的master
使其他的slave连接新的master进行复制
故障master将被踢出集群,清除配置信息
MHA是一次性高可用性解决方案,只防止一次性的损坏,提升主节点之后即退出
选举新的master
如果设定权重candidate_master=1,按照权重强制指定新主,但是默认情况下如果一个slave落后master二进制日志超过100M的relay logs,即使有权重也会失效,如果设置check_repl_delay=0,即使落后很多日志,也会强制选择其为新主
如果slave节点数据之间有差异,最接近master的slave会成为新主
如果所有slave节点的数据都一致,按照配置文件顺序最前面的当新主
注意:为了尽可能的减少master服务器硬件损坏down机造成的数据丢失,因此在配置MHA的同时建议配置成MySQL的半同步复制
实现MHA集群架构:
10.0.0.7 manager(安装mha4mysql-manager包和mha4mysql-node包)
mha4mysql-manager包只兼容mysql5.7和mysql8.0,但和centos8上的mariaDB10.3不兼容
10.0.0.8 MySQL8.0 master(安装mha4mysql-node包)
10.0.0.18 MySQL8.0 slave1(安装mha4mysql-node包)
10.0.0.28 MySQL8.0 slave2(安装mha4mysql-node包)
10.0.0.7 manager安装mha4mysql-manager包和mha4mysql-node包
[root@mha ~]# yum -y install mha4mysql-manager-0.58-0.el7.centos.noarch.rpm
[root@mha ~]# yum -y install mha4mysql-node-0.58-0.el7.centos.noarch.rpm
10.0.0.8 MySQL8.0 master安装mha4mysql-node包
[16:43:25 root@master ~]$yum -y install mha4mysql-node-0.58-0.el7.centos.noarch.rpm
10.0.0.18 MySQL8.0 master安装mha4mysql-node包
[16:44:32 root@slave1 ~]$yum -y install mha4mysql-node-0.58-0.el7.centos.noarch.rpm
10.0.0.28 MySQL8.0 master安装mha4mysql-node包
[16:45:24 root@slave2 ~]$yum -y install mha4mysql-node-0.58-0.el7.centos.noarch.rpm
在所有的节点实现相互之间的ssh key验证
生成密钥
[root@mha ~]# ssh-keygen
Copy到自己的系统
[root@mha ~]# ssh-copy-id 127.0.0.1
将此目录分别拷贝到其他三个节点
[root@mha ~]# scp -r .ssh 10.0.0.8:
[root@mha ~]# scp -r .ssh 10.0.0.18:
[root@mha ~]# scp -r .ssh 10.0.0.28:
ssh验证
在管理节点上建立配置文件(配置文件写完查看一下不要有空格一类的操作,不然服务会失败)
[root@mha ~]# mkdir /etc/mastermha
[root@mha ~]# vim /etc/mastermha/app1.cnf
准备vip飘移脚本(脚本为官方站点下载)
根据配置文件要求把脚本放到/usr/local/bin下
[root@mha mastermha]# mv master_ip_failover /usr/local/bin
脚本加执行权限
[root@mha mastermha]# chmod +x /usr/local/bin/master_ip_failover
准备MHA提醒邮件脚本,根据配置文件要求把脚本放到/usr/local/bin下
加执行权限
[root@mha mastermha]# chmod +x /usr/local/bin/sendmail.sh
创建二进制日志目录,在主从节点上约定好放二进制日志的路径
[23:28:49 root@master ~]$mkdir /data/mysql/
[22:37:30 root@slave1 ~]$mkdir /data/mysql/
[22:37:57 root@slave2 ~]$mkdir /data/mysql/
建好之后更改属性
[23:30:00 root@master ~]$chown mysql.mysql /data/mysql/
[23:30:13 root@slave1 ~]$chown mysql.mysql /data/mysql/
[23:30:18 root@slave2 ~]$chown mysql.mysql /data/mysql/
在master上创建配置文件(skip_name_resolve=1名字解析,如果不加这一项可能会尝试把ip地址解析成名字,有可能会导致连接不成功,general_log通用日志是为了配合观察发生的操作,为了实验效果,非必须项,生产中无需启用)
[23:37:46 root@master ~]$vim /etc/my.cnf
重启数据库服务,当然也可以设为立即启动并开机启动
[23:50:49 root@master ~]$systemctl restart mysqld
[23:51:14 root@master ~]$systemctl enable --now mysqld
观察master二进制日志位置
创建远程连接帐号
赋予它进行复制的权限
设置一个用于配置修改mysql配置的关联帐号
并赋予它所有的权限,让它将来用于修改slave信息方便易主
在主节点上配置vip,在eth0:1的接口上增加一个vip,加上以后除了原有的ip以外,又增加了一个新的ip,实现飘移vip,用于将来用户访问
[00:21:35 root@master ~]$ifconfig eth0:1 10.0.0.100/24
配置slave的配置文件
[17:33:41 root@slave1 ~]$vim /etc/my.cnf
[17:40:11 root@slave2 ~]$vim /etc/my.cnf
slave数据库设为开机启动并立即启动
[17:43:11 root@slave1 ~]$systemctl enable --now mysqld
[17:42:25 root@slave2 ~]$systemctl enable --now mysqld
登录两个slave数据库配置change master
开启slave线程
查看线程状态
导入文件测试复制环境
[19:03:52 root@master ~]$ mysql < hellodb_innodb.sql
检测两个slave节点的同步没有问题
探测四个节点之间ssh的相互通讯,复制情况
[root@mha ~]# masterha_check_ssh --conf=/etc/mastermha/app1.cnf
[root@mha ~]# masterha_check_repl --conf=/etc/mastermha/app1.cnf
观察日志
探测主节点目前是健康状态,每秒发送Select 1 as value的健康指令
模拟主节点down机,停掉master节点
[23:14:10 root@master ~]$systemctl stop mysqld
观察mha节点的日志会有提示,同时会发邮件通知,MHA执行完任务之后会立即退出
登录新主节点,已经没有两个线程的信息,而且read only属性也已更改,vip也已成功飘移
登录slave1查看状态,master已显示新主节点的ip
到此,MySQL高可用性MHA模拟完成。



