MySQL 主从复制原理

引言

MySQL 主从复制原理是相当基础的知识,很久没有接触过 MySQL 主从复制了,因为我这边负责的业务暂时没用使用 MySQL 主从复制。
既然有些忘记了,现在我重新复习记录下。

 

MySQL 主从复制介绍


 MySQL 的主从复制是一个异步的复制过程(但一般情况下感觉是实时同步的),
数据库数据从一个 MySQL 数据库(我们称之为 Master)复制到另一个 MySQL 数据库(我们称之为 Slave)。
在 Master 与 Slave 之间实现整个主从复制的过程是由三个线程参与完成的。
其中有两个线程(SQL 线程和 IO 线程)在 Slave 端,另外一个线程(IO 线程)在 Master 端。(来自 MySQL 帮助文档)
 

 

 

MySQL Replication 复制过程


  1. Slave 服务器上执行start slave,开启主从复制开关。
  2. 此时,Slave 服务器上的 IO 线程会通过 Master 服务器上授权的有复制权限的用户请求连接 Master 服务器,
    并请求从指定 binlog 日志文件的指定位置之后发送 binlog 日志内容。
    (日志文件名和位置就是在配置主从复制任务时执行change master命令时指定的)
  3. Master 服务器接收到来自 Slave 服务器的 IO 线程的请求后,
    Master 服务器上的 IO 线程根据 Slave 服务器的 IO 线程请求的信息,
    读取指定 binlog 日志文件指定位置之后的 binlog 日志信息,然后返回给 Slave 端的 IO 线程。
    返回的信息中除了 binlog 日志内容外,
    还有本次返回日志内容后在 Master 服务器端的新的 binlog 文件名以及在 binlog 中的下一个指定更新位置。
  4. 当 Slave 服务器的 IO 线程获取来自 Master 服务器上 IO 线程发送的日志内容及日志文件和位置点后,
    将 binlog 日志内容依次写入到 Slave 端自身的 relay log(即中继日志)文件(mysql-relay-bin.xxxxxx)的最末端,
    并将新的 binlog 文件名和位置记录到 master-info 文件中,
    以便下一次读取 Master 端新 binlog 日志时,
    能告诉 Master 服务器需要从新 binlog 日志的哪个文件哪个位置开始请求新的 binlog 日志内容。
  5. Slave 服务器端的 SQL 线程会实时检测本地 relay log 中新增加的日志内容,
    然后及时的把 relay log 文件中的内容解析成在 Master 端曾经执行的 SQL 语句的内容,
    并在自身 Slave 服务器上按语句的顺序执行应用这些 SQL 语句,应用完毕后清理应用过的日志。
  6. 经过了上面的过程,就可以确保在 Master 端和 Slave 端执行了同样的 SQL 语句。
    当复制状态正常的情况下,Master 端和 Slave 端的数据是完全一样的。

 

 

 

 

用途及条件


mysql主从复制用途

  • 实时灾备,用于故障切换
  • 读写分离,提供查询服务
  • 备份,避免影响业务

主从部署必要条件:

  • 主库开启binlog日志(设置log-bin参数)
  • 主从server-id不同
  • 从库服务器能连通主库

 

 

总结


主从形式

  • 一主一从
  • 一主多从--扩展系统读取性能
  • 多主一从--5.7开始支持
  • 主主复制
  • 联级复制
  • 用途:实时灾备的故障切换,读写分离,备份
  • 原理
    • 主:log dump线程传binlog;
      • i/o线程接受读取binlog,并写入relay log文件
      • sql线程从relay log 文件中读取binlog并持久化
  • 问题及解决
    • 主库宕机后,数据丢失
      • 半同步复制
    • 主库写压力大,因从库只有一个sql 线程来持久化,复制可能延迟
      • 并行复制
  • 半同步复制:
    • 原理
      • 事务在主库写完binlog后需要从库返回一个已接受,才放回给客户端;
    • 5.5集成到mysql,以插件的形式存在,需要单独安装
    • 确保事务提交后binlog至少传输到一个从库
    • 不保证从库应用完成这个事务的binlog
    • 性能有一定的降低
    • 网络异常或从库宕机,卡主库,直到超时或从库恢复
  • 并行复制
    • 原理:从库多线程apply binlog
    • 在社区5.6中新增
    • 库级别并行应用binlog,同一个库数据更改还是串行的
    • 5.7版本并行复制基于事务组
  • 部分数据复制
  • 联级复制(常用)
    • A->B->C
    • B中添加参数log_slave_updates
    • B将把A的binlog记录到自己的binlog日志中
  • 复制的监控
    • show slave status
  • 复制出错处理
    • 常见:1062(主键冲突),1032(记录不存在)
    • 解决:
      • 手动处理
      • 跳过复制错误:set global sql_slave_skip_counter=1
  • mysql主从复制是mysql高可用性,高性能(负载均衡)的基础
  • 简单,灵活,部署方式多样,可以根据不同业务场景部署不同复制结构
  • 复制过程中应该时刻监控复制状态,复制出错或延时可能给系统造成影响
  • mysql主从复制目前也存在一些问题,可以根据需要部署复制增强功能

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值