探秘MySQL主从复制的多种实现方式

news/2024/5/7 14:55:50

欢迎来到我的博客,代码的世界里,每一行都是一个故事


在这里插入图片描述

探秘MySQL主从复制的多种实现方式

    • 前言
    • 基于语句的复制
      • 原理
      • 实现方法
      • 应用场景及优缺点
        • 应用场景
        • 优点
        • 缺点
    • 基于行的复制
      • 原理
      • 实现方法
      • 优势和适用性
        • 优势
        • 适用性
    • 基于混合模式的复制
      • 混合模式复制的工作原理
      • 混合模式复制的优势
      • 混合模式复制在不同场景下的应用和配置方法
    • 基于GTID
      • 工作原理
      • 优势
        • 简化配置和管理
        • 提高容错性
        • 配置方法
    • 多源复制
      • 什么是多源复制?
      • 多源复制的优点
      • 如何配置多源复制?
      • 多源复制的应用场景

前言

数据库就像是一座巨大的图书馆,而MySQL的主从复制技术就像是这座图书馆中的藏书分发系统,能够让我们的读者在不同的阅览室中阅读到同样的书籍。而今天,就让我们一起来探索MySQL主从复制的多种实现方式,带您进入这座神秘的数据库世界!

基于语句的复制

基于语句的复制(Statement-Based Replication, SBR)是MySQL复制的一种模式,它在主服务器(master)上执行的每一个SQL语句都会被记录到二进制日志(binary log)中。然后,这些SQL语句会被复制到从服务器(slave)上,并在从服务器上重新执行,从而达到主从数据一致的目的。

原理

在基于语句的复制模式中,当在主服务器上执行一个SQL操作时,MySQL会将这个操作转换成一个相应的日志事件,并将其写入到二进制日志中。从服务器上的复制线程会定期从主服务器上读取这些日志事件,并在从服务器上重新执行它们。

实现方法

  1. 配置主服务器:在主服务器的配置文件(通常是my.cnfmy.ini)中,需要开启二进制日志,并指定服务器ID。
[mysqld]
log-bin=mysql-bin
server-id=1
  1. 配置从服务器:在从服务器的配置文件中,也需要指定服务器ID(确保与主服务器不同),并配置主服务器的信息。
[mysqld]
server-id=2

之后,你需要在从服务器上执行CHANGE MASTER TO命令,指定主服务器的地址、登录凭证、二进制日志文件名及位置。

  1. 启动复制:在从服务器上,启动复制进程。
START SLAVE;

应用场景及优缺点

应用场景
  • 读写分离:基于语句的复制可以用于读写分离,提高数据库的读取性能。
  • 数据备份:通过在从服务器上复制数据,可以实现数据的实时备份。
  • 灾难恢复:在主服务器出现故障时,可以快速切换到从服务器,保证服务的连续性。
优点
  • 效率高:只复制执行的SQL语句,而不是数据本身,减少了数据传输量。
  • 兼容性好:几乎所有的SQL操作都可以通过基于语句的复制进行复制。
缺点
  • 非确定性操作:对于一些非确定性的SQL语句(如使用NOW()RAND()函数的语句),可能在主从服务器上产生不一致的结果。
  • 依赖环境:由于复制是通过重新执行SQL语句实现的,从服务器上必须具有与主服务器相同的数据库结构和相似的环境设置。
  • 潜在的性能问题:对于一些复杂的SQL语句,可能会在从服务器上消耗更多的资源来重新执行。

总的来说,基于语句的复制是MySQL复制中一个简单高效的模式,适用于多种场景。但在使用时,也需要注意其潜在的问题,特别是在涉及非确定性操作和高资源消耗操作时,可能需要考虑其他复制模式。

基于行的复制

基于行的复制(Row-Based Replication, RBR)是MySQL复制的一种方式,它与基于语句的复制(SBR)有所不同。在RBR中,复制过程不是通过复制执行的SQL语句,而是通过复制数据变更后的行来实现的。

原理

当在主服务器上执行数据修改操作(如INSERT、UPDATE、DELETE)时,MySQL会识别出哪些数据行被修改,并生成相应的行事件。这些行事件会记录具体的数据变更,然后被写入到二进制日志中。从服务器从主服务器的二进制日志中读取这些行事件,并在本地应用这些变更,从而与主服务器保持数据一致。

实现方法

基于行的复制的设置与基于语句的复制类似,但需要确保复制格式设置为基于行。

  1. 在主服务器上配置:在my.cnfmy.ini配置文件中,设置复制格式为基于行,并指定服务器ID。
[mysqld]
binlog_format=ROW
log-bin=mysql-bin
server-id=1
  1. 在从服务器上配置:在从服务器的配置文件中,设置服务器ID(确保与主服务器不同),并配置主服务器信息。
