MySQL高可用架构:复制与集群实战指南

引言

各位数据库爱好者们好!今天我们要深入探讨MySQL高可用架构的核心技术——复制与集群 🏗️。在现代互联网应用中,数据库的高可用性就像建筑物的抗震设计一样重要,直接决定了系统的稳定性和可靠性。本教程将从主从复制原理讲起,逐步深入到各种复制拓扑结构、GTID复制等高级主题,让你全面掌握构建健壮MySQL架构的关键技术!💪


一、主从复制原理与配置

1.1 复制工作原理

MySQL复制就像数据同步的"传声筒",将主库变更传播到从库 📢:

复制三线程模型

  1. 主库Binlog Dump线程:读取binlog事件并发送给从库
  2. 从库I/O线程:接收主库的binlog事件并写入relay log
  3. 从库SQL线程:读取relay log中的事件并重放执行

复制流程

Binlog事件
主库
从库I/O线程
从库Relay Log
从库SQL线程
从库数据

1.2 主从复制配置实战

主库配置(my.cnf)

[mysqld]
server-id = 1  # 必须唯一
log_bin = mysql-bin  # 开启binlog
binlog_format = ROW  # 推荐使用ROW格式
binlog_row_image = FULL
sync_binlog = 1  # 每次事务提交都刷盘
expire_logs_days = 7  # 自动清理旧binlog

从库配置(my.cnf)

[mysqld]
server-id = 2  # 不同于主库
relay_log = mysql-relay-bin
read_only = ON  # 从库只读
log_slave_updates = ON  # 级联复制时需要

配置步骤

  1. 在主库创建复制账号:

    CREATE USER 'repl'@'%' IDENTIFIED BY 'SecurePass123!';
    GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
    
  2. 获取主库binlog位置:

    SHOW MASTER STATUS;
    -- 记下File和Position值
    
  3. 在从库配置主库信息:

    CHANGE MASTER TO
    MASTER_HOST='master_host',
    MASTER_USER='repl',
    MASTER_PASSWORD='SecurePass123!',
    MASTER_LOG_FILE='mysql-bin.000001',
    MASTER_LOG_POS=154;
    
  4. 启动复制:

    START SLAVE;
    
  5. 检查复制状态:

    SHOW SLAVE STATUS\G
    -- 确保Slave_IO_Running和Slave_SQL_Running都为Yes
    

二、读写分离实现

2.1 读写分离架构

读写分离就像交通分流,将读/写请求分配到不同节点 🚦:

典型架构

客户端 → 读写分离中间件 → 主库(写)↘ 从库1(读)↘ 从库2(读)

2.2 实现方案对比

方案优点缺点适用场景
应用层实现灵活可控,延迟低需要修改代码中小规模应用
中间件(ProxySQL)透明切换,功能丰富增加网络跳转大中型应用
数据库驱动实现无额外组件功能有限简单读写分离

2.3 ProxySQL实战配置

安装与初始化

# 安装
apt-get install proxysql# 启动服务
systemctl start proxysql# 管理命令行
mysql -u admin -padmin -h 127.0.0.1 -P 6032

基础配置

-- 添加主从服务器
INSERT INTO mysql_servers(hostgroup_id,hostname,port) VALUES 
(10,'master',3306),
(20,'slave1',3306),
(20,'slave2',3306);-- 配置监控用户
UPDATE global_variables SET variable_value='monitor' 
WHERE variable_name='mysql-monitor_username';-- 配置读写分离规则
INSERT INTO mysql_query_rules (rule_id,active,match_pattern,destination_hostgroup,apply) VALUES
(1,1,'^SELECT.*FOR UPDATE',10,1),  -- 写操作路由到主库
(2,1,'^SELECT',20,1);  -- 读操作路由到从库-- 保存配置
LOAD MYSQL SERVERS TO RUNTIME;
SAVE MYSQL SERVERS TO DISK;

三、复制拓扑结构

3.1 一主多从架构

架构特点

       [主库]/  |  \[从库1][从库2][从库3]
  • 优点:简单易维护,读扩展性好
  • 缺点:主库单点故障,写无法扩展

适用场景:读多写少的应用

3.2 级联复制架构

架构特点

[主库] → [从库1] → [从库2]↓[从库3]
  • 优点:减轻主库复制压力
  • 缺点:层级越深,数据延迟越大

配置关键

# 中间从库配置
log_slave_updates = ON

3.3 双主复制架构

架构特点

