工作5年,没听过MySQL半同步复制,是我的问题吗?

在这里插入图片描述

目录

    • 一、存储高可用
    • 二、读写分离
    • 三、解决主从复制延迟问题的几种方案
      • 1、写操作后的读操作指定发给数据库主服务器
      • 2、读从机失败后再读一次主机
      • 3、关键业务读写操作全部指向主机,非关键业务采用读写分离
      • 4、压缩与批量传输
      • 5、优化从库的查询性能
      • 6、优化网络延迟
      • 7、调整复制参数
      • 8、监控与报警机制
      • 9、提高从库的硬件性能
    • 四、半同步复制是什么
    • 五、半同步复制的优缺点
      • 1、半同步复制的优点
      • 2、半同步复制的缺点
    • 六、半同步复制的流程

AI时代智享——50元畅享ChatGPT-4o,解锁无限创作与优化可能

现价:仅需50元,首开尊享 长久使用!

需要私聊!!!!

👉 GPT功能:

  1. GPT-4o知识问答:支持联网查询,目前最强AI大模型
  2. 最强代码大模型Code Copilot:代码自动补全、代码优化建议、代码重构等
  3. DALL-E AI绘画:AI绘画 + 剪辑 = 自媒体新时代
  4. 私信哪吒,直接使用GPT-4o

在这里插入图片描述

一、存储高可用

对于需要存储数据的系统来说,整个系统的高可用设计关键点和难点就在于“存储高可用”,存储与计算相比,有一个本质上的区别:将数据从一台机器同步到另一台机器,需要经过线路进行传输。传输的速度,同一机房能够做到毫秒级,分布在不同地方的机房,传输耗时需要几十甚至上百毫秒。

虽然毫秒级对人来说几乎没有什么感觉,但对于要求高可用的系统来说,就是本质上的区别。

以最经典的银行储蓄业务为例,假设用户的数据存在北京机房,用户存了1万块钱,然后它查询的时候被路由到了上海机房,此时用户肯定后背一凉,马上怀疑自己的钱被盗了,然后赶紧打客户电话投诉,甚至打110报警,即使最后发现只是因为传输延迟导致的问题,用户的体验也是极差的。

在这里插入图片描述

除了物理上的传输速度限制,传输线路本身也存在可用性问题,传输线路可能中断、可能拥塞、可能异常,并且传输线路的故障时间一般都特别长,短的十几分钟,长的几个小时。

例如,2015年支付宝因为光缆被挖断,业务影响超过4个小时,2016年中美海底光缆中断3小时。

在传输线路中断的情况下,就意味着存储无法进行同步,在这段时间内整个系统的数据是不一致的。

因此,存储高可用的难点不在于如何备份数据,而在于如何减少或规避数据不一致对业务造成的影响。

分布式领域有一个著名的CAP定理,从理论上论证了存储高可用的复杂度。存储高可用不可能同时满足“一致性、可用性、分区容错性”,最多满足其中2个,这就要求我们在做架构设计的时候结合业务进行取舍了。

二、读写分离

在这里插入图片描述

读写分离的基本实现原理:

  1. 数据库服务器搭建主从集群,一主二从
  2. 数据库主机负责写操作,从机负责读操作
  3. 数据库主机通过复制将数据同步到从机,每台数据库服务器都存储了所有的业务数据
  4. 业务服务器将写操作发给数据库主机,将读操作发给数据库从机

读写分离的实现逻辑并不复杂,但在实际应用过程中需要应对复制延迟带来的复杂性。

以MySQL为例,主从复制延迟可能达到1S,如果有大量数据同步,延迟1分钟也是有可能的。

主从复制延迟会带来一个问题,如果业务服务器将数据写入到数据库主服务器后立刻(1S)内进行读取,此时读操作访问的是从机,从机还没有将数据复制过来,此时用户读取的就不是最新数据,业务上可能会存在问题。

例如,用户刚注册完后立刻登录,业务服务器会提示“你还没有注册”,而用户刚才已经注册成功了。

三、解决主从复制延迟问题的几种方案

