MySQL 高可用集群搭建(GTID 模式 + 自动故障转移)


一、环境规划

角色

IP 地址

说明

主库 (Master)

192.168.1.100

运行 MySQL + Keepalived/MHA

从库1 (Slave1)

192.168.1.101

运行 MySQL + Keepalived/MHA

从库2 (Slave2)

192.168.1.102

运行 MySQL

虚拟 IP (VIP)

192.168.1.200

客户端访问入口


二、配置 GTID 主从同步

1. 所有节点配置 MySQL

# 编辑配置文件(MySQL 8.0)

sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf

[mysqld]

# 通用配置

server-id = 1                 # 主库设为 1,从库依次递增(2, 3...)

log_bin = /var/log/mysql/mysql-bin.log

binlog_format = ROW

expire_logs_days = 7

# GTID 配置

gtid_mode = ON                # 启用 GTID

enforce_gtid_consistency = ON # 强制 GTID 一致性

log_slave_updates = ON        # 从库记录 binlog(级联复制必需)

# 重启 MySQL

sudo systemctl restart mysql

2. 主库操作

-- 创建复制专用用户

CREATE USER 'repl'@'192.168.1.%' IDENTIFIED BY 'SecurePass123!';

GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.1.%';

FLUSH PRIVILEGES;

-- 查看 GTID 状态

SHOW MASTER STATUS\G

-- 输出示例:

-- File: mysql-bin.000001

-- Position: 154

-- Executed_Gtid_Set: 3E11FA47-71CA-11E1-9E33-C80AA9429562:1-5

3. 从库操作

-- 配置主库信息(所有从库执行)

CHANGE MASTER TO

MASTER_HOST = '192.168.1.100',

MASTER_USER = 'repl',

MASTER_PASSWORD = 'SecurePass123!',

MASTER_AUTO_POSITION = 1;  -- GTID 模式自动同步位置

-- 启动复制

START SLAVE;

-- 检查复制状态

SHOW SLAVE STATUS\G

-- 关键指标:

-- Slave_IO_Running: Yes

-- Slave_SQL_Running: Yes

-- Retrieved_Gtid_Set: 3E11FA47-71CA-11E1-9E33-C80AA9429562:1-5

-- Executed_Gtid_Set: 3E11FA47-71CA-11E1-9E33-C80AA9429562:1-5


三、自动故障转移方案


方案 1:Keepalived + VIP(快速切换)

1. 安装 Keepalived(主库和从库1)

# Ubuntu/Debian

sudo apt install keepalived

# CentOS/RHEL

sudo yum install keepalived

2. 主库 Keepalived 配置

sudo vim /etc/keepalived/keepalived.conf

vrrp_script chk_mysql {

script "/usr/bin/pgrep mysqld"  # 检查 MySQL 进程

interval 2

weight 2

}

vrrp_instance VI_1 {

state MASTER

interface eth0

virtual_router_id 51

priority 100                   # 主库优先级更高

advert_int 1

authentication {

auth_type PASS

auth_pass 1234

}

virtual_ipaddress {

192.168.1.200/24            # 虚拟 IP

}

track_script {

chk_mysql

}

}

3. 从库 Keepalived 配置

sudo vim /etc/keepalived/keepalived.conf

vrrp_instance VI_1 {

state BACKUP

interface eth0

virtual_router_id 51

priority 50                    # 优先级低于主库

advert_int 1

authentication {

auth_type PASS

auth_pass 1234

}

virtual_ipaddress {

192.168.1.200/24

}

track_script {

chk_mysql

}

}

4. 启动并验证

sudo systemctl restart keepalived

sudo systemctl enable keepalived

# 检查 VIP 绑定

ip addr show eth0 | grep 192.168.1.200


方案 2:MHA(智能故障转移)

1. 所有节点配置 SSH 免密登录

# 在 MHA Manager 节点执行

ssh-keygen -t rsa

ssh-copy-id root@192.168.1.100

ssh-copy-id root@192.168.1.101

ssh-copy-id root@192.168.1.102

2. 安装 MHA Node(所有 MySQL 节点)

# Ubuntu/Debian

sudo apt install mha4mysql-node

# CentOS/RHEL

sudo yum install https://github.com/yoshinorim/mha4mysql-node/releases/download/v0.58/mha4mysql-node-0.58-0.el7.noarch.rpm

3. 安装 MHA Manager(管理节点)

# Ubuntu/Debian

sudo apt install mha4mysql-manager

# CentOS/RHEL

sudo yum install https://github.com/yoshinorim/mha4mysql-manager/releases/download/v0.58/mha4mysql-manager-0.58-0.el7.noarch.rpm