[mysqld]
server-id=2
  1. 启动复制进程:在从服务器上执行CHANGE MASTER TO命令,配置主服务器的信息,并启动复制。
START SLAVE;

优势和适用性

优势
  • 数据一致性:由于是基于数据行的变更来复制,因此可以避免基于语句复制中由于非确定性函数或语句导致的数据不一致问题。
  • 减少冲突:在高并发的环境下,基于行的复制减少了由于复制延迟导致的数据冲突。
  • 适用于复杂查询:对于包含复杂查询和函数的操作,基于行的复制只关注结果的变化,因此可以保证从服务器的数据准确性。
适用性
  • 数据更新频繁的场景:在数据更新操作非常频繁的场景中,基于行的复制能够有效地保持主从服务器间的数据一致性。
  • 大量的DML操作:对于有大量INSERT、UPDATE和DELETE操作的数据库,基于行的复制确保了复制的效率和准确性。
  • 复杂的SQL操作:当执行的SQL语句在从服务器上可能产生不同结果时,基于行的复制是更好的选择,因为它复制的是数据的变化,而不是SQL语句本身。

总而言之,基于行的复制在数据更新频繁和复杂SQL操作的场景下提供了优势,因为它专注于数据的变化本身,从而减少了数据不一致的风险,并且通常可以提供更好的复制性能。然而,需要注意的是,由于复制的是行变更的信息,对于数据量大的变更操作,基于行的复制可能会产生比基于语句复制更大的二进制日志。

基于混合模式的复制

混合模式复制的工作原理

混合模式复制是一种数据复制策略,结合了异步复制和同步复制的优点。在混合模式复制中,一部分数据节点使用同步复制,另一部分数据节点使用异步复制。

在同步复制中,当一条数据写入原始节点时,该数据同时也会写入所有的备份节点。只有当所有的备份节点确认数据写入成功后,写入操作才会被确认为成功。这种方式保证了数据的一致性,但可能会因为网络延迟或备份节点的处理能力而影响写入速度。

在异步复制中,数据首先被写入原始节点,然后在后续的某个时间点,这些数据被复制到备份节点。这种方式的写入速度较快,但在某些情况下可能会导致数据的不一致。

混合模式复制通过将一部分备份节点设置为同步复制,一部分设置为异步复制,既保证了数据的一致性,又提高了写入速度。

混合模式复制的优势

  1. 数据一致性:通过同步复制,混合模式复制确保了至少一部分备份节点与原始节点的数据一致。
  2. 写入速度:通过异步复制,混合模式复制提高了写入速度,减少了由于等待备份节点确认而产生的延迟。
  3. 灵活性:用户可以根据自己的需求,调整同步复制和异步复制节点的比例,以达到最佳的效果。

混合模式复制在不同场景下的应用和配置方法

  • 数据一致性要求较高的场景:在这种场景下,可以增加同步复制节点的比例,以确保数据的一致性。
  • 写入速度要求较高的场景:在这种场景下,可以增加异步复制节点的比例,以提高写入速度。

混合模式复制的配置方法因具体的数据库系统而异。一般来说,可以通过配置文件或命令行参数,指定哪些节点为同步复制,哪些节点为异步复制。

总的来说,混合模式复制提供了一种灵活的数据复制策略,能够根据不同的应用场景和需求,提供高效且一致的数据复制服务。

基于GTID

基于 GTID 的复制是 MySQL 数据库复制的高级特性,它使用全局事务标识符(GTID)来跟踪和管理数据库的复制过程。每个事务都有一个唯一的 GTID,这使得复制过程更加可靠和易于管理。

工作原理

当事务在主服务器上提交时,它被赋予一个唯一的 GTID,这个标识符随着二进制日志一起被记录下来。从服务器在复制过程中,会通过 GTID 来确保它接收和执行的事务是完整和唯一的,同时保持与主服务器的事务顺序一致。

优势

简化配置和管理
  • 自动化复制复位:GTID 让从服务器可以自动找到主服务器上的正确位置继续复制,即使在主服务器发生故障后进行了故障转移。
  • 易于监控:通过检查 GTID 执行和未执行的集合,可以轻松监控复制状态和任何潜在的复制延迟。
提高容错性
  • 无缝故障转移:在多主服务器的复制设置中,如果一个主服务器宕机,其他的主服务器可以接管,而不会丢失事务。
  • 避免复制错误:GTID 确保每个事务只复制一次,避免了复制过程中的重复或丢失。
配置方法
  1. 启用 GTID:在主服务器和所有从服务器的配置文件(my.cnfmy.ini)中启用 GTID。
