【MySQL数据库事务操作、主从复制及Redis数据库读写分离、主从同步的实现机制】

文章目录

  • MySQL数据库事务操作、主从复制及Redis数据库读写分离、主从同步的实现机制
    • ACID及如何实现
    • 事务隔离级别:
    • MVCC 多版本并发控制
    • MySQL数据库主从复制
    • 主从同步延迟怎么处理
    • Redis 读写分离
      • 1.什么是主从复制
      • 2.读写分离的优点
    • Redis为什么快呢?

MySQL数据库事务操作、主从复制及Redis数据库读写分离、主从同步的实现机制

ACID及如何实现

原子性、一致性、隔离性与持久性

  • 事务的隔离性是通过数据库锁的机制实现的。

  • 事务的一致性由undo log来保证:undo log是逻辑日志,记录了事务的insert、update、deltete操作,回滚的时候做相反的delete、update、insert操作来恢复数据。

  • 事务的原子性持久性由redo log来保证:redolog被称作重做日志,是物理日志,事务提交的时候,必须先将事务的所有日志写入redo log持久化,到事务的提交操作才算完成。

image-20230923193328802

事务隔离级别:

读未提交:当前事务读取时,可以看到其他事务未提交的数据,容易造成脏读;

读已提交:当前事务读取时,可以看到其他事务已提交的数据,在当前事务中可能多次读取的数据不相同,容易造成不可重复读;

可重复读:当前事务读取时,生成一个当前的读取快照,之后的每次读取数据,在快照中读取,但是对于其他事务新插入的数据是可以读到的,容易造成幻读。

串行化:是 4 种事务隔离级别中隔离效果最好的,解决了脏读、可重复读、幻读的问题,但是效果最差,它将事务的执行变为顺序执行,与其他三个隔离级别相比,它就是相当于单线程,后一个事务的执行必须等待前一个事务结束才能执行。

MVCC 多版本并发控制

通过维护数据历史版本,从而解决并发访问情况下的读一致性问题。

READ COMMITTED 是每次读取数据前都生成一个ReadView,这样就能保证自己每次都能读到其它事务提交的数据;

REPEATABLE READ 是在第一次读取数据时生成一个ReadView,这样就能保证后续读取的结果完全一致。

MySQL数据库主从复制

  1. master数据写入,更新binlog
  2. master创建一个dump(转存)线程向slave推送binlog
  3. slave连接到master的时候,会创建一个IO线程接收binlog,并记录到relay log中继日志中
  4. slave再开启一个sql线程读取relay log事件并在slave执行,完成同步
  5. slave记录自己的binglog

image-20230923191820471

主从同步延迟怎么处理

主从同步延迟的原因

一个服务器开放N个链接给客户端来连接的,这样有会有大并发的更新操作, 但是从服务器的里面读取 binlog 的线程仅有一个,当某个 SQL 在从服务器上执行的时间稍长 或者由于某个 SQL 要进行锁表就会导致,主服务器的 SQL 大量积压,未被同步到从服务器里。这就导致了主从不一致, 也就是主从延迟。

主从同步延迟的解决办法

解决主从复制延迟有几种常见的方法:

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

例如,注册账号完成后,登录时读取账号的读操作也发给数据库主服务器。这种方式和业务强绑定,对业务的侵入和影响较大,如果哪个新来的程序员不知道这样写代码,就会导致一个bug。

  1. 读从机失败后再读一次主机

这就是通常所说的 “二次读取” ,二次读取和业务无绑定,只需要对底层数据库访问的 API 进行封装即可,实现代价较小,不足之处在于如果有很多二次读取,将大大增加主机的读操作压力。例如,黑客暴力破解账号,会导致大量的二次读取操作,主机可能顶不住读操作的压力从而崩溃。

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

例如,对于一个用户管理系统来说,注册 + 登录的业务读写操作全部访问主机,用户的介绍、爰好、等级等业务,可以采用读写分离,因为即使用户改了自己的自我介绍,在查询时却看到了自我介绍还是旧的,业务影响与不能登录相比就小很多,还可以忍受。

还有:

1、优化网络环境:主从复制时,减小主从服务器之间网络延迟对数据库同步的影响。可以考虑优化网络之间连接的带宽、增加从库的硬件性能等。

2、增加从库数量:增加从库数量可以增加数据同步的速度和可靠性,同时也能减少每个从库的负担,提高从库响应速度。

3、调整数据库相关参数:可以调整一些MySQL数据库中的相关参数,比如调整binlog格式、binlog缓冲区大小、innodb_flush_log_at_trx_commit等参数,采用半同步模式,以加快数据的同步速度。

4、分区数据库:将数据库分成多个区,每个从库只复制自己所需要的数据区,可以有效的减少排队堵塞、网络传输等方面的延迟问题。

综上所述,优化网络环境、增加从库数量、调整数据库相关参数、分区数据库等方法可以有效的降低MySQL主从复制模式的延迟。

Redis 读写分离

1.什么是主从复制

主机数据更新后根据配置和策略,自动同步到备机的Master/Slaver,Master 以写为主,Slave以读为主