[主库A] ↔ [主库B]
  • 优点:无单点故障,写高可用
  • 缺点:冲突风险高,配置复杂

关键配置

# 两台服务器都要配置
auto_increment_increment = 2
auto_increment_offset = 1  # 服务器1设为1,服务器2设为2

四、复制过滤与延迟

4.1 复制过滤配置

复制过滤就像数据"筛子",只同步需要的部分 🕵️:

主库过滤(不推荐,会导致binlog不完整):

binlog-do-db = db1
binlog-ignore-db = db2

从库过滤(推荐方式):

-- 配置复制过滤
CHANGE REPLICATION FILTER 
REPLICATE_DO_DB = (db1),
REPLICATE_IGNORE_DB = (mysql);-- 通配符过滤(MySQL 8.0+)
CHANGE REPLICATION FILTER 
REPLICATE_WILD_DO_TABLE = ('db1.orders%'),
REPLICATE_WILD_IGNORE_TABLE = ('db1.temp_%');

4.2 复制延迟问题解决

复制延迟就像快递延误,数据不能及时送达 ⏳:

监控延迟

SHOW SLAVE STATUS\G
-- 查看Seconds_Behind_Master-- 更精确的方法(MySQL 8.0+)
SELECT * FROM performance_schema.replication_applier_status_by_worker;

常见解决方案

  1. 并行复制

    slave_parallel_workers = 8  # 根据CPU核心数设置
    slave_parallel_type = LOGICAL_CLOCK
    
  2. 减少大事务:拆分UPDATE 100万行数据为多个小事务

  3. 优化从库硬件:使用SSD,增加内存

  4. 半同步复制:确保至少一个从库收到数据

    -- 主库安装插件
    INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';-- 从库安装插件
    INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';-- 启用半同步
    SET GLOBAL rpl_semi_sync_master_enabled = 1;
    SET GLOBAL rpl_semi_sync_slave_enabled = 1;
    

五、GTID复制模式

5.1 GTID原理介绍

GTID(Global Transaction ID)就像事务的"身份证号" 🆔:

GTID格式

source_id:transaction_id
-- 示例:3E11FA47-71CA-11E1-9E33-C80AA9429562:23

优势

  1. 自动定位复制位置,无需手动指定binlog文件/位置
  2. 故障切换更简单可靠
  3. 支持自动故障转移

5.2 GTID复制配置

主从库配置(my.cnf)

[mysqld]
gtid_mode = ON
enforce_gtid_consistency = ON

从库配置命令

CHANGE MASTER TO
MASTER_HOST='master_host',
MASTER_USER='repl',
MASTER_PASSWORD='SecurePass123!',
MASTER_AUTO_POSITION = 1;  # 关键参数START SLAVE;

5.3 GTID常见操作

跳过特定事务

-- 查看错误事务GTID
SHOW SLAVE STATUS\G
-- 找到Executed_Gtid_Set中的错误事务-- 跳过指定GTID
STOP SLAVE;
SET GTID_NEXT='3E11FA47-71CA-11E1-9E33-C80AA9429562:23';
BEGIN; COMMIT;
SET GTID_NEXT='AUTOMATIC';
START SLAVE;

GTID限制与解决方案

  1. 不支持CREATE TABLE … SELECT:拆分为CREATE TABLE + INSERT INTO SELECT
  2. 临时表限制:避免在事务中使用临时表
  3. 版本兼容性:确保主从MySQL版本支持GTID

六、高可用集群进阶方案

6.1 MHA(Master High Availability)

架构特点

[主库] - [从库1] - [从库2]│└─[MHA Manager]
  • 优点:自动故障转移,支持GTID
  • 缺点:需要额外管理节点

关键功能

  1. 主库故障自动提升从库
  2. 自动识别差异binlog并补偿
  3. 支持在线切换

6.2 Group Replication

组复制原理

  • 基于Paxos协议的多主同步
  • 自动冲突检测与解决
  • 内置故障检测与成员管理

配置步骤

  1. 初始化配置:

    [mysqld]
    plugin_load_add = 'group_replication.so'
    group_replication_group_name = "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
    group_replication_start_on_boot = OFF
    group_replication_local_address = "node1:33061"
    group_replication_group_seeds = "node1:33061,node2:33061,node3:33061"
    
  2. 启动组复制:

    SET GLOBAL group_replication_bootstrap_group=ON;
    START GROUP_REPLICATION;
    SET GLOBAL group_replication_bootstrap_group=OFF;
    