1、写操作后的读操作指定发给数据库主服务器

2、读从机失败后再读一次主机

这就是大家常说的二次读取,二次读取和业务无绑定,只需要对底层数据库访问的API进行封装即可,实现代价较小,不足之处在于如果有很多二次读取,将大大增加主机的读操作压力。

3、关键业务读写操作全部指向主机,非关键业务采用读写分离

对于不要求实时性的操作,可以通过异步处理,将一些耗时的操作延后执行。

4、压缩与批量传输

通过开启Binlog压缩功能,减少传输数据量,降低网络负担。

在可能的情况下,批量传输数据,而不是逐条记录传输,以提高传输效率。

5、优化从库的查询性能

在从库上创建合理的索引结构,以减少查询的响应时间。

6、优化网络延迟

确保主从数据库之间的网络带宽充足,并且网络延迟尽可能低。可以通过提高带宽、优化网络拓扑结构,或者使用专线等方式减少延迟。

使用网络监控工具监控网络质量,及时发现并解决网络异常问题。

7、调整复制参数

使用半同步复制(Semi-Synchronous Replication)替代完全同步复制,以减少主库等待从库确认的时间。

MySQL 5.6及以上版本支持多线程复制,可以通过增加slave_parallel_workers的值来启用多线程复制,从而加速从库的并发执行。

增加sync_binlog与innodb_flush_log_at_trx_commit的值:这些参数影响主库的Binlog刷新频率,适当调整可以减少延迟。

8、监控与报警机制

通过SHOW SLAVE STATUS命令监控从库的复制延迟情况,并设定报警机制,及时处理复制延迟问题。

配置MySQL的自动故障转移(Failover)机制,在主库出现问题时自动切换到从库。

9、提高从库的硬件性能

为从库配置更高性能的CPU和内存,以提高SQL执行效率。

使用SSD替代HDD以提高磁盘读写速度,从而减少I/O等待时间。

四、半同步复制是什么

半同步复制是MySQL的一种复制模式,它介于全同步复制和异步复制之间,旨在在保证数据一致性和系统性能之间取得平衡。

在传统的异步复制模式中,主库在执行完一条事务后,只需将二进制日志(Binlog)写入本地文件并立即返回给客户端,表示事务提交成功。随后,这些日志会异步地发送到从库,从库再进行重放。这种方式性能较好,但在主库故障时可能会导致部分事务丢失,因为这些事务还没有被从库接收到。

而在半同步复制中,当主库执行完一条事务并写入Binlog后,不会立即返回给客户端,而是会等待至少一个从库确认已经接收到这个Binlog。只有在收到从库的确认信号后,主库才会返回事务提交成功的响应给客户端。如果在设定的超时时间内没有收到从库的确认,主库会回退到异步复制模式,以保证系统的可用性。

五、半同步复制的优缺点

1、半同步复制的优点

(1)数据安全性增强

由于主库在返回事务提交成功之前,至少要确认一个从库已经接收到了该事务的Binlog,因此可以减少数据丢失的风险。

(2)更快的故障恢复

即使主库发生故障,从库已经接收到的事务数据可以使从库迅速接替主库角色,减少数据恢复的时间。

2、半同步复制的缺点

(1)性能开销

半同步复制需要等待从库的确认,会增加事务的提交时间,导致延迟增大,尤其是在网络延迟较大的情况下。

(2)依赖网络

如果网络状况不好,可能频繁超时回退到异步模式,降低整体系统的效率。

六、半同步复制的流程

在这里插入图片描述

  1. 事务执行:客户端在主库上执行事务,事务在主库的存储引擎层完成。
  2. 写入Binlog:主库将事务记录写入二进制日志(Binlog)。
  3. 发送Binlog到从库:主库将Binlog发送到至少一个从库。
  4. 从库确认:从库接收到Binlog后,会立即返回一个确认信号给主库,表示已经接收到并写入Relay Log。
  5. 事务提交成功:主库在收到至少一个从库的确认后,返回事务提交成功的响应给客户端。
  6. 如果主库在一定时间内没有收到从库的确认信号,会回退到异步模式继续执行,以避免系统停滞。