[mysqld]
gtid_mode=ON
enforce_gtid_consistency=ON
log-bin
log-slave-updates
  1. 配置主从服务器:在从服务器上设置主服务器的信息,并启动 GTID 复制。
    CHANGE MASTER TO MASTER_HOST='主服务器地址', MASTER_USER='复制用户', MASTER_PASSWORD='复制密码', MASTER_AUTO_POSITION=1;START SLAVE;
  1. 检查 GTID 复制状态:在主从服务器上检查复制状态,确保 GTID 正确配置并且复制在正常运行。
    SHOW SLAVE STATUS\G
  1. 故障转移:如果主服务器发生故障,您可以使用 GTID 来选择新的主服务器,并使从服务器重新连接并开始复制。

基于 GTID 的复制为 MySQL 数据库提供了一个更加稳定、可靠、易于管理的复制环境。尤其在具有高可用需求的大型数据库系统中,基于 GTID 的复制是推荐的复制方式。

多源复制

多源复制(Multi-Source Replication)是MySQL 5.7版本开始引入的新特性,它允许一台从库连接多个主库进行复制。在此之前,MySQL只支持单源复制,即一台从库只能连接一个主库进行复制。

什么是多源复制?

多源复制是指一台MySQL服务器可以从多个主库复制数据。每个主库和从库的复制关系独立于其他主库,每个复制通道独立运行。

多源复制的优点

  • 降低系统复杂度和成本:在多源复制的架构中,无需再为每个主库部署独立的从库,减少了硬件和维护的成本。
  • 提高灵活性:多源复制提供了更多的复制策略,用户可以根据业务需求灵活配置。
  • 提高可用性:在某个主库出现问题时,从库可以从其他正常的主库复制数据,保证了业务的连续性。

如何配置多源复制?

配置多源复制的步骤与配置单源复制类似,主要的区别在于在从库上需要为每个主库配置一个独立的复制通道。每个复制通道由一个唯一的通道名来标识。

多源复制的应用场景

多源复制在很多场景下都非常有用,比如数据聚合,数据备份,以及提高查询性能等。

总的来说,多源复制作为MySQL 5.7版本的新特性,它的引入极大地提高了MySQL的灵活性和可用性。


http://www.mrgr.cn/p/71465333

相关文章

数值分析复习:Richardson外推和Romberg算法

文章目录 Richardson外推Romberg(龙贝格)算法 本篇文章适合个人复习翻阅,不建议新手入门使用 本专栏:数值分析复习 的前置知识主要有:数学分析、高等代数、泛函分析 本节继续考虑数值积分问题 Richardson外推 命题&a…

WindowsPE重装Windows系统详细介绍

本文详细介绍了WindowsPE、UEFI BIOS、如何制作WindowsPE、网络唤醒WOL、如何格式化硬盘及分区 、GHost还原数据、驱动程序分类相关知识目录目录理论知识 什么是WindowsPE? 什么是UEFI BIOS?(简)实操 如何制作WindowsPE? 如何进入BIOS? 常用项介绍 设置U盘启动 网络…

02_c/c++开源库ZeroMQ

1.安装 C库 libzmq sudo apt install libzmq3-dev 实例: https://zeromq.org/get-started/?languagec&librarylibzmq# 编译依赖: pkg-config --cflags --libs libzmq or cat /usr/lib/x86_64-linux-gnu/pkgconfig/libzmq.pc -isystem /usr/include/mit-krb5 -I/usr/in…

dwc3控制器是怎么处理otg

概念 在OTG中,初始主机设备称为A设备,外设称为B设备。可用电缆的连接方式来决定初始角色。两用设备使用新型Mini-AB插座,从而使Mini-A插头、Mini-B插头和Mini-AB插座增添了第5个引脚(ID),以用于识别不同的…

存储器数据恢复相关知识

讲述硬盘基本结构及其储存理论,介绍如何恢复常用存储器数据。目录目录理论知识 硬盘如何储存数据? 磁道和扇区简介 盘面号 磁道 柱面 扇区 硬盘如何读写数据? 数据删除原理 数据如何丢失的? 人为原因造成的数据丢失: 自然灾害造成的数据丢失: 软件原因造成…

ARM学习(26)链接库的依赖查看

笔者今天来聊一下查看链接库的依赖。 通常情况下,运行一个可执行文件的时候,可能会出现找不到依赖库的情况,比如图下这种情况,可以看到是缺少了license.dll或者libtest.so,所以无法运行。怎么知道它到底缺少什么dll呢&…

构建RAG应用-day05: 如何评估 LLM 应用 评估并优化生成部分 评估并优化检索部分

评估 LLM 应用 1.一般评估思路 首先,你会在一到三个样本的小样本中调整 Prompt ,尝试使其在这些样本上起效。 随后,当你对系统进行进一步测试时,可能会遇到一些棘手的例子,这些例子无法通过 Prompt 或者算法解决。 最终,你会将足够多的这些例子添加到你逐步扩大的开发集中…

