在运维工作中,Mysql 双主复制原理是什么?

news/2025/2/28 12:31:36/文章来源:https://www.cnblogs.com/huangjiabobk/p/18742986

在 MySQL 中,双主复制(Multi-Master Replication)是一种高级的复制架构,允许两个或多个主节点(Master)之间相互复制数据。这种架构通常用于实现高可用性、负载均衡或地理分布式部署。在双主复制中,每个主节点既可以接收写操作,也可以将数据同步到其他主节点。

1. MySQL 双主复制的原理
1. 基本架构

在双主复制中,每个主节点都配置为另一个主节点的从节点(Slave)。数据变更在任何一个主节点上发生后,都会通过二进制日志(Binlog)同步到其他主节点。这种架构通常是双向的,但也可以扩展为多主复制(多个主节点相互同步)。

2. 数据同步流程

双主复制的数据同步流程基于 MySQL 的主从复制机制,具体步骤如下:

  1. 记录 Binlog

    • 每个主节点在其本地记录所有数据变更操作到 Binlog 中。这些变更包括 INSERTUPDATEDELETE 等 DML 操作,以及部分 DDL 操作。
  2. 拉取 Binlog

    • 每个主节点作为从节点,通过 I/O 线程连接到对端主节点,拉取对方的 Binlog 并将其写入到本地的中继日志(Relay Log)中。
  3. 重放事务

    • 每个主节点的 SQL 线程读取中继日志中的事务,并在本地重放这些事务,从而实现数据同步。
3. 冲突解决

由于双主复制允许在多个主节点上进行写操作,因此可能会发生冲突(如主键冲突、更新冲突等)。MySQL 本身不自动解决这些冲突,需要通过以下方式处理:

  • 避免冲突:通过合理的数据分片或业务逻辑设计,确保不同主节点操作的数据范围不重叠。
  • 冲突检测与解决:使用第三方工具(如 pt-heartbeatpt-table-sync)检测和解决冲突。
  • 半同步复制:启用半同步复制,确保事务在提交前被其他主节点确认,减少冲突的可能性。
2. 双主复制的配置方法
1. 配置主节点

每个主节点都需要配置为可以接收来自对端主节点的 Binlog,并将其应用到本地。

-- 在主节点1上
CHANGE MASTER TO MASTER_HOST='master2_ip',MASTER_USER='replication_user',MASTER_PASSWORD='replication_password',MASTER_LOG_FILE='binlog.000001',MASTER_LOG_POS=1234;START SLAVE;
-- 在主节点2上
CHANGE MASTER TO MASTER_HOST='master1_ip',MASTER_USER='replication_user',MASTER_PASSWORD='replication_password',MASTER_LOG_FILE='binlog.000001',MASTER_LOG_POS=1234;START SLAVE;
2. 配置 Binlog

确保每个主节点都启用了 Binlog,并设置了合适的 Binlog 格式(如 ROWMIXED)。

[mysqld]
log-bin=mysql-bin
binlog-format=ROW
server-id=1
3. 配置冲突解决

为了避免冲突,可以采用以下策略:

  • 自增主键偏移量

    -- 在主节点1上
    SET GLOBAL auto_increment_offset = 1;
    SET GLOBAL auto_increment_increment = 2;-- 在主节点2上
    SET GLOBAL auto_increment_offset = 2;
    SET GLOBAL auto_increment_increment = 2;
    
  • 过滤同步的数据

    -- 在主节点1上
    CHANGE MASTER TO MASTER_HOST='master2_ip', ... MASTER_IGNORE_TABLE=db.table;-- 在主节点2上
    CHANGE MASTER TO MASTER_HOST='master1_ip', ... MASTER_IGNORE_TABLE=db.table;
    
3. 双主复制的优势与挑战
1. 优势
  • 高可用性:任何一个主节点发生故障时,另一个主节点可以接管。
  • 负载均衡:写操作可以在多个主节点上分担,提高系统的整体性能。
  • 地理冗余:支持跨数据中心或跨地区的数据同步,提高系统的容灾能力。
2. 挑战
  • 数据冲突:多个主节点上的写操作可能导致数据冲突,需要额外的机制解决。
  • 延迟问题:数据同步可能存在延迟,尤其是在跨地区部署时。
  • 复杂性:配置和维护双主复制比单向主从复制更复杂,需要更多的监控和管理。
4. 双主复制的运维注意事项
1. 监控复制状态

定期检查每个主节点的复制状态,确保数据同步正常。

SHOW SLAVE STATUS\G;

重点关注以下字段:

  • Slave_IO_RunningSlave_SQL_Running:确保两个线程都在运行。
  • Last_SQL_Error:检查是否有错误发生。
2. 处理冲突

如果发生冲突,可以通过以下方式解决:

  • 跳过冲突事务

    STOP SLAVE;
    SET GLOBAL sql_slave_skip_counter = 1;
    START SLAVE;
    
  • 手动修复数据:检查冲突的记录并手动修复。

3. 性能优化
  • 启用半同步复制:减少数据丢失的风险。
  • 优化网络:降低网络延迟,提高复制效率。
4. 数据一致性

使用工具(如 pt-table-checksumpt-table-sync)定期检查和修复数据一致性问题。

5. 我的总结

