MHA 高可用
MHA(Master High Availability)
MySQL高可用解决方案, 它由日本DeNA公司youshimaton(现就职于Facebook公司)开发,是一套优秀的MySQL故障切换和主从提升的高可用软件 ,在MySQL故障切换过程中,MHA能做到在0~30秒之内自动完成数据库的故障切换操作 。
该软件由两部分组成:MHA Manager(管理节点)和MHA Node(数据节点)
作者 Github : https://github.com/yoshinorim
实现原理:
MHA Manager
可以单独部署在一台独立的机器上管理多个master-slave
集群,也可以部署在一台slave
节点上。MHA Node
运行在每台MySQL服务器上,MHA Manager
会定时探测集群中的master
节点,当master
出现故障时,它可以自动将最新数据的slave
提升为新的master
,然后将所有其他的slave重新指向新的master
MHA的核心实现为虚拟IP
,web
服务器mysql
连接指向虚拟IP
,Master
服务器添加与之对应的虚拟IP,当Master
宕掉后,新的Master
再设置同样的虚拟IP
,以此保证web服务高可用。
1.环境准备
机器环境
ID | IP | Hostname | server_id | Remark |
---|---|---|---|---|
1 | 10.1.1.10 | mha.tigeru.cn | - | MHA 管理机 |
2 | 10.1.1.20 | master.tigeru.cn | 20 | 主 |
3 | 10.1.1.30 | slave1.tigeru.cn | 30 | 从1 |
4 | 10.1.1.40 | slave2.tigeru.cn | 40 | 从2 |
软件环境
系统版本 | MySQL | MHA |
---|---|---|
CentOS 7.6 | MySQL-5.6.35 | mha4mysql-manager-0.57 mha4mysql-node-0.57 |
2.系统初始化
①配置IP
②配置主机名
③配置hosts
,实现互相通信
10.1.1.10 mha.tigeru.cn mha
10.1.1.20 master.tigeru.cn master
10.1.1.30 slave1.tigeru.cn slave1
10.1.1.40 slave2.tigeru.cn slave2
注意:重启网络服务
④同步时间
3.构建主从
①软件安装
Master
# !/bin/bash
#1.解压安装包
tar -zvxf mysql-5.6.35-linux-glibc2.5-x86_64.tar.gz
#2.移动到安装目录 /usr/local/mysql
mv mysql-5.6.35-linux-glibc2.5-x86_64 /usr/local/mysql
#3.创建mysql账号
useradd -r -s /sbin/nologin mysql
#4.分配安装目录权限
chown -R mysql.mysql /usr/local/mysql
#5.进入安装目录
cd /usr/local/mysql
#6.删除 mariadb-libs 数据库
yum remove mariadb-libs -y
#7.初始化数据库vim
scripts/mysql_install_db --user=mysql
#8.将服务添加到 /etc/init.d/ 目录下
cp support-files/mysql.server /etc/init.d/mysql
#9.启动 mysql 服务
service mysql start
#10.数据库安全设置,
#设置root密码,移除匿名用户,允许root远程连接,删除test数据库
bin/mysql_secure_installation
Slave1 && Slave2
从服务并不需要进行初始化,直接从通过rsync
从主服务器拉过来
# !/bin/bash
#1.解压安装包
tar -zvxf mysql-5.6.35-linux-glibc2.5-x86_64.tar.gz
#2.移动到安装目录 /usr/local/mysql
mv mysql-5.6.35-linux-glibc2.5-x86_64 /usr/local/mysql
#3.创建mysql账号
useradd -r -s /sbin/nologin mysql
#4.分配安装目录权限
chown -R mysql.mysql /usr/local/mysql
#5.进入安装目录
cd /usr/local/mysql
#6.删除 mariadb-libs 数据库 ,并清空 mysql/data目录内容
yum remove mariadb-libs -y
rm -rf data/*
#--------------------------
#7.将 Master 服务器 mysql/data 目录中的数据拉到 data 目录下, ***
rsync -av root@10.1.1.20:/usr/local/mysql/data/ /usr/local/mysql/data/
#--------------------------
#8. 删除 data/auto.cnf ,该文件中保存MySQL的UUID
rm -rf data/auto.cnf
#9.将服务添加到 /etc/init.d/ 目录下
cp support-files/mysql.server /etc/init.d/mysql
#10.启动 mysql 服务
service mysql start
②修改配置
基于GTIDs配置
Master
# vim /usr/local/mysql/my.cnf
[mysqld]
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
port = 3306
server_id = 20
socket = /tmp/mysql.sock
character_set_server=utf8mb4
log-bin = /usr/local/mysql/data/binlog
log-error = /usr/local/mysql/data/mysql.err
# 添加3行配置
gtid-mode=on
log-slave-updates=1
enforce-gtid-consistency
Slave1 && Slave2
注意:Slave1与Slave2 需要设置不同的server_id
# vim /usr/local/mysql/my.cnf
[mysqld]
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
port = 3306
# 根据规划设置不同 id
server_id = 30/40
socket = /tmp/mysql.sock
character_set_server=utf8mb4
# 从服务器也需要开启二进制日志
log-bin = /usr/local/mysql/data/binlog
relay-log=/usr/local/mysql/data/relaylog
log-error = /usr/local/mysql/data/mysql.err
# 添加4行配置
gtid-mode=on
log-slave-updates=1
enforce-gtid-consistency=1
skip-slave-start
③Master 创建同步账号
grant replication slave on *.* to 'slave'@'10.1.1.%' identified by '123';
flush privileges;
④Slave1与Slave2 开启同步
change master to master_host='10.1.1.20',master_user='slave',master_password='123',master_port=3306,master_auto_position=1;
--开启同步
start slave;
show slave status\G
4. MHA软件安装
①软件下载
mha4mysql-node
: https://github.com/yoshinorim/mha4mysql-node/releases/
mha4mysql-manager
: https://github.com/yoshinorim/mha4mysql-manager/releases
旧版本: https://github.com/yoshinorim/mha4mysql-manager/wiki/Downloads
②软件安装
第一步:MHA服务器安装Node
节点与Manager
管理节点
注意:安装前需要配置epel
源,用于安装相关依赖
注意:先安装node
再安装 manager
注意:注意安装依赖perl-DBD-MySQL
时会自动安装 mariadb-libs
,所以我们需要删除 /etc/my.cnf
yum install mha4mysql-node-0.58-0.el7.centos.noarch.rpm
yum install mha4mysql-manager-0.58-0.el7.centos.noarch.rpm
第二步:在其他三台服务器中(Master,Slave1,Slave2)安装Node节点
yum install mha4mysql-node-0.58-0.el7.centos.noarch.rpm
5.配置SSH互信
①免密登录
MHA 需要不停的与其他三台服务器进行通信,来检测MySQL集群中各台机器的状态
四台机器(MHA,Master,Slave1,Slave2)上创建账号,
useradd admin
echo 123|passwd --stdin admin
配置免秘钥登录
注意 :使用 admin
账户
# 1.切换为admin用户
su - admin
# 2.生成公钥
ssh-keygen -P "" -f ~/.ssh/id_rsa
# 2.进入目录
cd .ssh/
# 3.重命名
mv id_rsa.pub authorized_keys
# 4.拷贝秘钥到其他三台服务器(Master,Slave1,Slave2)
for i in 20 30 40;do scp -r ../.ssh/ 10.1.1.$i:~/;done
②配置SUDO
Master,Slave1,Slave2 配置sudo
允许admin
用户配置虚拟IP
Master服务器配置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 拷贝 /etc/sudoers.d/admin
[root@master ~] for i in 30 40;do scp /etc/sudoers.d/admin 10.1.1.$i:/etc/sudoers.d/; done
注意:使用 root
用户向Slave1
,Slave2
推送/etc/sudoers.d/admin
文件
③为Master
挂载虚拟IP
# su - admin
[admin@master ~] # sudo /sbin/ifconfig ens33:1 10.1.1.100 broadcast 10.1.1.255 netmask 255.255.255.0
# 让VIP立即生效
[admin@master ~] # sudo /sbin/arping -f -q -c 5 -w 5 -I ens33 -s 10.1.1.100 -U 10.1.1.30
参数说明
-f:收到第一个响应包后退出。
-q:quite模式,不显示输出。
-c:发送指定的count个ARP REQUEST包后停止。如果指定了-w参数,则会等待相同数量
的ARP REPLY包,直到超时为止。
-w:指定一个超时时间,单位为秒,arping在到达指定时间后退出,无论期间发送或接收
了多少包。在这种情况下,arping在发送完指定的count(-c)个包后并不会停止,而是
等待到超时或发送的count个包都进行了回应后才会退出。
-I:指定设备名,用来发送ARP REQUEST包的网络设备的名称。
-D:重复地址探测模式,用来检测有没有IP地址冲突,如果没有IP冲突则返回0。
-s:设置发送ARP包的IP资源地址5.4 创建mha相关配置文件
创建mha相关的工作目录
创建mha局部配置文件
-U:无理由的(强制的)ARP模式去更新别的主机上的ARP CACHE列表中的本机的信息,不需要响应。
6. MHA 配置
①创建MHA配置文件目录
[admin@mha ~]$ su - root
[root@mha ~]# mkdir /etc/mha
[root@mha ~]# mkdir -p /data/mha/masterha/app1
[root@mha ~]# chown -R admin. /data/mha
②下载配置文件
下载地址: https://github.com/yoshinorim/mha4mysql-manager/tree/master/samples/scripts
把MHA的4个配置文件上传到/etc/mha目录
app1.conf master_ip_failover.sh master_ip_online_change.sh power_manager
③修改配置文件 app1.conf
要在MASTER
数据库主机中,创建一个mha
账号,用于检测主从状态。从服务器会自动同步创建*
mysql> grant all privileges on *.* to mha@'10.1.1.10' identified by '123';
mysql> flush privileges;
修改文件内容
# cd /etc/mha
# vim app1.conf
[server default]
# 设置监控用户和密码(检测主从运行状态,必须创建在master主机上)
user=mha
password=123
# 设置复制环境中的复制用户和密码
repl_user=slave
repl_password=123
# 设置ssh的登录用户名
ssh_user=admin
# 设置监控主库,发送ping包的时间间隔,默认是 3 秒,尝试三次没有回应的时候自动进行failover
ping_interval=3
# 设置mgr的工作目录
manager_workdir=/data/mha/masterha/app1
# 设置mysql master 保存 binlog 的目录,以便 MHA 可以找到 master 的二进制日志
master_binlog_dir=/usr/local/mysql/data
# 设置 master 的 pid 文件
master_pid_file=/usr/local/mysql/data/master.tigeru.cn.pid
# 设置 mysql master 在发生切换时保存 binlog 的目录(在mysql master上创建这个目录)
remote_workdir=/data/mysql/mha
# 设置 mgr 日志文件
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.30 -s 10.1.1.40 --user=admin --port=22 --master_host=10.1.1.20 --master_port=3306
# 设置自动 failover 时候的切换脚本
master_ip_failover_script="/etc/mha/master_ip_failover.sh 10.1.1.100 1"
[server1]
# master主机IP
hostname=10.1.1.20
port= 3306
candidate_master=1
[server2]
# slave1主机IP
hostname=10.1.1.30
port= 3306
candidate_master=1
[server3]
# slave2主机IP
hostname=10.1.1.40
port= 3306
candidate_master=1
④. 修改自动切换脚本
修改脚本文件
master_ip_failover.sh
master_ip_online_change.sh
修改网卡信息ens33)和互信用户名称(admin)
为脚本文件添加执行权限
[root@mha ~]# chmod +x /etc/mha/master_ip_*
7.检测
检查MHA,SSH互信与主从状态
注意:切换为admin
用户检测
#检测 SSH 互信
[admin@mha ~]$ masterha_check_ssh --conf=/etc/mha/app1.conf
# 检测主从状态
[admin@mha ~]$ masterha_check_repl --conf=/etc/mha/app1.conf
注意:请确保Slave 已经开启同步,mysql 重启后,主从同步会停止,需要手动开启
8.启动MHA
检测运行状态:
[admin@mha ~] $ masterha_check_status --conf=/etc/mha/app1.conf
启动MHA
[admin@mha ~] $ nohup masterha_manager --conf=/etc/mha/app1.conf --remove_dead_master_conf --ignore_last_failover &
如果MHA启动异常,可以通过cat命令,查看nohup.out
(所有错误信息都会写入此文件)
停止MHA:
masterha_stop --conf=/etc/mha/app1.conf
查看自动切换过程:
tail -f /data/mha/masterha/app1/app1-3306.log
9.注意事项
①两台从服务器的my.cnf不能拥有相同的server_id
②删除从服务器data/auto.cnf
,确保每个机器UUID是不一样的
③重启mysql以后,主从会自动关闭,必须手工start slave重新开启