android脱壳第二发:grpc-dumpdex加修复

上一篇我写的dex脱壳,写到银行类型的app的dex修复问题,因为dex中被抽取出来的函数的code_item_off 的偏移所在的内存,不在dex文件范围内,所以需要进行一定的修复,然后就停止了。本来不打算接着搞得,但是写了…

ELK 日志分析系统(二)

一、ELK Kibana 部署 1.1 安装Kibana软件包 #上传软件包 kibana-5.5.1-x86_64.rpm 到/opt目录 cd /opt rpm -ivh kibana-5.5.1-x86_64.rpm 1.2 设置 Kibana 的主配置文件 vim /etc/kibana/kibana.yml --2--取消注释,Kiabana 服务的默认监听端口为5601 server.po…

简单的jmeter脚本自动化

1、创建线程组,定义自定义变量,保存请求默认值 2、用csv编写测试用例 备注:如果单元格内本身就有引号,则格式会有点小问题,不能直接修改为csv 用txt打开后 有引号的需要在最外层多包一层引号,每个引号前…

SpringBoot+vue开发记录(二)

说明:本篇文章的主要内容为SpringBoot开发中后端的创建 项目创建: 1. 新建项目: 如下,这样简单创建就行了,JDK什么的就先17,当然1.8也是可以的,后面可以改。 这样就创建好了: 2. pom.xml…

Golang | Leetcode Golang题解之第44题通配符匹配

题目: 题解: func isMatch(s string, p string) bool {for len(s) > 0 && len(p) > 0 && p[len(p)-1] ! * {if charMatch(s[len(s)-1], p[len(p)-1]) {s s[:len(s)-1]p p[:len(p)-1]} else {return false}}if len(p) 0 {retur…

go的编译以及运行时环境

开篇 很多语言都有自己的运行时环境,go自然也不例外,那么今天我们就来讲讲go语言的运行时环境! 不同语言的运行时环境对比 我们都知道Java的运行时环境是jvm ,javascript的运行时环境是浏览器内核 Java -->jvm javascript…

基于Springboot的网课管理系统

基于SpringbootVue的网课管理系统的设计与实现 开发语言:Java数据库:MySQL技术:SpringbootMybatis工具:IDEA、Maven、Navicat 系统展示 用户登录 首页 课程表 论坛交流 学校公告 后端 学生管理 教师管理 班级管理 课程分类管理…

TODO -蓝桥杯2018年A组-付账问题

0.题目 题目描述 几个人一起出去吃饭是常有的事。但在结帐的时候,常常会出现一些争执。 现在有 \(n\) 个人出去吃饭,他们总共消费了 \(S\) 元。其中第 \(i\) 个人带了 \(a_i\) 元。幸运的是,所有人带的钱的总数是足够付账的,但现在问题来了:每个人分别要出多少钱呢? 为了…

【TCP:可靠数据传输,快速重传,流量控制,TCP流量控制】

文章目录 可靠数据传输TCP:可靠数据传输TCP发送方事件快速重传流量控制TCP流量控制 可靠数据传输 TCP:可靠数据传输 TCP在IP不可靠服务的基础上建立了rdt 管道化的报文段 GBN or SR 累计确认(像GBN)单个重传定时器(像…

小伙伴:我是专升本,能不写在简历里吗?

大家好,我是树哥。 最近我推出了简历辅导服务(详见:500 块就能获得 10 年的行业经验,太赚了!),有一位同学找我做了简历辅导。 在阅读他的简历的时候,我发现他的学历没有写入学时间和毕业时间,感觉不是很直观,于是让他补全一下。小伙伴回复说:我是专升本的,本科只有…

JetBrains PhpStorm v2024.1 安装教程 (PHP集成开发IDE)

前言 PhpStorm是由JetBrains推出的一款轻量级集成开发环境,专为PHP开发者而设计。该软件融合了智能的HTML/CSS/JavaScript/PHP编辑器、代码质量分析工具、版本控制系统集成(包括SVN和GIT)、调试和测试等功能。除此之外,PhpStorm还…

PyQt介绍——动画使用详解之QPropertyAnimation

一、继承关系 PyQt5的动画框架是QAbstractAnimation,它是一个抽象类,不能直接使用,需要使用它的子类。它的类结构如下: QAbstractAnimation:抽象动画,是所有动画的基类,不能直接使用。 QVariant…

Jetpack Compose 中如何实现全面屏

看问题本质,设置全面屏,是系统窗口的行为,与 View 和 Compose 有什么关系呢? 所以,原理和传统 View 视图是一样的,甚至 Api 都是一模一样的,不熟悉的可以看我之前的文章。传送门: Android 全面屏体验 那为什么还要写这篇文章呢?主要是在 Compose 中写法上的一些区别,…