面试39 MySQL读写分离

(1)如何实现mysql的读写分离?

 

其实很简单,就是基于主从复制架构,简单来说,就搞一个主库,挂多个从库,然后我们就单单只是写主库,然后主库会自动把数据给同步到从库上去。

 

(2)MySQL主从复制原理的是啥?

 

主库将变更写binlog日志,然后从库连接到主库之后,从库有一个IO线程,将主库的binlog日志拷贝到自己本地,写入一个中继日志中。接着从库中有一个SQL线程会从中继日志读取binlog,然后执行binlog日志中的内容,也就是在自己本地再次执行一遍SQL,这样就可以保证自己跟主库的数据是一样的。

 

这里有一个非常重要的一点,就是从库同步主库数据的过程是串行化的,也就是说主库上并行的操作,在从库上会串行执行。所以这就是一个非常重要的点了,由于从库从主库拷贝日志以及串行执行SQL的特点,在高并发场景下,从库的数据一定会比主库慢一些,是有延时的。所以经常出现,刚写入主库的数据可能是读不到的,要过几十毫秒,甚至几百毫秒才能读取到。

 

而且这里还有另外一个问题,就是如果主库突然宕机,然后恰好数据还没同步到从库,那么有些数据可能在从库上是没有的,有些数据可能就丢失了。

 

所以mysql实际上在这一块有两个机制,一个是半同步复制,用来解决主库数据丢失问题;一个是并行复制,用来解决主从同步延时问题。

 

这个所谓半同步复制,semi-sync复制,指的就是主库写入binlog日志之后,就会将强制此时立即将数据同步到从库,从库将日志写入自己本地的relay log之后,接着会返回一个ack给主库,主库接收到至少一个从库的ack之后才会认为写操作完成了。

 

所谓并行复制,指的是从库开启多个线程,并行读取relay log中不同库的日志,然后并行重放不同库的日志,这是库级别的并行。

1)主从复制的原理

2)主从延迟问题产生的原因

3)主从复制的数据丢失问题,以及半同步复制的原理

4)并行复制的原理,多库并发重放relay日志,缓解主从延迟问题

 

(3)mysql主从同步延时问题(精华)

 

线上确实处理过因为主从同步延时问题,导致的线上的bug,小型的生产事故

 

show status,Seconds_Behind_Master,你可以看到从库复制主库的数据落后了几ms

 

其实这块东西我们经常会碰到,就比如说用了mysql主从架构之后,可能会发现,刚写入库的数据结果没查到,结果就完蛋了。。。。

 

所以实际上你要考虑好应该在什么场景下来用这个mysql主从同步,建议是一般在读远远多于写,而且读的时候一般对数据时效性要求没那么高的时候,用mysql主从同步

 

所以这个时候,我们可以考虑的一个事情就是,你可以用mysql的并行复制,但是问题是那是库级别的并行,所以有时候作用不是很大

 

所以这个时候。。通常来说,我们会对于那种写了之后立马就要保证可以查到的场景,采用强制读主库的方式,这样就可以保证你肯定的可以读到数据了吧。其实用一些数据库中间件是没问题的。

 

一般来说,如果主从延迟较为严重

 

1、分库,将一个主库拆分为4个主库,每个主库的写并发就500/s,此时主从延迟可以忽略不计

2、打开mysql支持的并行复制,多个库并行复制,如果说某个库的写入并发就是特别高,单库写并发达到了2000/s,并行复制还是没意义。28法则,很多时候比如说,就是少数的几个订单表,写入了2000/s,其他几十个表10/s。

3、重写代码,写代码的同学,要慎重,当时我们其实短期是让那个同学重写了一下代码,插入数据之后,直接就更新,不要查询

如果确实是存在必须先插入,立马要求就查询到,然后立马就要反过来执行一些操作,对这个查询设置直连主库。不推荐这种方法,你这么搞导致读写分离的意义就丧失了

转载于:https://www.cnblogs.com/xiufengchen/p/11259314.html

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

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

相关文章

Angular自学笔记(一)ngModule 元数据

工作硬上开发angular项目,好难啊,上网搜资料教程真的贼少,吐槽真的没什么人用angular,自己学习到处搜集整理的笔记,分享出来,方便查看理解总结。应该适用于angular11系列(更新真快,反正我也不知道之前低版本不同 手动狗头) 什么是angular module(ngModule)? angula…

cookbook_数据结构和算法

1.1将数据分解为单独的变量list_a [1,2,3,4,5,6,7,8,9] a,b,c,d,e,f,g,h,i list_a print(a,b,c,d,e,f,g,h,i) #使用相等数量的参数来接收_,b,c,d,e,f,g,h,_ list_a print(b,c,d,e,f,g,h) #不要的数据使用一个没有用的变量接收 View Code1.2从任意长度的可迭代对象中分解元素…

Angular自学笔记(二)显示数据 绑定属性