半同步复制适用于那些对数据一致性要求较高,但又不能接受全同步复制带来的高延迟的场景。

常见应用场景包括:

  1. 金融系统:交易数据需要尽可能保证一致性,但仍需要一定的性能。
  2. 高可用集群:在保证一定程度的数据一致性的同时,允许快速故障切换。

通过配置半同步复制,MySQL可以在性能和数据一致性之间取得一定的平衡,减少数据丢失的风险。

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

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

相关文章

构建大师:深入理解Linux下的Make和Makefile

引言 在软件开发的世界里,构建过程是一项繁琐而重要的任务。无论是简单的脚本还是复杂的软件项目,都需要一种方式来自动化编译、链接以及测试等过程。在Linux环境下,Make工具和它的配置文件——Makefile,成为了许多开发者构建项目…

RuoYi-Vue 最新 SpringBoot3 前后端分离版本源码分析

RuoYi-Vue 最新 SpringBoot3 前后端分离版本源码分析 RuoYi-Vue 本地环境部署若依菜单类型权限管理SpringSecurity 配置登录接口(认证管理)Authentication 认证token的生成 权限控制 异步任务管理操作日志数据权限 RuoYi-Vue 本地环境部署 直接去 gitee 上拉取最新版本即可&am…

<Rust>egui学习之小部件(三):如何为窗口UI元件设置布局(间隔、水平、垂直排列)?

前言 本专栏是关于Rust的GUI库egui的部件讲解及应用实例分析,主要讲解egui的源代码、部件属性、如何应用。 环境配置 系统:windows 平台:visual studio code 语言:rust 库:egui、eframe 概述 本文是本专栏的第三篇博…

C++和OpenGL实现3D游戏编程【连载7】——文字和汉字的显示

1、本节实现的内容 上一节我们讨论了纹理在二维平面内不规则图形贴图的相关基础操作,本节我们开始了解游戏里文字以及汉字的显示方法。本节课我们将从基本的ASCII字符显示,拓展到中文字符的显示,最后再讲到纹理字符的显示,并对各种文字显示方法的优缺点和使用场景进行分析…

使用Masscan扫描器进行信息搜集

Masscan 是一款极为高效的端口扫描工具,以其卓越的扫描速度和大规模扫描能力而著称。该工具不仅支持 TCP 和 UDP 协议的扫描,还允许用户根据需求灵活指定多个目标和端口。Masscan 通过采用先进的网络性能优化技术,充分利用操作系统的资源和多…

基于北斗+自组网技术的光伏电场人员位置监控系统优化方案

一、方案背景 1.1 用户需求 随着我国经济的快速发展,光伏电场等新能源项目的建设日益增多。然而,这些项目往往位于偏远地区,通信基础设施不完善,导致施工人员在作业过程中难以与外界保持实时联系。特别是在无人区或信号弱的地区…

【Qt 事件】—— 详解Qt事件处理

目录 (一)事件介绍 (二)事件的处理 (三)按键事件 3.1 单个按键 3.2 组合按键 (四)鼠标事件 4.1 鼠标单击事件 4.2 鼠标释放事件 4.3 鼠标双击事件 4.4 鼠标移动事件 4.5…

101.SAP MII功能详解(15)Workbench-Transaction Logic(Iterator)

目录 1.Logic->Iterator 2.演示 配置连接 Iterator使用示例 1.Logic->Iterator 您可以使用此操作迭代循环浏览List,迭代是指遍历某个List数据结构,逐个访问其元素的过程。迭代使用的场景不多。 2.演示 配置连接 Iterator使用示例 数据源是Lis…

Qt:玩转QPainter序列九(文本,文本框,填充)

