MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司的youshimaton(现就职于Facebook公司)开发,是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件。在MySQL故障切换过程中,MHA能做到在0~30秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中,MHA能在最大程度上保证数据的一致性,以达到真正意义上的高可用。
该软件由两部分组成:MHA Manager(管理节点)和MHA Node(数据节点)。
目前MHA主要支持一主多从的架构。要搭建MHA,要求一个复制集群中必须最少有三台数据库服务器,一主二从,即一台充当master,一台充当备用master,另外一台充当从库。因为至少需要三台服务器!淘宝也在该基础上进行了改造,目前淘宝TMHA已经支持一主一从。
MHA架构:
需要四台虚拟机进行实验环境,其中一台负责manager,其余三台配置mysql主从复制且必须是一主二从。
四台机器必须SSH免密登录,node端安装node相关包和依赖包,manager安装所有依赖包。
server1,2,3负责mysql主从复制,server4负责配置manager!
1.停止服务, 删除数据, 恢复初始状态:
[root@Server1 ~]# /etc/init.d/mysqld stop
[root@Server2 ~]# /etc/init.d/mysqld stop
[root@Server3 ~]# /etc/init.d/mysqld stop
2.对每台机器做相同操作
[root@server1 mysql]# rm -fr /data/mysql/*
[root@server1 mysql]# mysqld --initialize --user=mysql
root@server1 mysql]# /etc/init.d/mysqld start
[root@server1 mysql]# mysql -p
输入刚才初始化得到的密码
进入之后修改登陆密码
mysql> alter user root@localhost identified by 'westos';
3.配成一主两从
server2,server3一样!!
vim /etc/my.cnf
[mysqld]
basedir=/usr/local/mysql
datadir=/data/mysql
socket=/data/mysql/mysql.sock
server_id=1 #每个数据库都有一个不一样ID
gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
log_slave_updates=ON
log_bin=binlog
binlog_format=ROW
##对MASTER端
[root@Server1 data]# mysql -p ##登陆数据库
mysql> grant replication slave on *.* to repl@'%' identified by 'westos'; ##设置复制用户
mysql> grant all on *.* to root@'%' identified by 'westos'; ## 更改root登陆权限
mysql> show master status;
##对SLAVE端server2,server3!!
[root@Server2 data]# mysql -p
mysql> ALTER USER root@localhost identified by 'westos';
mysql> grant replication slave on *.* to repl@'%' identified by 'westos';
mysql> change master to master_host='172.25.1.1', master_user='repl', master_password='westos',MASTER_AUTO_POSITION = 1;
mysql> start slave;
mysql> show slave status\G;
对于server4:
我这里已经准备好了MHA-7的安装所需要的所有包:
直接传到server4上
scp -r MHA-7 server4:~
[root@server4 ~]# cd MHA-7
[root@server4 MHA-7]# ls
[root@server4 MHA-7]# scp mha4mysql-node-0.58-0.el7.centos.noarch.rpm [email protected].:
[root@server4 MHA-7]# scp mha4mysql-node-0.58-0.el7.centos.noarch.rpm [email protected]:
[root@server4 MHA-7]# scp mha4mysql-node-0.58-0.el7.centos.noarch.rpm [email protected]:
[root@server4 MHA-7]# tar zxf mha4mysql-manager-0.58.tar.gz
在server1,2,3把刚才传过来的包安装:
cd
yum install mha4mysql-node-0.58-0.el7.centos.noarch.rpm
继续在server4上操作:
cd mha4mysql-manager-0.58
ls
cd samples/conf/
cat masterha_default.cnf
mkdir /etc/masterha
cp app1.cnf /etc/masterha/
cd /etc/masterha/
ls
vim /etc/masterha/app1.cnf
#################################
user=root
password=westos
ssh_user=root
repl_user=repl
repl_password=westos
master_binlog_dir= /var/lib/mysql
remote_workdir=/tmp
secondary_check_script= masterha_secondary_check -s 172.25.1.250 -s 172.25.1.3
ping_interval=3
# master_ip_failover_script= /script/masterha/master_ip_failover
# shutdown_script= /script/masterha/power_manager
# report_script= /script/masterha/send_report
# master_ip_online_change_script= /script/masterha/master_ip_online_change
manager_workdir=/var/log/masterha/app1
manager_log=/var/log/masterha/app1/manager.log
[server1]
hostname=172.25.1.1
[server2]
hostname=172.25.1.2
candidate_master=1
[server3]
hostname=172.25.1.3
no_master=1
~
tar xf mysql-5.7.33-1.el7.x86_64.rpm-bundle.tar
yum install -y mysql-community-client-5.7.33-1.el7.x86_64.rpm mysql-community-common-5.7.33-1.el7.x86_64.rpm mysql-community-libs-5.7.33-1.el7.x86_64.rpm mysql-community-libs-compat-5.7.33-1.el7.x86_64.rpm mysql-community-server-5.7.33-1.el7.x86_64.rpm
检查SSH连通性,由于没有做免密一定会出现报错
[root@Server4 masterha]# masterha_check_ssh --conf=/etc/masterha/app.cnf
作免密登录
cd
cd .ssh/
[root@Server4 masterha]# ssh-keygen
[root@Server4 masterha]# ssh-copy-id Server1
[root@Server4 masterha]# ssh-copy-id Server2
[root@Server4 masterha]# ssh-copy-id Server3
[root@Server4 masterha]# scp -r ~/.ssh/ Server1:
[root@Server4 masterha]# scp -r ~/.ssh/ Server2:
[root@Server4 masterha]# scp -r ~/.ssh/ Server3:
再次检查通过
masterha_check_ssh --conf=/etc/masterha/app.cnf
做MHA切换等功能的检查,因为其他三台主机并没有安装配套的包因此也会报错
[root@Server4 masterha]# masterha_check_repl --conf=/etc/masterha/app.cnf
在server1,2,3上都需要安装,前面已经写了
yum install -y mha4mysql-node-0.58-0.el7.centos.noarch.rpm
若未授权,进入master主机msyql 给root用户远程登陆的权限
grant all on . to root@’%’ identified by ‘westos’;
检查成功通过
应该没问题会显示:
MySQL Replication Health is OK.
[root@Server4 masterha]# masterha_check_repl --conf=/etc/masterha/app.cnf
MASTER为1且存活, 将其切换到2
masterha_master_switch --conf=/etc/masterha/app.cnf --master_state=alive --new_master_host=172.25.1.2 --new_master_port=3306 --orig_master_is_new_slave --running_updates_limit=10000
MASTER为1且临时关闭模拟出现问题, 将其切换到2
masterha_master_switch --master_state=dead --conf=/etc/masterha/app.cnf -dead_master_host=172.25.1.2 --dead_master_port=3306 --new_master_host=172.25.5.1 --new_master_port=3306 --ignore_last_failover
此时集群中只有2台主机, Server2主Server3从, Server1死
masterha_check_repl --conf=/etc/masterha/app.cnf
会提示错误, 因为不满足一主两从配置
下载两个脚本
master_ip_failover master_ip_online_change
vim master_ip_failover
vim master_ip_online_change
将里面的ip地址改为自己的就ok
小脚本,自动切:
masterha_manager --conf=/etc/masterha/app1.cnf &
ps ax #查看后台进程
将一开始注释的配置文件中的脚本选项打开
vim /etc/masterha/app1.cnf
赋予运行权限
chmod +x master_ip_failover master_ip_online_change
修改其中的VIP为自己的172.25.1.100
添加到server2上:
然后直接停掉server上的数据库:
ip addr add 172.25.1.100/24 dev eth0
ip addr show
systemctl stop mysqld
然后可以在server4上看到刚后台执行的命令开始动作了:
注意这个时候刚才添加在server2上的ip172.25.1.100不在了,它飘到了server1上:
2上没有了:
然后重新将server2启动
systemctl start mysqld
mysql -p
change master to master_host='172.25.1.1', master_user='repl', master_password='westos', master_auto_position=1;
start slave;
masterha_master_switch --conf=/etc/masterha/app.cnf --master_state=alive --new_master_host=172.25.1.2 --new_master_port=3306 --orig_master_is_new_slave --running_updates_limit=10000