当前位置: 首页 > news >正文

高可用操作步骤

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,且复制正常

http://www.dtcms.com/a/343593.html

相关文章:

  • FP4层与NF4层 4位量化总结(49)
  • 实践题:数据采集与处理培训大纲
  • JavaWeb(五)转发、重定向、Get、POST
  • 在JAVA中如何给Main方法传参?
  • java开发面试题(提高篇)
  • 2026 济南玉米及淀粉深加工展:从原料到创新产品的完整解决方案
  • 【算法精练】 哈夫曼编码
  • Eino 框架组件协作指南 - 以“智能图书馆建设手册”方式理解
  • Excel中运行VB的函数
  • Sklearn 机器学习 房价预估 线性回归模型实现预估
  • 【自用】JavaSE--网络通信
  • 项目架构分享 —— 离线数仓
  • 【neo4j】安装使用教程
  • 最新react,vue 解决无法使用js触发点击,解决方案
  • k8s存储类-storageclass部署
  • 日语学习-日语知识点小记-构建基础-JLPT-N3阶段(18):文法+单词第6回1
  • OpenHarmony之 蓝牙子系统全栈剖析:从协议栈到芯片适配的端到端实践(大合集)
  • 如何正确地捕获并处理异步操作中的错误
  • K 均值聚类算法学习总结
  • Flutter 线程模型详解:主线程、异步与 Isolate
  • 深入 RxJava 插件化开发:打造自定义操作符与监控体系
  • 物理电气协议标准:RS485 RS232
  • llama.cpp docker 镜像pull国内加速地址
  • 餐饮供应链:餐饮的“后端定海神针”
  • 《JavaScript不可变数据实践:Object.freeze与Proxy的实现逻辑、性能博弈及场景选型》
  • 详细讲解Java中的反射和经典面试题(保姆级别)
  • 【STM32入门教程】新建工程
  • 如何高效撰写AI领域学术论文——学习笔记
  • 【动手学深度学习】6.2. 图像卷积
  • DeepSeek-V3.1震撼升级:推理与Agent双突破