主从复制,是指将一台 Redis 服务器的数据,复制到其他的 Redis 服务器。前者称为 主节点(master),后者称为 从节点(slave)。且数据的复制是 单向 的,只能由主节点到从节点。Redis 主从复制支持 主从同步从从同步 两种,后者是 Redis 后续版本新增的功能,以减轻主节点的同步负担。

从复制主要的作用?

  • 数据冗余: 主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。
  • 故障恢复: 当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复 (实际上是一种服务的冗余)
  • 负载均衡: 在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务 (即写 Redis 数据时应用连接主节点,读 Redis 数据时应用连接从节点),分担服务器负载。尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高 Redis 服务器的并发量。
  • 高可用基石: 除了上述作用以外,主从复制还是哨兵和集群能够实施的 基础,因此说主从复制是 Redis 高可用的基础。

2.读写分离的优点

1.读写分离,性能提高
2.容灾快速恢复

Redis为什么快呢?

Redis的速度⾮常的快,单机的Redis就可以⽀撑每秒十几万的并发,相对于MySQL来说,性能是MySQL的⼏⼗倍。速度快的原因主要有⼏点:

  1. 完全基于内存操作
  2. 使⽤单线程,避免了线程切换和竞态产生的消耗
  3. 基于⾮阻塞的IO多路复⽤机制
  4. C语⾔实现,优化过的数据结构,基于⼏种基础的数据结构,redis做了⼤量的优化,性能极⾼

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

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

相关文章

驱动开发,基于中断子系统完成按键的中断驱动,引入中断底半部

一.引入linux内核中断目的 引入linux内核中断之前,内核访问设备要不断轮询访问; 引入linux内核中断便于内核对设备的访问,当设备事件发生后主动通知内核,内核再去访问设备; 二.linux内核中断实现过程框图 根据软…

mall电商项目(学习记录1)

1.简介 mall项目是一套电商系统,包括前台商城系统及后台管理系统,基于SpringBoot+MyBatis实现,采用Docker容器化部署。前台商城系统包含首页门户、商品推荐、商品搜索、商品展示、购物车、订单流程、会员中心、客户服务、帮助中心等模块。后台管理系统包含商品管理、订单管…

OpenGL之相机

OpenGL本身没有摄像机(Camera)的概念,但我们可以通过把场景中的所有物体往相反方向移动的方式来模拟出摄像机,产生一种我们在移动的感觉,而不是场景在移动。 本节我们将会讨论如何在OpenGL中配置一个摄像机,并且将会讨论FPS风格的…

laravel框架 - 消息队列如何使用

业务场景:项目里边有很多视频资源需要上传到抖音资源库,通过队列一条一条上传。 参考实例:发送邮件,仅供参考 (1)创建任务【生成任务类】 在你的应用程序中,队列的任务类都默认放在 app/Jobs 目录下。如果这个目录不存…

如何自动获取短信验证码?

点击下方关注我,然后右上角点击...“设为星标”,就能第一时间收到更新推送啦~~~ 这篇文章通过解决实际项目开发中遇到的如何自动获取短信验证码的问题,进一步讲述在Java中如何使用正则。 Java中如何使用正则 Java中正则相关类位于java.util.r…

精心制作的小游戏,没有人玩,失落......

引言 昨天有粉丝问我:大佬你好,前阵子我做了一款微信小游戏并且成功的上线了,但是发现并没有人玩,每天零零散散的几个人,有点失落,我觉得自己做的游戏还是挺好玩的,有没有什么办法可以让更多的人能够玩我的小游戏呢? 在粉丝的问题中,笔者仿佛看到了曾…

10路LED驱动器和GPIO控制器禾润HTR3310

供电范围:2.5V~5.5V 10个多功能IO,支持LED驱动或GPIO(电流源调光) LED模式下具有256阶线性调光 任意IO可配置为独立的输入或输出 中断功能,8μs防抖,低电平有效 标准I2C接口,4个I2C器件地址…

栈和队列1——栈的实现及其oj(括号匹配问题)

一,栈的概念 栈是一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。 压栈&#xf…

Otter改造 增加springboot模块和HTTP调用功能

环境搭建 & 打包 环境搭建: 进入 $otter_home/lib 目录执行:bash install.sh 打包: 进入$otter_home目录执行:mvn clean install -Dmaven.test.skip -Denvrelease发布包位置:$otter_home/target 项目背景 阿里…

C# OpenCvSharp 图片模糊检测(拉普拉斯算子)

效果 项目 代码 using OpenCvSharp; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Windows.Forms.VisualStyl…

Python —— pytest框架

1、认识pytest框架 1、搭建自动化框架的思路与流程 1、搭建自动化测试框架的思路和流程,任意测试手段流程都是一致的:手工测试、自动化测试、工具测试 手工测试:熟悉业务 —— 写用例 —— 执行用例并记录结果 —— 生成测试报告自动化测试…

stack与queue的简单封装

前言: stack与queue即栈和队列,先进后出/先进先出的特性我们早已了然于心, 在学习数据结构时,我们利用c语言实现栈与队列,从结构体写起,利用数组或指针表示他们的数据成员,之后再一个个实现他们…