当前位置: 首页 > news >正文

分库分表的面试题5

 

1、面试题

 

你们有没有做MySQL读写分离?如何实现mysql的读写分离?MySQL主从复制原理的是啥?如何解决mysql主从同步的延时问题?

 

2、面试官心里分析

 

这个,高并发这个阶段,那肯定是需要做读写分离的,啥意思?因为实际上大部分的互联网公司,一些网站,或者是app,其实都是读多写少。所以针对这个情况,就是写一个主库,但是主库挂多个从库,然后从多个从库来读,那不就可以支撑更高的读并发压力了吗?

 

3、面试题剖析

 

 

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

 

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

 

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

 

 

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

 

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

 

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

 

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

 

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

 

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

1)主从复制的原理

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

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

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

 

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

 

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

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

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

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

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

 

转载于:https://www.cnblogs.com/daiwei1981/p/9416087.html

相关文章:

  • nginx配置.htaccess伪静态
  • pip更改国内源
  • android ndk cmake Invalid Android ABI
  • 基于命令序列的异常行为分析 业界研究现状分析
  • Python标准库(待续)
  • Python 爬虫获取网易云音乐歌手信息
  • WPF查找父元素子元素
  • 如何用vue打造一个移动端音乐播放器
  • VBoot1.0发布,Vue SpringBoot 综合开发入门
  • Taglist: Exuberant ctags (http://ctags.sf.net) not found in PATH. Plugin is not loaded.
  • String 转 Json 记录[abc,bcd] json 解析
  • 学习笔记之流文件操作01(拷贝文件)
  • CentOS 7----Apache基于域名的虚拟主机配置
  • Unity 之 Pure版Entity Component System (ECS)  官方Rotation示例解析
  • 读《Design Patterns by Tutorials》笔记——MVC
  • canvas绘制圆角头像
  • ES6简单总结(搭配简单的讲解和小案例)
  • Java,console输出实时的转向GUI textbox
  • Java|序列化异常StreamCorruptedException的解决方法
  • Java小白进阶笔记(3)-初级面向对象
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • Promise面试题2实现异步串行执行
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • uni-app项目数字滚动
  • Vue2 SSR 的优化之旅
  • Vue实战(四)登录/注册页的实现
  • 入门级的git使用指北
  • 设计模式(12)迭代器模式(讲解+应用)
  • 我从编程教室毕业
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • ​TypeScript都不会用,也敢说会前端?
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • (09)Hive——CTE 公共表达式
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (day6) 319. 灯泡开关
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (附源码)spring boot火车票售卖系统 毕业设计 211004
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (十一)手动添加用户和文件的特殊权限
  • (四) Graphivz 颜色选择
  • (学习日记)2024.02.29:UCOSIII第二节
  • (转)Google的Objective-C编码规范
  • (转)关于如何学好游戏3D引擎编程的一些经验
  • .net Application的目录
  • .net CHARTING图表控件下载地址
  • .net core 实现redis分片_基于 Redis 的分布式任务调度框架 earth-frost
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
  • .NET/MSBuild 中的发布路径在哪里呢?如何在扩展编译的时候修改发布路径中的文件呢?
  • .net安装_还在用第三方安装.NET?Win10自带.NET3.5安装
  • .net实现头像缩放截取功能 -----转载自accp教程网
  • .NET与java的MVC模式(2):struts2核心工作流程与原理
  • @NoArgsConstructor和@AllArgsConstructor,@Builder
  • @RequestMapping-占位符映射
  • [Angular] 笔记 20:NgContent