综上所述,MySQL 双主复制通过多个主节点相互同步数据,实现了高可用性、负载均衡和地理冗余。其核心原理是基于 MySQL 的主从复制机制,通过 Binlog 同步和事务重放实现数据一致性。然而,双主复制也带来了数据冲突、延迟和配置复杂性等挑战。在运维工作中,合理设计架构、监控复制状态、处理冲突和优化性能是确保双主复制稳定运行的关键。

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

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

相关文章

如何判断大小端?

联合体成员低地址对齐方法一:联合体 #include <stdio.h> #include <malloc.h>union myunion {int a;char b; };int main(void) {union myunion test;test.a = 0x12345678; if (test.b == 0x78)printf("小端模式"); else if (test.b == 0x12)printf(&q…

hexo 本地启动项目 hexo-browsersync 不工作原因总结

问题 1 : hexo-server 开启 compress 压缩后 hexo-browsersync 插件热更新完全无效,没办法自动刷新 此问题表现在 hexo 任何版本 问题原因: hexo-server 依赖 compression^1.7.4 会自动安装 compression@1.8.0,压缩后 Content-Encoding 不是 gzip 而是 br, hexo-browsersy…

共振底选股思路和案例

当前时间: 2025年2月28日 主图中的所有提示都编写了选股指标,我无偿分享。 共振底选股思路: 在短线、中线均都向上的情况下,同时出现以下条件的两个以上,则为共振底。 1. 1025战法的低吸位附近出现止跌阳线。 2. 小底图形反包。 3. 泰乐KDJ副图指标显示【大进】、【逛进】…

Vue2/Vue3 项目生产环境开启 vue devtools 插件线上调试 vue 组件

说到 vue 项目的调试工具,必然少不了 “vue devtools 插件”,此插件就像“手术刀”一样,是开发环境下的一个利器,生产环境一般情况没办法使用。 要在生产环境使用,就必须要一点手段。前置条件安装 Chrome 浏览器,本文编写时使用的 Google Chrome 133 版本。 安装 vue dev…

Windows编程系列:获取系统BIOS信息

在前面的文章中,介绍过WMI的使用 https://www.cnblogs.com/zhaotianff/p/14764740.html在Win32 Provider下面提供了一个Win32_BIOS类,可以获取BIOS信息我们还可以通过SMBIOS标准规范来获取BIOS信息SMBIOS介绍 SMBIOS (System Management BIOS ,系统管理BIOS)是通过系统固件…

【大模型安全】大模型攻击测试案例分析

本节通过对实际案例的研究,直观展示大模型(LLM)攻击测试是如何识别模型中存在的安全隐患。为确保被测大模型系统的安全运行,我们仅执行了无危害的查询操作,目的是发现潜在的安全漏洞和风险点。 案例1: 某互联网厂商LLM存在远程代码执行漏洞(过度代理),攻击者可通过此漏…

谷歌 Chrome 浏览器离线安装 vue devtools 插件

由于某些原因,Chrome 应用商店访问不了,所以只能离线安装 vue devtools 插件,离线安装也有两种方法。 方法一:自编译 vue devtools 插件 这方法要求动手能力强的同学。前往 github 下载 vue devtools 插件源码(https://github.com/vuejs/devtools)。在本地编译源码。编译成…

CRM选型避坑指南:别踩这些常见雷区!

选CRM就像找工作,选错了不仅折腾自己,还浪费时间和钱。 市面上CRM那么多,花里胡哨的功能一堆,价格跨度也大,选起来就像进了迷宫,一不小心就掉坑里。所以今天就聊聊那些常见的选型雷区,教你如何避开这些坑,选到真正适合自己的CRM!这里整理好了最好用CRM系统——简道云 …

医院HIS系统通过互联网调用医保内网(专网)接口

前言其实更准确的主题应该为:如何通过互联网访问专网服务器的http 服务,因为原理是一样的。全国医保刚实行升级时,很多HIS开发人员通过远程医院前置机再跳转医保网进行调试,操作很麻烦,如果能在办公室通过互联网直接访问医保网那就太方便了。全国医保的接口都是通过http方…

No.26 JavaScript--简介

前端3件套:HTML CSS JS 一、JS简介JavaScript 是一种轻量级的脚本语言。所谓“脚本语言”,指的是它不具备开发操作系统的能力,而是只用来编写控制其他大型应用程序的“脚本”。 JavaScript 是一种嵌入式(embedded)语言。它本身提供的核心语法不算很多。1.为什么学JS操控浏…

打造自主高效团队:企业团队协作工具私有化部署指南

企业团队协作工具的私有化部署是指将软件部署在企业自有的服务器上,而非使用公有云或第三方平台。以下是对企业团队协作工具私有化的详细分析: 一、私有化的优势 ● 数据安全可控:企业数据存储在本地服务器,无需上传至第三方平台,有效降低数据泄露风险,满足企业对数据安全…

快收藏!一个技巧从此不再搞混缓存穿透和缓存击穿

在 Redis 中有两个定义:一个缓存击穿、一个缓存穿透,因为二者的名字比较像,因此很容易就搞混了。但本文会给你提供一个记忆的小技巧,帮你彻底区分二者的定义。 在讲这个技巧之前,我们先来了解一下二者的区别。 1.定义与区别缓存穿透(Cache Penetration):缓存穿透是指查…