6.3 InnoDB Cluster(MySQL Shell)

完整高可用方案

  1. MySQL Group Replication:提供数据同步
  2. MySQL Router:自动路由请求
  3. MySQL Shell:集群管理接口

部署命令示例

// 使用MySQL Shell配置
var cluster = dba.createCluster('myCluster')// 添加实例
cluster.addInstance('user@node2:3306')
cluster.addInstance('user@node3:3306')// 检查状态
cluster.status()

总结 🎯

通过本教程,我们系统掌握了MySQL高可用架构的核心技术 🎓:

  1. 主从复制:理解了复制原理与配置方法
  2. 读写分离:掌握了多种实现方案与ProxySQL配置
  3. 复制拓扑:学习了一主多从、级联复制等架构
  4. GTID复制:熟悉了更先进的GTID复制模式
  5. 集群方案:了解了MHA、Group Replication等高级方案

关键收获

  • 复制是MySQL高可用的基础技术
  • 读写分离能显著提升读性能
  • GTID极大简化了复制管理
  • 根据业务需求选择合适的集群方案

生产环境建议

  1. 使用GTID简化复制管理
  2. 监控复制延迟和状态
  3. 定期演练故障转移流程
  4. 考虑使用ProxySQL等中间件

下一步学习建议

  1. 在测试环境实践各种复制架构
  2. 研究MySQL Router的自动故障转移
  3. 学习数据库中间件(MyCat, ShardingSphere)
  4. 探索云原生数据库架构

PS:如果你在学习过程中遇到问题,别慌!欢迎在评论区留言,我会尽力帮你解决!😄

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/906561.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【物联网】基于树莓派的物联网开发【6】——汉化+字体库输入法安装

树莓派系统默认是英文,面向智能设备控制终端或物联网开发场景,需支持中文日志显示与本地化交互。 系统汉化 (1)输入命令sudo raspi-config,然后选择 Localisation 回车 (2)选择 locale 回车 &#xff0…

python新手学习笔记①

本笔记是根据Bilibili里的【3小时超快速入门Python | 动画教学【2025新版】【自学Python教程】【零基础Python】【计算机二级Python】【Python期末速成】】 https://www.bilibili.com/video/BV1Jgf6YvE8e/这个视频合集制作的代码笔记! 1.字符串连接 运行结果 2.…

当通过PHP在线修改文件数组遇到不能及时生效问题

当你通过PHP在线修改文件中的数组(比如配置文件、缓存文件等)后,发现修改不能及时生效,常见原因和解决办法如下: 1. 缓存未刷新 问题描述:PHP应用通常会对配置、数据等做缓存(如Redis、Memcached、OPcache、文件缓存等),导致你修改了文件但实际运行时还是旧内容。解决…

LLaMA-Adapter

一、技术背景与问题 1.1 传统方法的数学局限 二、LLaMA-Adapter 核心技术细节 2.1 Learnable Adaption Prompts 的设计哲学 这种零初始化注意力机制的目的是在训练初期稳定梯度,避免由于随机初始化的适配提示带来的不稳定因素。通过门控因子gl​的自适应调整,在训…

以太联Intellinet带您深度解析PoE交换机的上行链路端口(Uplink Ports)

在当今网络技术日新月异的时代,以太网供电(PoE)交换机已然成为现代网络连接解决方案中不可或缺的“利器”。它不仅能够出色地完成数据传输任务,还能为所连接的设备提供电力支持,彻底摆脱了单独电源适配器的束缚,让网络部署更加简洁…

Linux服务器安全如何加固?禁用不必要的服务与端口如何操作?

保护Linux服务器的安全性对于确保系统的稳定性和数据的保密性至关重要。加固Linux服务器的安全性包括禁用不必要的服务和端口,以减少潜在的攻击面。本文将探讨如何加固Linux服务器的安全性,具体介绍如何禁用不必要的服务和端口,从而提高服务器…

RabbitMQ的核心原理及应用

在分布式系统架构中,消息中间件是实现服务解耦、流量缓冲的关键组件。RabbitMQ 作为基于 AMQP 协议的开源消息代理,凭借高可靠性、灵活路由和跨平台特性,被广泛应用于企业级开发和微服务架构中。本文将系统梳理 RabbitMQ 的核心知识&#xff…

WPF MVVM Community Toolkit. Mvvm 社区框架

