MySQL 主从复制

概述

MySQL 的高可用主要通过主从复制来实现,同时在主从复制的基础上可以构建一个 MySQL 集群,来实现 MySQL 的读写分离,以实现 MySQL 的高并发操作

MySQL 主从复制主要解决的问题:

  1. 数据热备:可以实时将主库的数据通过复制的方式备份到另外一个从库中,如果主库发生意外,数据丢失,则可以使用从库的数据提供服务
  2. 读写分离:对于更新频繁的表,由于 MySQL 更新数据时需要锁表,所以当有其他更新语句或者数据读取语句到来时就需要等待锁,性能低下。这时可以将写操作都在主库上执行,数据的查询操作在从库上执行,降低主库压力
  3. 负载均衡:可以将数据以副本的形式复制到其他多个数据库上,将数据查询请求负载均衡到其他多个数据库上,避免单库数据过多,压力过大
  4. 高可用:可以以双主复制的方式实现数据相互备份,在一个数据库发生故障后可立即切换到另一个数据库上

复制类型

  • STATEMENT:把主数据库执行的 sql 复制到从数据库,是默认类型
  • ROW:直接把数据行复制过去
  • MIXED:默认复制 sql 语句,如果发现无法精确复制,就会复制行数据

工作过程

  1. 主库数据更新,写入二进制日志文件
  2. 从库监听到主库的二进制日志文件发生改变,开启 I/O 线程向主库请求二进制日志记录;
  3. 主库为每个 I/O 线程开启 dump 线程,向从库发送二进制日志记录
  4. 从库的 I/O 线程将主库的二进制日志记录保存到本地的中继日志
  5. 从库启动 SQL 线程从中继日志读取二进制日志记录,在本地重新执行,使数据和主库保持一致
  6. I/O 线程和 SQL 线程进入睡眠状态,等待下一次被唤醒

同步类型

  1. 异步复制:主库执行完事务,立即将结果返回客户端,并不关心从库是否已经接收并处理。此时如果主库挂掉,而从库又未完成同步,会导致数据不一致,MySQL 默认采用此类型
  2. 全同步复制:主库执行完事务,所有的从库也都执行了该事务,完成数据同步,才将结果返回客户端,性能会收到一定影响
  3. 半同步复制:在异步复制的基础上,确保主库返回结果前,至少有一个从库已经收到该事务并记录到中继日志,但并不保证执行

主从复制的模式

一主一从模式:一个主库对应一个从库,主库的数据实时同步到从库。一般线上都以一主一从模式为主,客户端的读写都在主库上,从库用于数据备份。有时为了减小主库的压力,可以将部分对数据实时性要求不高的读操作在从库上执行。当主库出现故障时,需要手动将从库切换为主库对外提供服务

双主模式:两个库都是主库,这两个主库日志互备。假设两个库分别为 A 和 B,则在 A 库上变更的数据会实时同步到 B 库,在 B 库上变更的数据也会实时同步到 A 库,两个库对外提供的读写能力和数据的一致性都是对等的。在任何一个库发生故障后,另一个库仍然能继续为客户端提供读写服务

一主多从:一个主库,多个从库,通常通过多个从库来缓解高并发查询的压力

多主一从:一个备库从多个主库上同步数据,一般用于将多个节点的数据进行汇总分析

级联复制:主库先将数据同步到一个从库,再将该从库的数据同步到其他多个从库。它的好处是如果有很多从库从主库同步数据,则会增加主库的压力,可能会影响数据插入效率。可以先将主库的数据同步到一个从库,再通过该从库将数据进行多副本备份,降低主库的压力,同时某个从库的数据同步出错也不会影响整个集群的使用

MySQL 双主模式的循环复制问题指的是 A 库上执行更新,会同步到 B 库,B 库在同步完成后,也会同步给 A 库,这时会造成循环复制。MySQL 通过 server-id 解决循环复制问题:

  1. 业务逻辑在 A 库执行更新,会生成带有 A 库的 server-id 的 binary-log
  2. B 库在接收到 A 库发过来的 binary-log 并执行完成后,也会生成带有 A 库的 server-id 的 binary-log
  3. A 库在接收到 binary-log 后,如果发现 server-id 是自己的则丢掉,此次的数据变更同步完成
相关推荐
瓜牛_gn24 分钟前
mysql特性
数据库·mysql
奶糖趣多多1 小时前
Redis知识点
数据库·redis·缓存
CoderIsArt2 小时前
Redis的三种模式:主从模式,哨兵与集群模式
数据库·redis·缓存
师太,答应老衲吧4 小时前
SQL实战训练之,力扣:2020. 无流量的帐户数(递归)
数据库·sql·leetcode
Yaml45 小时前
Spring Boot 与 Vue 共筑二手书籍交易卓越平台
java·spring boot·后端·mysql·spring·vue·二手书籍
Channing Lewis5 小时前
salesforce case可以新建一个roll up 字段,统计出这个case下的email数量吗
数据库·salesforce
追风林6 小时前
mac 本地docker-mysql主从复制部署
mysql·macos·docker
毕业设计制作和分享7 小时前
ssm《数据库系统原理》课程平台的设计与实现+vue
前端·数据库·vue.js·oracle·mybatis
ketil277 小时前
Redis - String 字符串
数据库·redis·缓存
Hsu_kk8 小时前
MySQL 批量删除海量数据的几种方法
数据库·mysql