MySQL主从复制理解

mysql要做到主从复制,其实依靠的是二进制日志,即:假设主服务器叫A,从服务器叫B;主从复制就是B跟着A学,A做什么,B就做什么。那么B怎么同步A的动作呢?现在A有一个日志功能,把自己所做的增删改查的动作全都记录在日志中,B只需要拿到这份日志,照着日志上面的动作施加到自己身上就可以了。这样就实现了主从复制。

为什么要做主从复制?

1、在业务复杂的系统中,有这么一个情景,有一句sql语句需要锁表,导致暂时不能使用读的服务,那么就很影响运行中的业务,使用主从复制,让主库负责写,从库负责读,这样,即使主库出现了锁表的情景,通过读从库也可以保证业务的正常运作。

2、做数据的热备

3、架构的扩展。业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘I/O访问的频率,提高单个机器的I/O性能。

mysql主从复制的原理详细介绍

binlog: binary log,主库中保存更新事件日志的二进制文件。

主从复制的基础是主库记录数据库的所有变更记录到binlog。binlog是数据库中保存配置中过期时间内所有修改数据库结构或内容的一个文件。如果过期时间是10d的话,那么就是最近10d的数据库修改记录。

mysql主从复制是一个异步的复制过程,主库发送更新事件到从库,从库读取更新记录,并执行更新记录,使得从库的内容与主库保持一致。

在主库里,只要有更新事件出现,就会被依次地写入到binlog里面,是之后从库连接到主库时,从主库拉取过来进行复制操作的数据源。

binlog输出线程。每当有从库连接到主库的时候,主库都会创建一个线程然后发送binlog内容到从库。
对于每一个即将发送给从库的sql事件,binlog输出线程会将其锁住。一旦该事件被线程读取完之后,该锁会被释放,即使在该事件完全发送到从库的时候,该锁也会被释放。

在从库里,当复制开始的时候,从库就会创建两个线程进行处理:

从库I/O线程。当START SLAVE语句在从库开始执行之后,从库创建一个I/O线程,该线程连接到主库并请求主库发送binlog里面的更新记录到从库上。
从库I/O线程读取主库的binlog输出线程发送的更新并拷贝这些更新到本地文件,其中包括relay log文件。

从库的SQL线程。从库创建一个SQL线程,这个线程读取从库I/O线程写到relay log的更新事件并执行。

可以知道,对于每一个主从复制的连接,都有三个线程。拥有多个从库的主库为每一个连接到主库的从库创建一个binlog输出线程,每一个从库都有它自己的I/O线程和SQL线程。

从库通过创建两个独立的线程,使得在进行复制时,从库的读和写进行了分离。因此,即使负责执行的线程运行较慢,负责读取更新语句的线程并不会因此变得缓慢。比如说,如果从库有一段时间没运行了,当它在此启动的时候,尽管它的SQL线程执行比较慢,它的I/O线程可以快速地从主库里读取所有的binlog内容。这样一来,即使从库在SQL线程执行完所有读取到的语句前停止运行了,I/O线程也至少完全读取了所有的内容,并将其安全地备份在从库本地的relay log,随时准备在从库下一次启动的时候执行语句。

查看主从复制的状态

当主从复制正在进行中时,如果想查看从库两个线程运行状态,可以通过执行在从库里执行”show slave status\G”语句,以下的字段可以给你想要的信息:

Master_Log_File — 上一个从主库拷贝过来的binlog文件
Read_Master_Log_Pos — 主库的binlog文件被拷贝到从库的relay log中的位置
Relay_Master_Log_File — SQL线程当前处理中的relay log文件
Exec_Master_Log_Pos — 当前binlog文件正在被执行的语句的位置

整个主从复制的流程可以通过以下图示理解:

DB Replication

  • 步骤一:主库db的更新事件(update、insert、delete)被写到binlog
  • 步骤二:从库发起连接,连接到主库
  • 步骤三:此时主库创建一个binlog dump thread,把binlog的内容发送到从库
  • 步骤四:从库启动之后,创建一个I/O线程,读取主库传过来的binlog内容并写入到relay log
  • 步骤五:还会创建一个SQL线程,从relay log里面读取内容,从Exec_Master_Log_Pos位置开始执行读取到的更新事件,将更新内容写入到slave的db
注:上面的解释是解释每一步做了什么,整个mysql主从复制是异步的,不是按照上面的步骤执行的。

mysql实现主从复制

详细介绍参考博客:https://www.cnblogs.com/superfat/p/5267449.html

https://blog.csdn.net/m_nanle_xiaobudiu/article/details/81086243

https://blog.csdn.net/li_lening/article/details/81878163

mysql主从复制用途

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

主从部署必要条件:

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

mysql主从复制存在的问题:

  • 主库宕机后,数据可能丢失
  • 从库只有一个sql Thread,主库写压力大,复制很可能延时

   解决方法:

  • 半同步复制—解决数据丢失的问题
  • 并行复制—-解决从库复制延迟的问题