显示数据 1.显示数据 ng的模版中,默认用双大括号{{}}绑定组件中的变量显示出来 import {Component } from @angular/core; @Component({selector: app-root,template: `<h1>{{title}}</h1><h2>My favorite hero is: {{myHero}}</h2>`

机器学习概览

什么是机器学习&#xff1f; 广义概念&#xff1a; 机器学习是让计算机具有学习的能力&#xff0c;无需明确的编程 —— 亚瑟萨缪尔&#xff0c;1959 工程概念&#xff1a; 计算机程序利用经验 E 学习任务 T&#xff0c;性能是 P&#xff0c;如果针对任务 T 的性能 P 随着经验 …

Angular自学笔记(?)TemplateRef和ViewContainerRef

ElementRef 由于ng是跨平台的为了减少视图层和渲染层的耦合也为了让ng更适应多平台,ng帮我们封装了ElementRef,我们可以通过ElementRef拿到native元素(在浏览器中也就是我们常说的DOM元素) 下面我们看一段代码 import {Component, ElementRef, AfterViewInit } from @angu…

python之re模块

re模块 re&#xff08;正则&#xff09;简介 ​ 正则就是用一些具有特殊含义的符号组合到一起&#xff08;称为正则表达式&#xff09;来描述字符或者字符串的方法。或者说&#xff1a;正则就是用来描述一类事物的规则。 re元字符 元字符匹配内容\w匹配字母&#xff08;包含中文…

Angular自学笔记(?)ViewChild和ViewChildren

ViewChild 最好在ngAfterViewInit之后,获取模版上的内容 获取普通dom import {AfterViewInit, Component, ElementRef, OnInit, ViewChild} from @angular/core;@Component({selector: app-view-child

IPropertySet接口

Members AllProperties MethodsDescriptionCountThe number of properties contained in the property set.包含属性个数GetAllPropertiesThe name and value of all the properties in the property set.GetPropertiesThe values of the specified properties.GetPropertyThe …

Angular自学笔记(?)ContentChild和ContentChildren

ContentChild 用法类似ViewChild, 获取投影中到组件或指令还有元素dom等 获取投影中但组件 import {AfterViewInit, Component, ElementRef, OnInit, ViewChild} from @angular/core;@Component({selector: app-content-child-panel,templateUrl

Angular自学笔记(?)属性型指令

基本概念 用于改变DOM元素的外观或行为的指令 组件是一种特殊的指令 import {Component} from @angular/core; @Component({selector: app-root,template: `<!--<app-for></app-for>--><div app-for>dasfsada</div>`,

SNS编年史

准备起草。转载于:https://www.cnblogs.com/cmleung/archive/2009/11/26/1611546.html

Angular自学笔记(?)结构型指令

内置指令的展开写法 ngIf import {Component } from @angular/core; @Component({selector: app-root,template: `<button (click)="show = !show">toggle</button><p *ngIf="show as aa">一段文字 {{ aa }}</p><ng-template…

SQL on and 和 on where 的区别

on and 和 on where 的 区别 在使用 left join 时, on and 和 on where 会有区别&#xff1b;1. on的条件是在连接生成临时表时使用的条件,以左表为基准 ,不管on中的条件真否,都会返回左表中的记录  on 后面 and 都是对右表进行筛选 2.where是全部连接完后&#xff0c;对临时…

:host :host-context ::ng-deep详解

:host 与 ::ng-deep :host 表示选择当前的组件。 ::ng-deep 可以忽略中间className的嵌套层级关系。直接找到你要修改的className。 在使用一些第三方的组件的时候&#xff0c;要修改组件的样式。 这种情况下使用: :host ::ng-deep .className{新的样式...... } :host {backg…

Java生鲜电商平台-缓存架构实战

Java生鲜电商平台-缓存架构实战 说明&#xff1a;在Java生鲜电商中&#xff0c;缓存起到了非常重要的作用&#xff0c;目前整个项目中才用的是redis做分布式缓存. 缓存集群 缓存集群存在的问题 1.热key 缓存集群中的某个key瞬间被数万甚至十万的并发请求打爆。 2.大value 某个k…

Java生鲜电商平台-深入理解微服务SpringCloud各个组件的关联与架构

Java生鲜电商平台-深入理解微服务SpringCloud各个组件的关联与架构 概述 毫无疑问&#xff0c;Spring Cloud是目前微服务架构领域的翘楚&#xff0c;无数的书籍博客都在讲解这个技术。不过大多数讲解还停留在对Spring Cloud功能使用的层面&#xff0c;其底层的很多原理&#xf…

Angular自学笔记(?)DI提供者

类提供者 类提供者的创建和使用 假设有logger类: import {Injectable } from @angular/core;@Injectable() export class LoggerService {logs: string[] = [

Angular自学笔记(?)生命周期

从实例化组件,渲染组件模板时,各声明周期就已开始 ngOnChanges 输入属性发生变化是触发,但组件内部改变输入属性是不会触发的 import {Component, Input, OnInit, OnChanges } from @angular/core;@Component({selector: app-life-cycle,templateUrl:

[转载]httpClient.execute抛Connection to refused异常问题

在4.0之后android采用了严格模式&#xff1a;所以在你得activity创建的时候&#xff0c;在super.onCreate(savedInstanceState);后面加上这个 StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() .detectDiskReads() .detectDiskWrites(…

Angular自学笔记(?)依赖注入

什么是依赖注入 依赖注入(DI)是一种设计模式, 也有相应的框架,比如InversifyJS Angular 有自己的 DI 框架, DI 框架会在实例化该类时向其提供这个类所声明的依赖项 带修饰符的参数 在ts中,一个类的参数如果带上修饰符,那个参数就变成了类的实例属性 class Mobile {co…