1.MHA简介
1.工作原理
2.MHA组件
MHA Manager(管理节点):可以单独部署(管理多个集群)也可以部署在一台slave中
MHA Node(数据节点):MHA Node运行在每台mysql服务器上,MHA Manager会定期探测集群中的master节点,当master故障时数据的slave提升为master,其他slave指向新的master。
3.组件介绍
4.MHA工具
2. MHA环境搭建
1.准备四台机器,搭建一主两备的主从架构,最后一台机器是MHA-Manager节点
主从同步参考mysql主从复制(在线热备)_未来守护者、的博客-CSDN博客第四步基于GTIDs搭建部分
四台机器提前准备了安装MHA所需要的依赖包及软件包,四台机器都自建本地yum仓库
1.上传软件包到/soft/mha目录
mkdir -p /soft/mha
2.配置本地yum源
vim /etc/yum.repos.d/local.repo
[mha]
name=mha soft
baseurl=file:///soft/mha/mha-yum
enabled=1
gpgcheck=0
3.测试MHA依赖库的yum源
yum -y install perl-DBD-MySQL \
perl-Config-Tiny \
perl-Time-HiRes \
perl-Mail-Sender \
perl-Mail-Sendmail \
perl-MIME-Base32 \
perl-MIME-Charset \
perl-MIME-EncWords \
perl-Params-Classify \
perl-Params-Validate.x86_64 \
perl-Log-Dispatch \
perl-Parallel-ForkManager \
net-tools
4、在MHA管理节点安装以下软件
yum –y install mha4mysql-manager-0.57-0.el7.noarch.rpm
yum –y install mha4mysql-node-0.57-0.el7.noarch.rpm
四个节点都安装node的软件包
yum –y install mha4mysql-node-0.57-0.el7.noarch.rpm
5.在四台机器上创建一个普通账号admin,密码123
useradd admin
echo 123|passwd --stdin admin
6.配置mha管理节点到其他主机的互信(root免密登录)
[root@mha ~]# su - admin
[admin@mha ~]$ ssh-keygen -P "" -f ~/.ssh/id_rsa
[admin@mha ~]$ cd .ssh/
[admin@mha .ssh]$ ls
id_rsa id_rsa.pub
[admin@mha .ssh]$ mv id_rsa.pub authorized_keys
[admin@mha .ssh]$ for i in 10 20 30;do scp -r ../.ssh/ 10.1.1.$i:~/;done
7.数据库master主节点配置admin账户的sudo权限
[root@master ~]# vim /etc/sudoers.d/admin
#User_Alias 表示具有sudo权限的用户列表; Host_Alias表示主机的列表
User_Alias MYSQL_USERS = admin
#Runas_Alias 表示用户以什么身份登录
Runas_Alias MYSQL_RUNAS = root
#Cmnd_Alias 表示允许执行命令的列表(命令需要使用完整路径)
Cmnd_Alias MYSQL_CMNDS = /sbin/ifconfig,/sbin/arping
MYSQL_USERS ALL = (MYSQL_RUNAS) NOPASSWD: MYSQL_CMNDS
权限分发到slave1和slave2(故障来临时,备服务器可以自己设置vip)
[root@master ~]# for i in 20 30;do scp /etc/sudoers.d/admin 10.1.1.$i:/etc/sudoers.d/;done
8.数据库master测试vip
# su - admin
[admin@master ~]$ sudo /sbin/ifconfig ens33:1 10.1.1.100 broadcast 10.1.1.255 netmask 255.255.255.0
[admin@master ~]$ sudo /sbin/arping -fqc 5 -w 5 -I ens33 -s 10.1.1.100 -U 10.1.1.10
[admin@master ~]$ ip a
9.MHA服务器:创建工作目录
[root@mha ~]# mkdir /etc/mha/
[root@mha ~]# mkdir -p /data/mha/masterha/app1
[root@mha ~]# chown -R admin. /data/mha
10.创建mha局部配置文件:
[root@mha ~]# vim /etc/mha/app1.conf
[server default]
# 设置监控用户和密码(修改1)
user=mha
password=123
# 设置复制环境中的复制用户和密码(修改2)
repl_user=slave
repl_password=123
# 设置ssh的登录用户名(修改3)
ssh_user=admin
# 设置监控主库,发送ping包的时间间隔,默认是3秒,尝试三次没有回应的时候自动进行failover
ping_interval=3
# 设置mgr的工作目录
manager_workdir=/data/mha/masterha/app1
# 设置mysql master保存binlog的目录,以便MHA可以找到master的二进制日志(修改4)
master_binlog_dir=/usr/local/mysql/data
# 设置master的pid文件(修改5)
master_pid_file=/usr/local/mysql/data/master.itcast.cn.pid
# 设置mysql master在发生切换时保存binlog的目录(在mysql master上创建这个目录)
remote_workdir=/data/mysql/mha
# 设置mgr日志文件(MHA遇到问题,主要看这个日志)
manager_log=/data/mha/masterha/app1/app1-3306.log
# MHA到master的监控之间出现问题,MHA Manager将会尝试从slave1和slave2登录到master上
secondary_check_script=/usr/bin/masterha_secondary_check -s 10.1.1.20 -s 10.1.1.30 --user=admin --port=22 --master_host=10.1.1.10 --master_port=3306
# 设置自动failover时候的切换脚本(故障发生时,自动挂载VIP到SLAVE1或SLAVE2)
master_ip_failover_script="/etc/mha/master_ip_failover.sh 10.1.1.100 1"
# 设置手动切换时候的切换脚本
#master_ip_online_change_script="/etc/mha/master_ip_online_change.sh 10.1.1.100 1"
# 设置故障发生后关闭故障主机脚本
# shutdown_script="/etc/mha/power_manager"
[server1]
hostname=10.1.1.10
port= 3306
candidate_master=1
[server2]
hostname=10.1.1.20
port= 3306
candidate_master=1
[server3]
hostname=10.1.1.30
port= 3306
candidate_master=1
11上传相应脚本/etc/mha目录,然后更改配置信息,授权
[root@mha ~]# ls /etc/mha/
app1.conf master_ip_failover.sh
注意:脚本内容中要修改网卡名字和连接用户为admin
my $vip = shift;
my $interface = 'ens33'; 网卡名(38行)
my $key = shift;
...
sub stop_vip() {
my $ssh_user = "admin"; 用户名(110行)
print "=======$ssh_stop_vip==================\n";
`ssh $ssh_user\@$orig_master_host \" $ssh_stop_vip \"`;
}
[root@mha ~]# chmod +x /etc/mha/master_ip_*
12.检测SSH互信以及MySQL主从状态
在mha管理节点:
# su - admin
# 检测SSH互信
[admin@mha ~]$ masterha_check_ssh --conf=/etc/mha/app1.conf
# 检测集群状态
[admin@mha ~]$ masterha_check_repl --conf=/etc/mha/app1.conf
13。检查MHA状态,然后运行MHA(监控开始)
在mha管理节点:
[admin@mha ~]$ masterha_check_status --conf=/etc/mha/app1.conf
app1 is stopped(2:NOT_RUNNING).
开启MHA Manager监控(关键,代表启动MHA):
[admin@mha ~]$ nohup masterha_manager --conf=/etc/mha/app1.conf --remove_dead_master_conf --ignore_last_failover &
再次查看监控状态:
[admin@mha ~]$ masterha_check_status --conf=/etc/mha/app1.conf
app1 (pid:8913) is running(0:PING_OK), master:10.1.1.10
注意:
1. 如果正常,会显示”PING_OK ”,否则会显示”NOT_RUNNING ”,说明 MHA监控没有开启
2. 使用admin用户启动监控,否则会报权限拒绝
3. 手动停止监控命令:masterha_stop --conf=/etc/mha/app1.conf
其中:步骤中的ip信息仅做参考,第11步需上传master_ip_failover.sh这个脚本
3.MHA自动Failover测试
1、在数据库MASTER服务器安装测试工具
[root@master ~]# yum -y install sysbench
2.插入测试数据
master服务器上创建测试库test
mysql> create database test charset utf8mb4;
Query OK, 1 row affected (0.17 sec)
mysql> grant all on *.* to 'mha'@'localhost' identified by '123';
Query OK, 0 rows affected (0.14 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.11 sec)
[root@master ~]# sysbench /usr/share/sysbench/oltp_read_only.lua \
--mysql-host=10.1.1.10 --mysql-port=3306 --mysql-user=mha \
--mysql-password=123 --mysql-socket=/tmp/mysql.sock \
--mysql-db=test --db-driver=mysql --tables=1 \
--table-size=100000 --report-interval=10 --threads=128 --time=120 prepare
mysql> select count(*) from sbtest1;
+----------+
| count(*) |
+----------+
| 100000 |
+----------+
1 row in set (0.01 sec)
3.拍摄快照(防止误操作,以免前功尽弃)
四个节点都要拍
4.模拟MASTER服务器故障
MASTER服务器:
service mysqld stop
MHA服务器:监控日志
[root@mgr ~]# tail -f /data/mha/masterha/app1/app1-3306.log
参考下图,自动切换成功
部分失败原因:
1.查看配置尤其注意ip端口等
2.参考下图,只读导致的切换失败及其解决方法