4. 配置 MHA

sudo mkdir -p /etc/mha

sudo vim /etc/mha/app1.cnf

[server default]

manager_workdir=/var/log/mha/app1

manager_log=/var/log/mha/app1/manager.log

ssh_user=root

repl_user=repl

repl_password=SecurePass123!

ping_interval=3

[server1]

hostname=192.168.1.100

candidate_master=1

[server2]

hostname=192.168.1.101

candidate_master=1

[server3]

hostname=192.168.1.102

5. 启动 MHA

masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover

# 检查状态

masterha_check_status --conf=/etc/mha/app1.cnf


四、数据备份与恢复(GTID 模式)

1. 全量备份

# 使用 mysqldump(主库执行)

mysqldump -u root -p --all-databases --single-transaction --set-gtid-purged=ON > full_backup_$(date +%Y%m%d).sql

2. 增量备份

-- 定期记录 GTID 集合

SHOW GLOBAL VARIABLES LIKE 'gtid_executed';

-- 示例输出:3E11FA47-71CA-11E1-9E33-C80AA9429562:1-1000

-- 增量备份时导出新增 GTID 区间

mysqlbinlog --include-gtids='3E11FA47-71CA-11E1-9E33-C80AA9429562:1001-2000' /var/log/mysql/mysql-bin.00000* > incremental_backup.sql

3. 数据恢复

# 全量恢复

mysql -u root -p < full_backup_20231001.sql

# 增量恢复

mysql -u root -p < incremental_backup.sql


五、主从切换操作

1. 手动切换(GTID 模式)

-- 在目标从库执行

STOP SLAVE;

RESET SLAVE ALL;

-- 提升为新主库

SET GLOBAL read_only = OFF;

-- 其他从库指向新主库

CHANGE MASTER TO

MASTER_HOST='192.168.1.101',

MASTER_USER='repl',

MASTER_PASSWORD='SecurePass123!',

MASTER_AUTO_POSITION=1;

START SLAVE;


六、验证与监控

1. 检查 GTID 一致性

-- 所有节点执行

SHOW GLOBAL VARIABLES LIKE 'gtid_executed';

-- 确保所有节点 GTID 集合相同

2. 监控复制延迟

SHOW SLAVE STATUS\G

-- 关注 Seconds_Behind_Master

3. 日志检查

# Keepalived 日志

journalctl -u keepalived

# MHA 日志

tail -f /var/log/mha/app1/manager.log


七、故障排查命令

1. 主从复制中断

-- 查看错误原因

SHOW SLAVE STATUS\G

-- 跳过错误(谨慎操作)

STOP SLAVE;

SET GTID_NEXT='3E11FA47-71CA-11E1-9E33-C80AA9429562:1001';

BEGIN; COMMIT;

SET GTID_NEXT='AUTOMATIC';

START SLAVE;

2. VIP 未漂移

# 检查 Keepalived 进程

ps aux | grep keepalived

# 手动释放 VIP

systemctl restart keepalived


八、关键注意事项

  1. GTID 限制
    • 禁止直接修改 gtid_purged,可能导致数据冲突。
    • 所有事务必须通过 GTID 复制,禁用非 GTID 操作(如 CHANGE MASTER TO MASTER_LOG_FILE)。
  2. 备份策略
    • 全量备份每日一次,增量备份每小时一次。
    • 使用 Percona XtraBackup 替代 mysqldump 支持热备份:

xtrabackup --backup --target-dir=/backup/xtrabackup/full

  1. 安全加固
    • 限制复制用户 IP 范围(如 repl'@'192.168.1.%')。
    • 加密备份文件并存储到远程服务器。

通过以上步骤,您将获得一个基于 GTID + Keepalived/MHA 的高可用 MySQL 集群,支持自动故障转移、数据一致性保障和快速恢复。

MySQL 高可用集群搭建部署的更多相关文章

  1. .Net Core2.1 秒杀项目一步步实现CI/CD(Centos7.2)系列一:k8s高可用集群搭建总结以及部署API到k8s

    前言:本系列博客又更新了,是博主研究很长时间,亲自动手实践过后的心得,k8s集群是购买了5台阿里云服务器部署的,这个集群差不多搞了一周时间,关于k8s的知识点,我也是刚入门,这方面的知识建议参考博客园 ...

  2. 实现CI/CDk8s高可用集群搭建总结以及部署API到k8s

    实现CI/CD(Centos7.2)系列二:k8s高可用集群搭建总结以及部署API到k8s 前言:本系列博客又更新了,是博主研究很长时间,亲自动手实践过后的心得,k8s集群是购买了5台阿里云服务器部署 ...

  3. 部署MYSQL高可用集群

                                                  mysql-day08     部署MYSQL高可用集群 u 集群架构                   ...

  4. Hadoop 3.1.2(HA)+Zookeeper3.4.13+Hbase1.4.9(HA)+Hive2.3.4+Spark2.4.0(HA)高可用集群搭建

    目录 目录 1.前言 1.1.什么是 Hadoop? 1.1.1.什么是 YARN? 1.2.什么是 Zookeeper? 1.3.什么是 Hbase? 1.4.什么是 Hive 1.5.什么是 Sp ...

  5. ProxySQL Cluster 高可用集群环境部署记录

    ProxySQL在早期版本若需要做高可用,需要搭建两个实例,进行冗余.但两个ProxySQL实例之间的数据并不能共通,在主实例上配置后,仍需要在备用节点上进行配置,对管理来说非常不方便.但是Proxy ...

  6. MHA 高可用集群搭建(二)

    MHA 高可用集群搭建安装scp远程控制http://www.cnblogs.com/kevingrace/p/5662839.html yum install openssh-clients mys ...

  7. MySQL高可用集群方案

    一.Mysql高可用解决方案 方案一:共享存储 一般共享存储采用比较多的是 SAN/NAS 方案. 方案二:操作系统实时数据块复制 这个方案的典型场景是 DRBD,DRBD架构(MySQL+DRBD+ ...

  8. MongoDB 3.4 高可用集群搭建(二)replica set 副本集

    转自:http://www.lanceyan.com/tech/mongodb/mongodb_repset1.html 在上一篇文章<MongoDB 3.4 高可用集群搭建(一):主从模式&g ...

  9. kubeadm部署k8s1.9高可用集群--4部署master节点

    部署master节点 kubernetes master 节点包含的组件: kube-apiserver kube-scheduler kube-controller-manager 本文档介绍部署一 ...

  10. HDFS-HA高可用集群搭建

    HA高可用集群搭建 1.总体集群规划 在hadoop102.hadoop103和hadoop104三个节点上部署Zookeeper. hadoop102 hadoop103 hadoop104 Nam ...

随机推荐

  1. Git的一些基本用法

    本文分享自天翼云开发者社区<Git的一些基本用法>,作者:l****n 基本操作 git branch 查看当前分支 git branch -a 查看所有分支 git pull 更新当前分 ...

  2. ECharts中实现x轴中的坐标以不同间距显示的效果

    1.需求描述 我们日常在使用ECharts实现曲线图或柱状图的时候,x轴上的坐标都是等距离显示的. 有时候我们可能有这个需求: x轴上的坐标距离按照对应数据的比例进行显示. 打个比方,假设x轴上有5个 ...

  3. Kali 切换中文模式

    Kali 切换中文模式 在桌面打开终端,输入sudo dpkg-reconfigure locales命令,然后输入kali的密码 在选择栏目找到 zh_CN.UTF-8 UTF-8 找到之后按 空格 ...

  4. linux mint安装Idea

    一.前言 这一节我们介绍在Linux下如何安装与破解Intellij idea2017.现在有很多公司开发环境都是Linux,所以掌握在Linux环境下使用Idea办公也是咱们必须得掌握的技能. 记住 ...

  5. 基于DeepSeek R1 满血版大模型的个人知识库,回答都源自对你专属文件的深度学习。

    这是一座专属你的知识宝库,它依托 DeepSeek R1 满血版大模型构建而成.在这里,每一次回答都源自对你专属文件的深度学习,精准匹配你的知识需求,为你输出最贴合文件内容的答案 . 使用 Cherr ...

  6. Asp.Net Core3.0 微信退款

    参考文档: 微信支付申请退款API文档:https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter8_8_11.shtml   (最新更新时间:2022 ...

  7. CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比

    CSnakes 是一个用于在.NET项目中嵌入Python代码的工具,由.NET源生成器和运行时组成,能够实现高效的跨语言调用,Github:https://github.com/tonybalone ...

  8. vscode launch program "xxx" does not exist

    Error Solution Please Click The Build Button Other This maybe is the one of Makefile Tools or 'c++ e ...

  9. 傻妞教程——对接使用redis储存,更快的读写速度

    Redis的特点 1.Redis支持数据的持久化,可以将内存中的数据保存在磁盘中. 2.Redis数据读写速度非常快,因为它把数据都读取到内存当中操作. 3.Redis支持数据的备份,即master- ...

  10. cmd - windows操作系统命令提示符常用命令

    mklink /j C:\Users\lin_0421\Desktop\note D:\note