高可用操作步骤
1.环境准备
角色 | 主机名 | IP地址 | 说明 |
Master | mha-node1 | 192.168.81.12 | 主库 |
Slave1 | mha-node2 | 192.168.81.13 | 从库(候选主库) |
Slave2 | mha-node3 | 192.168.81.14 | 从库 |
Manager | mha-manager | 192.168.81.15 | MHA管理节点(独立服务器) |
2.基础配置(所有节点)
(1)关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
(2)关闭SELinux
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
(3)配置hosts(所有节点一致)
cat >> /etc/hosts << EOF
192.168.81.12 mha-node1
192.168.81.13 mha-node2
192.168.81.14 mha-node3
192.168.81.15 mha-manager
EOF
(5)配置SSH免密登录(manager节点需免密登录所有数据库节点,数据库节点间也需互信)所有节点执行
ssh-keygen -t rsa -N '' -f ~/.ssh/id_rsafor host in mha-node1 mha-node2 mha-node3; do ssh-copy-id -i ~/.ssh/id_rsa.pub $host done
密码输入虚拟机登入的密码
3.安装MySQL(所有数据库节点)
(1)这里使用MySQL安装脚本
cd /usr/local/src
wget http://192.168.56.200/Software/mysql_install.sh
bash mysql_install.sh
(2)进不去按以下操作
ln -s /usr/local/mysql/bin/mysql /usr/bin
vi /etc/profile
在文件末尾添加(替换为实际路径)
export PATH=$PATH:/usr/local/mysql/bin
生效配置
source /etc/profile
4.配置MySQL(主从差异化配置)
(1)主服务(mha-node1)
vim /etc/my.cnf
[mysqld]
server-id=12 #唯一ID
log_bin=mysql-bin #开启binlog
binlog_format=ROW #ROW模式(MHA推荐)
gtid_mode=ON #开启GTID
enforce_gtid_consistency=ON #强制GTID一致性
log_slave_updates=ON #从库同步时记录binlog(用于级联复制)
skip_name_resolve=ON #跳过域名解析
重启MySQL服务
systemctl restart mysqld
(2)从服务(mha-node2)
vim /etc/my.cnf
[mysqld]
server-id=13 #唯一ID
log_bin=mysql-bin
binlog_format=ROW
gtid_mode=ON
enforce_gtid_consistency=ON
log_slave_updates=ON
skip_name_resolve=ON
relay_log=relay-bin #开启中继日志
read_only=ON #从库只读(可选)
重启MySQL服务
systemctl restart mysqld
(3)从服务(mha-node3)
vim /etc/my.cnf
[mysqld]
server-id=14 #唯一ID
log_bin=mysql-bin
binlog_format=ROW
gtid_mode=ON
enforce_gtid_consistency=ON
log_slave_updates=ON
skip_name_resolve=ON
relay_log=relay-bin #开启中继日志
read_only=ON #从库只读(可选)
重启MySQL服务
systemctl restart mysqld
5.搭建主从复制(基于GTID)
(1)在主服务创建复制用户
CREATE USER 'repl'@'192.168.81.%' IDENTIFIED WITH mysql_native_password BY 'Repl@123';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.81.%';
FLUSH PRIVILEGES;
(2)在从服务配置复制
①登录Slave的MySQL
CHANGE MASTER TOMASTER_HOST='mha-node1',MASTER_USER='repl',MASTER_PASSWORD='Repl@123',MASTER_PORT=3306,MASTER_AUTO_POSITION=1; #基于GTID自动定位
②启动复制
START SLAVE;
③检查复制状态(确保Slave_IO_Running和Slave_SQL_Running均为Yes)
SHOW SLAVE STATUS\G;
6.安装依赖(所有节点)
CentOS7安装依赖
(1)配置本地Yum源(本地、网络、扩展)
vim /etc/yum.repos.d/CentOS-Media.repo
[c7-media]
name=CentOS-$releasever - Media
baseurl=file:///media/CentOS/file:///media/cdrom/file:///media/cdrecorder/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
(2)挂载光盘
mount /dev/cdrom /media/
(3)安装wget
yum install -y wget
(4)若安装失败
①禁用 c7-media 仓库
yum-config-manager --disable c7-media
②重新配置网络源
a下载阿里云的CentOS 7仓库配置文件
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
b.下载清华大学的仓库配置
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.tuna.tsinghua.edu.cn/centos/7/os/x86_64/CentOS-Base.repo
③清理缓存并生成新缓存
yum clean all
yum makecache
④再次尝试安装
yum install -y wget
(5)配置网络Yum源
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
(6)配置Yum扩展源
wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo
(7)安装Perl依赖(MHA基于Perl开发)
yum install -y perl-DBD-MySQL perl-CPAN perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker
yum install -y perl-Email-Sender perl-Email-Valid perl-Mail-Sender
Ubuntu22.04安装依赖包
sudo apt install -y perl libdbi-perl libdbd-mysql-perl libperl-dev libconfig-tiny-perl liblog-dispatch-perl libparallel-forkmanager-perl
7.安装MHA包
(1)下载MHA源码包
①在教室可以使用局域网下载
管理节点下载
wget http://192.168.56.200/Software/mha4mysql-manager-0.58.tar.gz
所有节点下载
wget http://192.168.56.200/Software/mha4mysql-node-0.58.tar.gz
②github下载
管理节点下载
wget https://github.com/yoshinorim/mha4mysql-manager/releases/download/v0.58/mha4mysql-manager-0.58.tar.gz
所有节点下载
wget https://github.com/yoshinorim/mha4mysql-node/releases/download/v0.58/mha4mysql-node-0.58.tar.gz
(2)安装MHA Node(所有节点)
tar -zxvf mha4mysql-node-0.58.tar.gz
cd mha4mysql-node-0.58
perl Makefile.PL
make && make install
(3)安装MHA Manager(仅管理节点)
tar -zxvf mha4mysql-manager-0.58.tar.gz
cd mha4mysql-manager-0.58
perl Makefile.PL
make && make install
创建MHA工作目录
mkdir -p /etc/mha/mha_cluster /var/log/mha/mha_cluster
8.配置MHA
(1)创建MHA配置文件(manager节点)
cat > /etc/mha/mha_cluster.cnf << EOF
[server default]
# MHA管理用户(需在所有MySQL节点创建)
user=mha_user
password=Mha@123
# SSH登录用户
ssh_user=root
# MySQL复制用户
repl_user=repl
repl_password=Repl@123
# 健康检查间隔(秒)
ping_interval=1
# master的binlog目录
master_binlog_dir=/usr/local/mysql/data
# 远程节点临时目录
remote_workdir=/tmp
# 二次检查节点
secondary_check_script=masterha_secondary_check -s mha-node2 -s mha-node3
# manager工作目录
manager_workdir=/var/log/mha/mha_cluster
# manager日志
manager_log=/var/log/mha/mha_cluster/manager.log[server1]
hostname=mha-node1
port=3306
# 不优先作为候补主库
candidate_master=0[server2]
hostname=mha-node2
port=3306
# 优先作为候选主库(数据最新时)
candidate_master=1
# 忽略复制延迟,强制作为候选
check_repl_delay=0[server3]
hostname=mha-node3
port=3306
candidate_master=0
EOF
(2)创建MHA管理用户(所有MySQL节点)
注意:主从在主创建就行,主从复制
create user 'mha_user'@'192.168.81.%' identified with mysql_native_password by 'Mha@123';
grant all privileges on *.* to 'mha_user'@'192.168.81.%';
flush privileges;
9.验证MHA配置
(1)检查SSH连接(manager节点)
masterha_check_ssh --conf=/etc/mha/mha_cluster.cnf
输出"All SSH connection tests passed successfully."即为正常
(2)检查主从复制(manager节点)
masterha_check_repl --conf=/etc/mha/mha_cluster.cnf
输出"MySQL Replication Health is OK."即为正常
若出现错误
(1)创建用户失败
①停止从库复制(确保 SQL 线程完全停止)
STOP SLAVE;
②指定要跳过的错误事务 GTID
SET GTID_NEXT = '真实的GTID';
③执行空事务跳过该 GTID
BEGIN; #开启空事务
COMMIT; #提交空事务(相当于标记该GTID已执行)
④恢复 GTID 自动同步模式
SET GTID_NEXT = 'AUTOMATIC';
⑤重启从库复制
START SLAVE;
⑥验证复制状态
SHOW SLAVE STATUS\G;
(2)管理节点无法通过用户访问从库
①确认 MHA 管理节点的 IP
ifconfig 或 ip addr
②登录 mha-node2 检查mha_user的权限配置
a登录MySQL
mysql -u root -p
b检查用户是否存在及允许的主机
SELECT user, host, authentication_string FROM mysql.user WHERE user = 'mha_user';
③修复mha_user的访问权限(在 mha-node2 上执行)
a.用户不存在或主机不匹配
创建用户(允许管理节点及整个网段访问)
CREATE USER IF NOT EXISTS 'mha_user'@'192.168.81.%' IDENTIFIED WITH 'mysql_native_password' BY 'Mha@123';
授予MHA所需权限(必须包含以下权限)
GRANT REPLICATION SLAVE, REPLICATION CLIENT, RELOAD, SUPER, PROCESS ON *.* TO 'mha_user'@'192.168.81.%';
刷新权限
FLUSH PRIVILEGES;
b.密码不正确
-- 重置密码(与MHA配置文件中的密码保持一致)
ALTER USER 'mha_user'@'192.168.81.%' IDENTIFIED WITH 'mysql_native_password' BY '你的密码'; -- 替换为实际密码
FLUSH PRIVILEGES;
④检查 MHA 配置文件中的凭据
cat /etc/mha/mha_cluster.cnf | grep -E 'user|password'
⑤验证管理节点到 mha-node2 的连接
mysql -h 192.168.81.13 -u mha_user -pMha@123
⑥重新检查 MHA 复制状态
masterha_check_repl --conf=/etc/mha/mha_cluster.cnf
10.启动MHA (管理节点)
(1)前台启动(测试用,日志实时输出)
masterha_manager --conf=/etc/mha/mha_cluster.cnf
(2)后台启动(生产用)
nohup masterha_manager --conf=/etc/mha/mha_cluster.cnf > /var/log/mha/mha_cluster/nohup.log 2>&1 &
(3)检查MHA状态
masterha_check_status --conf=/etc/mha/mha_cluster.cnf
输出"mha_cluster (pid: xxxx) is running(0:PING_OK)"即为正常运行
11.测试故障切换
(1)模拟Master故障(在主服务执行)
systemctl stop mysqld #停止主库服务
(2)观察故障切换(管理节点日志)
ail -f /var/log/mha/mha_cluster/manager.log
正常情况下,日志会显示:
检测到master故障
提升mha-node2为新master
其他slave(mha-node3)指向新master
(3)验证切换结果
①在新master(mha-node2)查看状态
mysql -uroot -p -e "SELECT @@server_id, @@read_only;"
应显示server_id=12,read_only=OFF
②在mha-node3查看复制状态
mysql -uroot -p -e "SHOW SLAVE STATUS\G"
应显示Master_Host为mha-node2,且复制正常