Community Toolkit. Mvvm 社区框架 微软官方文档 主要内容:CommunityToolkit.Mvvm 框架 概念,安装,使用(重要API:ObservableObject,RelayCommand)源生成器([ObservableProperty]&…

Mcu_Bsdiff_Upgrade

系统架构 概述 MCU BSDiff 升级系统通过使用二进制差分技术,提供了一种在资源受限的微控制器上进行高效固件更新的机制。系统不传输和存储完整的固件映像,而是只处理固件版本之间的差异,从而显著缩小更新包并降低带宽要求。 该架构遵循一个…

vscode连接WSL卡住

原因:打开防火墙 解决: 使用sudo ufw disable关闭防火墙

FreeSWITCH rtcp-mux 测试

rtcp 跟 rtp 占用同一个端口,这就是 rtcp 复用 Fs 呼出是这样的: originate [rtcp_muxtrue][rtcp_audio_interval_msec5000]user/1001 &echo 需要同时指定 rtcp_audio_interval_msec,否则 rtcp_mux 不能生效 Fs 呼入不需要配置&#xf…

CI/CD的演进之路

CI/CD的演进之路 一、CI/CD的成长演变 早期起源与初步实践:CI/CD的概念可以追溯到软件开发的早期阶段,但真正开始受到关注是在敏捷开发方法兴起之后。在传统的瀑布模型开发模式下,软件开发周期长、发布频率低,更新往往需要数月甚…

Docker 镜像打包到本地

保存镜像 使用 docker save 命令将镜像保存为一个 tar 文件。命令格式如下: docker save [options] IMAGE [IMAGE...]示例:docker save -o centos.tar centos:latest--output 或 -o:将输出保存到指定的文件中。 加载镜像 如果需要在其他机器…

在 Excel xll 自动注册操作 中使用东方仙盟软件2————仙盟创梦IDE

// 获取当前工作表名称string sheetName (string)XlCall.Excel(XlCall.xlfGetDocument, 7);// 构造动态名称(例如:Sheet1!MyNamedCell)string fullName $"{sheetName}!MyNamedCell";// 获取引用并设置值var namedRange (ExcelRe…

云计算与大数据进阶 | 28、存储系统如何突破容量天花板?可扩展架构的核心技术与实践—— 分布式、弹性扩展、高可用的底层逻辑(下)

在上篇中,我们围绕存储系统可扩展架构详细探讨了基础技术原理与典型实践。然而,在实际应用场景中,存储系统面临的挑战远不止于此。随着数据规模呈指数级增长,业务需求日益复杂多变,存储系统还需不断优化升级&#xff0…

从0到1打造AI Copilot:用SpringBoot + ChatGPT API实现智能开发助手

本文将从0到1系统性地讲解如何基于SpringBoot与OpenAI ChatGPT API打造一款智能开发助手(AI Copilot)。文章首先介绍AI Copilot的背景与价值,接着深入架构设计与环境准备,然后通过详尽的代码示例演示SpringBoot项目的搭建、依赖配…

C# AI(Trae工具+claude3.5-sonnet) 写前后端

这是一个AI 写的前后端分离项目,通过AI编程,开发电商管理系统(登陆、注册) 使用的AI工具为 Trae工具(字节国际版)claude3.5-sonnet(目前代码最强模型) 前端为 vue3Bootstrap 后端为 C# net5.0(因为我电脑里面已经安装了这个新版更好) do…

Vue3 Element Plus 对话框加载实现

在 Vue3 Element Plus 中实现对话框加载效果&#xff0c;可以通过以下两种方式实现&#xff1a; 方式一&#xff1a;使用 v-loading 指令&#xff08;推荐&#xff09; vue 复制 下载 <template><el-button click"openDialog">打开对话框</el-b…

VsCode开发环境之Node.js离线部署

1.下载node部署文件 地址为&#xff1a;CNPM Binaries Mirror 2.下载后解压 3.验证版本 4.配置环境变量 5.外网寻找一个对应项目的npm文件--node_modules 6.node_modules文件夹复制到node.js的路径下 7.接着就可以正常运行了。

MySQL中的重要常见知识点(入门到入土!)

基础篇 基础语法 添加数据 -- 完整语法 INSERT INTO 表名 (字段名1, 字段名2, ...) VALUES (值1, 值2, ...);-- 示例 insert into employee(id,workno,name,gender,age,idcard,entrydate) values(1,1,Itcast,男,10,123456789012345678,2000-01-01) 修改数据 -- 完整语法 UPDA…