前言 继续承接序列八 正文 1. drawImage系列函数 绘制图像 inline void drawImage(const QPoint &p, const QImage &image); 作用: 在指定的点 p 上绘制 QImage 图像。图像的左上角将对齐到 p 点。 inline void drawImage(int x, int y, const QImage &image,…

[001-07-001].Redis7缓存双写一致性之更新策略探讨

1、面试题: 1.只要使用缓存,就可能会涉及到redis缓存与数据库双存储双写,只要是双写,就存在数据一致性问题,那么是如何解决数据一致性问题的2.双写一致性,你先动缓存redis还是数据库MySQL,哪一个…

新能源汽车超级电容和电池能量管理系统的simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 电池模型 4.2 电池荷电状态(SOC)估算 4.3 超级电容器模型 4.4 能量管理 5.完整工程文件 1.课题概述 新能源汽车的能量管理系统(Energy Management System, EMS…

中国艺术孙溟㠭凿篆《无用之用》

孙溟㠭凿篆作品《无用之用》 这方作品是孙溟㠭先生用凿木的方式凿刻出来的,呈现出了凿痕的效果,与众不同。 孙溟㠭凿篆《无用之用》 孙溟㠭凿篆《无用之用》 万般皆有所用,取其长补余短,无用之用是为大用&#xff0…

JS实现高度不等的列表虚拟滚动加载

当我们拿到后台返回的1万条数据展示时,如果完全渲染不仅渲染的时间很长,也会导致浏览器性能变差,使用过程中还可能会导致卡顿,使用体验变差。 就需要我们想办法优化这种情况,这个时候使用虚拟滚动加载就能很好的避免这…

ESXi服务器无法安装Windows11:“不符合此版本的Windows所需最低系统要求“

目录 一、问题描述1.使用环境2.问题截图3.问题解析 二、解决方法Ⅰ1.按 ShiftF10 弹出命令提示符2.在弹出的Dos框中输入regedit,回车,进入注册表。3.打开HKEY_LOCAL_MACHINE\SYSTEM\Setup,并新建 LabConfig 的项,在 LabConfig 下创…

SAP 查询中间表

可以看到如下代码中,查询了底表zdbconn,又查了中间表ZTFI0072 DATA: gv_dbs(20) ,go_exc_ref TYPE REF TO cx_sy_native_sql_error,gv_error_text TYPE string,lv_count TYPE syst_index.SELECT SINGLE conntxtFROM zdbconn INTO gv_dbsWHERE sy…

RK3568 Android 11 蓝牙BluetoothA2dpSink 获取用于生成频谱的PCM

Android 中的 A2DP Sink A2DP Sink 在 Android 系统中主要用于 接收 其他蓝牙设备(如手机、平板、电脑等)发送过来的 高质量的立体声音频。简单来说,它让你的 Android 设备可以充当一个 蓝牙音箱 或 耳机 的角色。 核心功能: 接…

【Java】SpringBoot 单体项目创建 与 整合 Mybatis-Plus

文章目录 前言1. 创建项目与整合MP1.1 IDEA创建SpringBoot项目1.2 SpringBoot整合Mybatis-Plus 2. 远程仓库2.1 创建远程仓库/本地仓库2.2 Add/Commit/Push/Pull 3. 总结与补充3.1 解决refusing to merge unrelated histories3.2 总结3.3 结语 参考资料 SpringBoot 单体项目创建…

Hadoop环境搭建

一、Linux环境准备 Linux命令查询https://www.linuxcool.com/ http://linux.51yip.com/ 安装Linux虚拟机 安装 sudo apt install open-vm-tools 安装 sudo apt install open-vm-tools-desktop (可选)换国内源 ​​ sudo apt update 更新软件列表&…

火焰传感器详解(STM32)

目录 一、介绍 二、传感器原理 1.原理图 2.引脚描述 三、程序设计 main.c文件 IR.h文件 IR.c文件 四、实验效果 五、资料获取 项目分享 一、介绍 火焰传感器是一种常用于检测火焰或特定波长(760nm-1100nm)红外光的传感器。探测角度60左右&am…

Docker占用根目录/存储空间过多如何清理?

问题背景 使用df -h查看磁盘空间时发现根目录空间不多了,已使用96%,红色警告!!! 于是使用df -h /* 一层一层定位,终于找到了一个大文件 9G多的文件夹,位置是: /var/lib/docker/o…