Home
  • 计算机网络
  • 操作系统
  • 数据结构与算法
  • 设计模式
  • JavaSE
  • JVM
  • JUC
  • Netty
  • CPP
  • QT
  • UE
  • Go
  • Gin
  • Gorm
  • HTML
  • CSS
  • JavaScript
  • vue2
  • TypeScript
  • vue3
  • react
  • Spring
  • SpringMVC
  • Mybatis
  • SpringBoot
  • SpringSecurity
  • SpringCloud
  • Mysql
  • Redis
  • 消息中间件
  • RPC
  • 分布式锁
  • 分布式事务
  • 个人博客
  • 弹幕视频平台
  • API网关
  • 售票系统
  • 消息推送平台
  • SaaS短链接系统
  • Linux
  • Docker
  • Git
GitHub (opens new window)
Home
  • 计算机网络
  • 操作系统
  • 数据结构与算法
  • 设计模式
  • JavaSE
  • JVM
  • JUC
  • Netty
  • CPP
  • QT
  • UE
  • Go
  • Gin
  • Gorm
  • HTML
  • CSS
  • JavaScript
  • vue2
  • TypeScript
  • vue3
  • react
  • Spring
  • SpringMVC
  • Mybatis
  • SpringBoot
  • SpringSecurity
  • SpringCloud
  • Mysql
  • Redis
  • 消息中间件
  • RPC
  • 分布式锁
  • 分布式事务
  • 个人博客
  • 弹幕视频平台
  • API网关
  • 售票系统
  • 消息推送平台
  • SaaS短链接系统
  • Linux
  • Docker
  • Git
GitHub (opens new window)
  • SQL编程50题
  • 基础篇
  • 索引篇
  • 事务篇
  • 锁篇
  • 日志篇
  • 高可用篇
    • 主从复制
      • 实现原理
      • 主从复制模型
  • 分库分表
  • 性能优化
  • Mysql
Nreal
2023-11-15
目录

高可用篇

# 主从复制

# 实现原理

依赖于binlog(记录 MySQL 上的所有变化并以二进制形式保存在磁盘上),复制过程就是将 binlog 中的数据从主库传输到从库上;

这个过程一般是异步的,也就是主库上执行事务操作的线程不会等待复制 binlog 的线程同步完成;

具体步骤:

  1. 主库收到客户端提交事务请求后,先写入binlog,再提交事务,更新存储引擎数据,事务提交完成后,返回给客户端成功响应;
  2. 从库创建一个IO线程,连接主库的log dump线程,来接受主库的binlog 日志,再把binlog信息写入relay log的中继日志里,返回主库“复制成功”的响应;
  3. 从库会创建一个用于回放 binlog 的线程,去读 relay log 中继日志,然后回放 binlog 更新存储引擎中的数据,最终实现主从的数据一致性;

# 主从复制模型

  • 同步复制:主库提交事务的线程要等到所有从库的复制成功响应,才返回客户端结果;

  • 异步复制(默认):主库提交事务的线程并不会等待 binlog 同步到各从库,就返回客户端结果。这种模式一旦主库宕机,数据就会发生丢失;

  • 半同步复制:事务线程不用等待所有的从库复制成功响应,只要一部分复制成功响应回来就行,比如一主二从的集群,只要数据成功复制到任意一个从库上,主库的事务线程就可以返回给客户端;

    半同步复制的方式,兼顾了异步复制和同步复制的优点,即使出现主库宕机,至少还有一个从库有最新的数据,不存在数据丢失的风险;

日志篇
分库分表

← 日志篇 分库分表→

Theme by Vdoing | Copyright © 2021-2024
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式