MySQL主从复制

Java知识点总结:想看的可以从这里进入

2.8、MySQL主从复制

2.8.1、简介

MySQL复制:为保证主服务器和从服务器的数据一致性,在向主服务器插入数据后,从服务器会自动将主服务器中修改的数据同步过来。

主从复制的原理:将数据库中DDL和DML操作通过二进制日志(BINLOG)传输到从数据库上,然后将这些日志重新执行,从而使从数据库和主数据库的数据保持一致。

主从复制的作用:

  • 当主数据库出现问题时,可以随时切换一个从数据库成为新的主数据库

  • 在数据库层面进行读写分离

    • 主服务器负责写,从服务器负责读,缓解了锁的竞争
    • 从服务器可以使用MyISAM,提升查询性能及节约系统开销
    • 增加冗余,提高可用性
  • 在从数据库上进行日常的备份

  • 进行升级测试时,数据可以恢复

2.8.2、主从的形式
  1. 一主一从

    image-20220806112831304
  2. 一主多从

    image-20220806112854478
  3. 多主一从:可以将多个mysql数据库备份到一台存储性能比较好的服务器上

    image-20220806112925364
  4. 双主复制:每个master既是master,又是另外一台服务器的slave,任何一方所做的变更,都会通过复制应用到另外一方的数据库中。

    image-20220806113010102
  5. 级联复制:部分slave的数据同步不连接主节点,而是连接从节点。因为如果主节点有太多的从节点,就会损耗一部分性能用于replication,那么我们可以让3~5个从节点连接主节点,其它从节点作为二级或者三级与从节点连接,这样不仅可以缓解主节点的压力,并且对数据一致性没有负面影响

    image-20220806112806887
2.8.3、MySQL的主从

MySQL实现主从复制主要是有三个线程:binlog线程(主节点),I/O线程(从节点),SQL线程(从节点)。默认是异步的模式。

  • binlog线程:负责将主服务器上的数据更改写入到二进制日志(Binary log)中。
  • I/O线程:负责从主服务器上读取二进制日志(Binary log),并写入从服务器的中继日志(Relay log)中。
  • SQL线程:负责读取中继日志,解析出主服务器中已经执行的数据更改并在从服务器中重放
image-20220806110425104
  1. 主节点为每一个从节点都启动一个binlog dump线程。主节点在每个事务更新数据完成之前,会将将操作记录写入到binlog中,保存在日志文件(bin log file)。
  2. 从节点每隔一段时就对主节日志文件进行探测,如果探测到发生改变,则发送I/O请求,请求从指定日志文件(bin log file)的指定位置(bin log position)之后的日志内容。
  3. 当主节点收到I/O请求后,读取指定文件的指定位置之后的日志信息,返回给从节点(包括本次返回的信息的 bin-log file 以及 bin-log position)。
  4. 从节点通过I/O线程接收到binlog内容后,将日志内容写入到中继日志(Relay log)中,并将读取到的 bin log file(文件名)和position(位置)保存到 master-info 文件中,方便下一次的获取。
  5. 从节点的SQL线程读取中继日志,解析 relay-log 的内容,并在本数据库中执行。
2.8.3、复制模式

mysql默认的复制是异步的,为了解决数据丢失的问题,引入了半同步复制机制,同时为了解决主库写压力大,从库复制可能出现延迟的问题,可以开启多线程并行复制。mysql的一主一从、一主多从、双主都是一个复制源,而mysql5.7开始支持多源复制,允许多个主库同时对一个从库进行复制。

  1. 异步复制:主库在将事件写入binlog后即成功返回客户端,但并不知道从库是否以及何时会获取和处理日志,这样不会影响效率,但如果Binlog 还没有同步到从库的时候,主库宕机了,这时候从从库中选择一个作为新主,那么新主会缺少原来主服务器中刚刚改写的数据,导致数据不一致。所以,这种复制模式下的数据一致性是最弱的。

  2. 半同步复制:MySQL5.5 版本之后开始支持半同步复制的方式。主库在提交后执行事务提交的线程将一直等待,直到至少有一个半同步从库确认已接收到所有事件,从库在将事件写入其中继日志(relay log)并刷新到磁盘后,才会对接收到事务的事件进行确认,主库收到确认后才会对客户端进行响应。相比于异步复制来说,提高了数据的一致性,但是增加了一个网络连接的延迟,降低了主库写的效率。(当主库等待超时后,会还原为默认的异步复制)。

    MySQL5.7 提供rpl_semi_sync_master_wait_for_slave_count参数,让我们自己对应答从库设置,默认为 1,只要有 1 个从库进行了响应,就可以返回给客户端。参数越大,数据一致性越高,但主库等待从库响应的时间也会增加。

  3. 并行复制(组复制,简称 MGR(MySQL Group Replication)):MySQL 5.7 中引入基于组提交的并行复制,是基于 Paxos 协议的状态机复制。

    将多个节点共同组成一个复制组,在执行读写(RW)事务的时候,需要经过组里大多数节点的同意(数量大于N/2+1)后,可以进行提交。而针对只读(RO)事务则不需要经过组内同意,直接 提交 即可。

    在一个复制组内有多个节点组成,它们各自维护了自己的数据副本,并且在一致性协议层实现了原子消息和全局有序消息,从而保证组内数据的一致性。

    其核心思想:一个组提交的事务都是可以并行回放,因为这些事务都已进入到事务的 准备 阶段,则说明事务之间没有任何冲突。判断事务是否处于一个组是通过 last_committed 变量(表示事务提交的时候,上次事务提交的编号),如果事务具有相同的 last_committed,则表示这些事务都在一组内,可以进行并行的回放。

  4. 多源复制:多主一从的复制方式,5.7版本开始支持,在此前只能实现一主一从、一主多从或者多主多从的复制(多源复制至少需要两个Master和一个Slave)。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

辰 羽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值