MHA目前是MYSQL高可用方面相对成熟的解决方案,是一套优秀的作为mysql高可用环境下故障切换和主从提升的高可用软件。在mysql故障切换过程中,MHA能做到在0-30m之内自动完成数据库的故障切换操作,并且在 进行故障切换的过程中,MHA能在最大程度上保证数据的一致性,以达到真正意义上的高可用。
该软件由两分布组成:管理结点和数据结点。管理结点可以单独部署在一台独立的机器上管理多个master-slave集群,也可以部署在一台slave节点上。MHA Node运行在每台mysql服务器上,管理结点会定时探测集群中的master节点,当master出现故障时,它可以自动将最新数据的slave提升为新的master,然后将所有其他的slave重新指向新的master。整个故障转移过程对应用程序完全透明。
在MHA自动故障切换过程中,MHA试图从宕机的主服务器上保存二进制日志,最大程度的保证数据不丢失,但这并不总是可行的。
目前MHA主要支持一主多从的架构,要搭建MHA,要求一个复制集群中必须最少有三台服务器,一主二从,即一台充当master,一台充当备用master,另外一台充当从库。
MHA工作原理:
1.从宕机崩溃的master保存二进制日志事件(binlog events)
2.识别含有最新更新的slave
3.应用差异的中继日志(relay log)到其他的slave;
4.应用从master保存的二进制日志事件(binlog events)
5.提升一个slave为新的master
6.使其他的slave连接新的master进行复制
MHA软件由两部分组成,Manager工具包和Node工具包
Manager工具包主要包括以下几个工具:
masterha_check_ssh 检查MHA的SSH配置状况
masterha_check_repL 查mysql复制状况
masterha_manger 启动MHA
masterha_check_status 检查当前MHA运行状态
masterha_master_monitor 检查master是否宕机
masterha_master_switch 控制故障转移(自动或者手动 )
masterha_conf_host 添加或删除配置的server信息
Node工具包
save_binary_logs 保存和复制master的二进制日志
apply_diff_relay_logs 识别和差异的中继日志事件并将其差异的事件应用于其他的slave
filter_mysqlbinlog 去除不必要的ROLLBACK事件(MHA已不再使用这个工具)
purge_relay_logs 清除中继日志(不会阻塞sql线程)
操作:
环境,准备三台服务器 三台虚拟机都要做
1.时间同步
echo "*/5 * * * * /usr/sbin/ntpdate ntpl.aliyun.com >/dev/null 2>&1" >>/var/spool/cron/root
2.hosts解析 在做hosts解析前可以修改一下主机名 三台虚拟机都要修改
vim /etc/hostname
cen701
修改好了之后需要关机重启
cat >>/etc/hosts<<EOF
cen701 10.0.0.41 三台服务器的ip
cen702 10.0.0.43
cen703 10.0.0.44
<<EOF
互相配置ssh免密登录
yum -y install sshpass
vim test.sh
#!/bin/bash
UserName=root
IPlist=(10.0.0.41 10.0.0.43 10.0.0.44)
ssh-keygen -t dsa -f ~/.ssh/id_dsa -P "" &>/dev/nu11
for i in ${IPlist[*]}
do
sshpass -p "123456" ssh-copy-id -i ~/.ssh/id_dsa.pub -p 22 -o StrictHostKeyChecking=no $UserName@$i &>/dev/nu11
done
保存退出之后执行
sh test.sh
我们可以验证一下
ssh root@10.0.0.44 看看是否还要输入密码不输入就证明正确
2.安装mysql 三台服务器都需要安装
wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm
rpm -ivh mysql-community-release-el7-5.noarch.rpm
yum install mysql-server -y
启动
systemctl restart mysql
修改密码
mysql
>update mysql.user set password=password('123456') where user='root' and host='localhost';
>flush privileges;
3.编辑配置文件 第一台master的配置
第一台 master主机
vim /etc/my.cnf
[mysqld]
server-id=1
log-bin=mysql-bin
#禁止mysql自动删除relaylog工能
relay_log_purge = 0
#mysql5.6已上的特性,开启gtid,必须主从全开
gtid_mode = on
enforce_gtid_consistency = 1
log_slave_updates = 1
skip-name-resolve
重启mysql
systemctl restart mysql
4.创建同步的用户
mysql -uroot -p123456
mysql> grant replication slave on *.* to 'rep'@'10.0.0.%' identified by '123456';
mysql> flush privileges;
查看mysql主库的master状态
mysql> show master status\G;
查看gid的状态
mysql> show global variables like '%gtid%';
5.编辑配置文件 第二台服务器从的操作
vim /etc/my.cnf
[mysqld]
server-id=2
log-bin=mysql-bin
#禁止mysql自动删除relaylog工能
relay_log_purge = 0
#mysql5.6已上的特性,开启gtid,必须主从全开
gtid_mode = on
enforce_gtid_consistency = 1
log_slave_updates = 1
skip-name-resolve
重启mysql
systemctl restart mysql
创建同步用户
mysql -uroot -p123456
mysql> grant replication slave on *.* to 'rep'@'10.0.0.%' identified by '123456';
mysql> flush privileges;
关闭从服务器的复制功能
mysql -uroot -p123456
mysql> stop slave;
配置从服务器指向master
change master to
master_host='10.0.0.41',
master_user='rep',
master_password='123456',
master_log_file='mysql-bin.0000001',
master_log_pos=530;
开启从服务器的复制功能
mysql>start slave;
检查从服务器的复制功能
mysql>show slave status \G;
6.编辑第三台的配置文件
vim /etc/my.cnf
[mysqld]
server-id=3
log-bin=mysql-bin
#禁止mysql自动删除relaylog工能
relay_log_purge = 0
#mysql5.6已上的特性,开启gtid,必须主从全开
gtid_mode = on
enforce_gtid_consistency = 1
log_slave_updates = 1
skip-name-resolve
重启mysql
systemctl restart mysql
创建同步的用户
mysql -uroot -p123456
mysql> grant replication slave on *.* to 'rep'@'10.0.0.%' identified by '123456';
mysql> flush privileges;
关闭从服务器的复制功能
mysql -uroot -p123456
mysql> stop slave;
配置从服务器指向master
change master to
master_host='10.0.0.41',
master_user='rep',
master_password='123456',
master_log_file='mysql-bin.0000001',
master_log_pos=530;
开启从服务器的复制功能
mysql>start slave;
检查从服务器的复制功能状态
mysql> show slave status \G;
7.安装MHA 所有节点都需要操作
安装依赖
yum install perl-DBD-MySQL -y
yum install -y perl-Config-Tiny epel-release perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes
授权MHA管理用户
mysql>grant all privileges on *.* to mha@'10.0.0.%' identified by 'mha';
mysql>flush privileges;
安装MHA node节点
上传mha4mysql-node-0.58-0.el7.centos.noarch
rpm -ivh mha4mysql-node-0.58-0.el7.centos.noarch.rpm
安装MHA管理节点 这里选择第三台服务器
上传mha4mysql-manager-0.58-0.el7.centos.noarch
rpm -ivh mha4mysql-manager-0.58-0.el7.centos.noarch.rpm
配置MHA
mkdir -p /etc/mha
mkdir -p /var/log/mha/app1
vim /etc/mha/app1.cnf
[server default]
manager_log=/var/log/mha/app1/manager.log
manager_workdir=/var/log/mha/app1
master_binlog_dir=/var/lib/mysql #binlog的目录,如果说miysql的环境不一样,binlog位置不同,每台服务器的binlog的位置写在server标签里面即可
user=mha
password=mha
ping_interval=2
repl_password=123456
repl_user=rep
ssh_user=root
[server1]
hostname=10.0.0.41
port=3306
[server2]
hostname=10.0.0.43
port=3306
[server3]
hostname=10.0.0.44
port=3306
ignore_fail=1 #如果这个节点挂了,mha将不可用,加上这个参数,slave挂了一样可以用
no_master=1 #从不将这台主机转换为master
启动测试
ssh检查测试
masterha_check_ssh --conf=/etc/mha/app1.cnf
masterha_check_repl --conf=/etc/mha/app1.cnf
可以之后 需要启动
nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/mha/app1/manager.log 2>&1 &
查看进程
ps -ef|grep mha
查看状态
masterha_check_status --conf=/etc/mha/app1.cnf
接下来可以测试MHA故障转移
停掉cen701的主库10.0.0.41
systemctl stop mysql
查看cen703的状态,看看Master_Host是否变成了第二台服务器的ip
mysql -uroot -p123456 -e 'show slave status\G;'
查看cen702的master状态
mysql -uroot -p123456 -e 'show master status;'
回到第三台服务器我们查看一下我们添加的内容
cat /etc/mha/app1.cnf
我们发现这时候 我们server1的标签已经没有了,这是因为我们mha帮我们完成了这个效果
8.故障还原
在第三台服务器上我们查看一下故障
grep "CHANGE MASTER TO MASTER" /var/log/mha/app1/manager.log | tail -1
回到第一台服务器
重启mysql
systemctl restart mysql
这里是第三台服务器报的提示
mysql -uroot -p123456 -e "CHANGE MASTER TO MASTER_HOST='10.0.0.43', MASTER_PORT=3306,
MASTER_AUTO_POSITION=1, MASTER_USER='rep', MASTER_PASSWORD='123456';"
mysql -uroot -p123456 -e 'start slave;'
mysql -uroot -p123456 -e 'show slave status\G;'
配置vip飘逸
首先我们需要MHA的脚本
重命名为master_ip_failover.sh
将脚本放到 /usr/bin下并且给上权限 chmod +x /usr/bin/master_ip_failover.sh
修改配置文件
vim /etc/mha/app1.cnf
添加上一行
master_ip_failover_script=/usr/bin/master_ip_failover
模拟主库宕机vip飘逸
现在我们的cen702是master 所以现在需要在第二台服务器上操作
手动添加vip
ifconfig ens33:1 10.0.0.100/24 和MHAvip飘逸的脚本里面的vip保持一致
ip a show ens33
这时候就可以发现已经多了一个vip100了
此时关闭mysql
systemctl stop mysql
vip飘逸会有延迟几秒,此时可以再查看一下ens33
ip a show ens33
此时的vip已经去了cen701上面了