半同步复制原理

  • 事务在主库写完binlog后需要从库返回一个已接受,才放回给客户端;
  • 5.5集成到mysql,以插件的形式存在,需要单独安装
  • 确保事务提交后binlog至少传输到一个从库
  • 不保证从库应用完成这个事务的binlog
  • 性能有一定的降低
  • 网络异常或从库宕机,卡主库,直到超时或从库恢复

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

mysql并行复制

  • 社区版5.6中新增
  • 并行是指从库多线程apply binlog库级别并行应用binlog,同一个库数据更改还是串行的(5.7版并行复制基于事务组)设置
  • 设置sql线程数为10
set global slave_parallel_workers=10;

与集群的区别

集群是由N台数据库服务器组成,数据的写入和查询是随机到任意一台数据库服务器的,其他数据库服务器会自动同步数据库的操作。

浅析mysql主从复制相关推荐

  1. 基于GTID模式MySQL主从复制

    基于GTID模式MySQL主从复制 GTID复制原理: 基于GTID的复制是MySQL 5.6后新增的复制方式 GTID (global transaction identifier) 即全局事务ID ...

  2. 架构周报| 浅析MySQL JDBC连接配置上的两个误区

    经典案例 \\ 浅析MySQL JDBC连接配置上的两个误区:相信使用MySQL的同学都配置过它的JDBC驱动,多数人会直接从哪里贴一段URL过来,然后稍作修改就上去了,对应的连接池配置也是一样的,很 ...

  3. mysql 主从复制 性能_zabbix监控mysql各项性能,主从复制

    ###################################################### 监控mysql(默认监控模板不能用,再agentd.conf开启自定义key,自己编写脚本 ...

  4. mysql主从复制(master-slave)_mysql主从复制------Master-Slave搭建及注意事项

    前言 关于mysql主从复制的原理实际上是很通俗易懂的,可是,在实际的搭建这个结构的时候,仍是会遇到不一样的状况的.因而下面介绍的是搭建Master-Slave的操做及注意事项,本文不含数据库的调优参 ...

  5. 【MySQL】面试官:如何添加新数据库到MySQL主从复制环境?

    今天,一名读者反馈说:自己出去面试,被面试官一顿虐啊!为什么呢?因为这名读者面试的是某大厂的研发工程师,偏技术型的.所以,在面试过程中,面试官比较偏向于问技术型的问题.不过,技术终归还是要服务于业务的 ...

  6. mysql主从复制 跳过表_mysql主从复制-从库跳过异常日志点

    mysql主从复制-从库跳过异常日志点 来源:互联网 作者:佚名 时间:2015-03-08 08:39 mysql主从复制--从库跳过错误日志点 (本文转载,特此声明) 在MYSQL进行Replic ...

  7. mysql 主从复制

    mysql 主从 1 更改主数据库配置文件 cat > /etc/my.cnf <<EOF [mysqld] server-id=1 log-bin EOF 2 重启mysql /e ...

  8. mysql主从复制监控shell脚本

    ########本脚本应用在生产环境中,是运用mysql主从的基础上######## vi mysqlm-s.sh #!/bin/bash ip=`ifconfig eth0|sed -n 2p|aw ...

  9. mysql主从复制实战

    一,mysql主从复制的原理 mysql支持单向.异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器.mysql复制基于主服务器在二进制日志中跟踪所有对数据库的更改(更新. ...

最新文章

  1. gdb 查找动态库方法
  2. 网络技术 几项技术!
  3. 谷歌、阿里巴巴他们都来了,你呢?
  4. 网络安全之tcp阻截引擎 (一)
  5. mysql进程异常_关于MySQL-Proxy子进程异常退出BUG修复
  6. Mac OS系统修改Hosts文件的方法
  7. linux on power 开源技术的新选择
  8. Regularization:The problem of overfitting过度拟合问题----吴恩达机器学习
  9. 22轴三菱Q系列程序案例点胶机,QJ71C24串口与位移传感器通信案例
  10. 论文笔记--DeepFool: a simple and accurate method to fool deep neural networks
  11. 接口设计需要考虑哪些方面
  12. 人工智能3.0展望---一种让AI产生自我意识的方法
  13. 常用的做外链方法总结
  14. 一个遮罩层怎么遮罩两个图层_遮罩动画是由两个图层组成的,一个是遮罩层,一个是被遮罩层。...
  15. vue生成随机订单号
  16. sem竞价账户怎么提升效果提高转化
  17. 产品经理和项目经理谁才是项目管理界的NO.1?
  18. 零基础如何入门网络安全?2022年专业学习路线看这篇就够了
  19. SAP S/4HANA生产订单的BAdI增强点之Initialize方法
  20. ESP8266 ERROR:cut here for exception decoder

热门文章

  1. java 鸭子类_Java中实现鸭子类型机制
  2. 微信小程序学习之五种页面跳转方法.
  3. InfluxDB数据备份和恢复方法,支持本地和远程备份
  4. 重磅!中国工程院撤销李宁院士称号
  5. webapi鉴权使用token令牌
  6. 南京趋势科技面试-处子面
  7. 【Vue】组件(component)
  8. 对抽象函数求导_抽象函数的求导方法怎么?
  9. 磨金石教育摄影技能干货分享|如何在纪实摄影中体现艺术内涵
  10. [C#]Bencode编码算法/torrent文件解析