一、binlog 的基础知识

1,binlog 的概念

Server 层的日志系统(归档日志),binlog 中跟踪对其数据库的所有更改操作。是逻辑日志,以追加日志的形式记录。

2,binLog 的三种格式

1)statement

记录 SQL 语句的原文。风险点:如果主/从用到的索引不同,操作语句带 limit 时,处理的可能是不同行的记录数据。

2)row

仅记录某条记录的数据修改细节,不关系上下文。缺点:占用空间,同时写 binlog 很耗费 I/O 资源,影响执行速度。

3)mixed

一般语句使用 statement 格式保存,如果使用了一些函数,statement 格式无法完成主从复制的操作,采用 row 格式。MySQL 自己会判断这条 SQL 语句是否可能引起主备不一致,如果有可能就用 row 格式,否则就用 statement 格式。

二、主从同步的基础流程

  • 1、主库接收到更新命令,执行更新操作,生成 binlog
  • 2、从库在主从之间建立长连接
  • 3、主库 dump_thread 从本地读取 binlog 传送刚给从库
  • 4、从库从主库获取到 binlog 后存储到本地,成为 relay log(中继日志)
  • 5、sql_thread 线程读取 relay log 解析、执行命令更新数据

每个主/从连接都有三个线程,具有多个从库的主库会为每个连接创建一个 dump thread,每个从库都有自己的 I/O thread 和 sql thread。从库使用两个线程将读取主库 binlog 日志和执行更新操作分离开,通过 relay log 机制,使 binlog 的读取和执行互不影响。如果从库某段时间没有运行,重启后从库可以快速读取主库的 binlog 日志;如果从库在 sql thread 执行完 binlog 日志前停止,在重启后也可以在本地的 relay log 中读取到命令继续执行。

  • dump thread:在从库与主库创建连接后,主库创建 dump thread 日志将 binlog 发送到从库,如果该线程追上了主控,它将进入休眠状态知道主库发送信号通知其有新的事件产生时才会被唤醒
  • I/O thread:在从库执行 start slave 语句时,创建 I/O thread,该线程连接到主库,将 binlog 日志记录到中继日志
  • sql thread:读取 relay log 执行命令实现从库数据的更新

三、主从延迟问题

1,什么是主从延迟

主从延迟指的是同一个事务在从库执行完成的时间和主库执行完成的时间直接的差值。

延迟时间 = 主库执行完事务写入 binlog 的时刻 - 从库执行完事务的时刻

2,主从延迟的来源

1)在一些部署条件下,备库所在机器的性能比主库的机器差

2)备库读压力大

3)大事务场景

4)从库的并行复制能力

3,从库并行复制策略

核心思想:

由 sql_thread 作为分配者(coordinator)的角色,负责读取中转日志(relay log)和分发事务,由 worker 线程来执行命令更新数据。

原则:

  • 不能造成更新覆盖,要求更新同一行的两个事务必须分发到同一个 worker 中
  • 同一个事务不能被拆开,必须放到同一个 worker 中

现有的一些并行复制策略:

1)5.6 按库并行复制

coordinator 将 relay log 按照 DB 的维度分发给不同的 worker。

  • 优点:构造映射关系快,只需要库名;不要求 binlog 格式
  • 缺点:如果主库上只有一个 DB,那这个策略就没有效果了,或者存在热点 DB,也起不到并行的效果

2)MariaDB 组提交优化

组提交(group commit)主要有以下特性:

  • 一组提交的事务有一个相同的 commit_id 直接写到 bin log 里;能够在同一组里提交的事务一定不会修改同一行;主库上可以并行执行的事务备库上也一定可以并行执行。MariaDB 利用组提交的特性对并行复制进行优化,将相同 commit_id 的事务分发到多个 worker 执行,一组全部执行完毕后再执行下一批。
  • 缺点:在从库上执行时,要等一组事务执行完成后再开始执行下一批事务,这样系统的吞吐量就不够,此外,如果出现大事务,那么这段时间就只用一个 worker 线程在工作,造成资源的浪费。

3)5.7.22 增加 binlog-transaction-dependency-tracking 参数控制并行复制策略

commit_order ,根据同时进入 prepare 和 commit 来判断是否可以并行的策略。

原则:

  • 同时出入 prepare 状态的事务在从库执行时是可以并行的;
  • 处于 prepare 状态的事务与处于 commit 状态的事务之间在备库执行时也是可以并行的。

可以通过 binlog_group_commit_sync_delay 和 bin_log_group_commit_sync_no_delay_count 拉长 binlog write 和 fsync 之间的时间,制造更多同时处于 prepare 阶段的事务。

writeset,对于事务涉及更新的每一行计算出这行的 hash 值组成集合 writeset,如果两个事务没有操作相同的行,也就是说它们的 writeset 没有交集,就可以并行。

wrtieset_session,是在 writeset 的基础上多了个约束,在主库上同一个线程先后执行的两个事务,在备库执行的时候要保证先后顺序。

四、延伸

1,从库连接到主库请求 binlog 日志

从库主动从主库请求 binlog 的副本,而不是主库主动将数据推送到从库。也就是说每个从库都是独立独立地与主库进行连接,每个从库只能通过向主库请求来接收 binlog 的副本,因此从库能够以自己的速度读取和更新数据库的副本,并且可以随意启动和停止赋值过程,而不会影响到主库或者其他从库的状态。

2,relay log(中继日志)

中继日志与 binlog 相同,由一组包含描述数据库更改的文件和一个包含所有已使用的中继日志文件名称的索引文件组成。在5.6以前,日志是存在 relay log.info 文件中的,在5.6以后可以使用 --relay log info repository=table 启动 slave,将此日志写入 mysql.slave_relay_log_info 表,而不是文件。

3,复制通道概念

MySQL5.7.6 引入了复制通道的概念,表示事务从主库流到从库的路径。MySQL 服务器会在启动时自动创建一个默认通道,其名称为空字符串(””)。此通道始终存在;用户无法创建或销毁它。如果没有创建其他通道(具有非空名称),则复制语句仅作用于默认通道,以便所有来自旧从属服务器的复制语句都按预期工作。应用于复制通道的语句只能在至少有一个命名通道时使用。

在多源复制中,从库打开多个通道,每个主通道一个,每个通道都有自己的中继日志和 sql thread,一旦复制通道的接收器(I/O 线程)接收到事务,他们将被添加到通道的中继日志文件中并传递到 sql thread,使通道能够独立工作。

4,主库和从库用不同引擎

对于复制过程来说,主库表和从库表是否使用不同的引擎类型并不重要,实际上,在复制过程中不会复制存储引擎系统变量,用户可以针对不同的复制方案为从库设置不同的存储引擎。

粉丝福利,需获取MySQL、分布式、微服务、spring全家桶等最新相关架构资料

关注我+转发此文+私信回复关键词:架构

spring 主从表_听听京东架构师浅谈,MySQL binlog 主从同步相关推荐

  1. 如何从普通程序员成为架构师,资深架构师浅谈进阶之路

    前言 相信,有许多小伙伴已经做了程序员一两年或者三年了,甚至有些已经快五年了,但是还没有迈进架构师这个门,不知道如何成为架构师. 程序员之间的能力差异在哪里?如果是学技术,大家可以阅读同样的书籍和网络 ...

  2. mysql x key 组合_技本功丨浅谈MySQL的七种锁

    作者:宋丹琪(花名:三思)袋鼠云云服务部DBA团队 数据库工程师 时常会有开发的同学突然紧张兮兮地找我, 然后丢给我一个代码层面的 CannotAcquireLockException的报错, 一脸无 ...

  3. pymysq向mysql写数据 为什么本地无法查看_从运维角度浅谈MySQL数据库优化,中小企业DBA必会...

    原文:http://www.enmotech.com/web/detail/1/712/1.html(复制链接,打开浏览器即可查看原文) 作者:搬砖游击队 一个成熟的数据库架构并不是一开始设计就具备高 ...

  4. 三年百度,五年阿里,阿里p8架构师浅谈:我是如何顺利进入BAT

    说来惭愧,也不怕你们笑话.做开发8年多,到目前还是一名不折不扣的扫地僧.年前的辞职,到现在还在家静养中.其实也没什么,就是回家总结一下自己这些年来在外工作与面试等做一个简单的总结与反思.做一下自己后面 ...

  5. sql server的密码采用自带什么密码技术存储_【技术分享】浅谈MYSQL 8.0新特性

    于树文 云技术管理处 01 MySQL 8.0中添加的功能 1. 新的系统字典表 整合了存储有关数据库对象信息的事务数据字典,所有的元数据都用InnoDB引擎进行存储. 2. 支持DDL 原子操作 I ...

  6. Github星标90K?京东架构师一篇讲明白百亿级并发系统架构设计

    学习高并发系统设计的原因 高并发到底是什么,想必各位多多少少对此都有所了解,那我在这就不多说了.真正经历过"双11"以及"618"的小伙伴应该都知道,在大促时如 ...

  7. 支付宝的数据库是MySQL变种_浅谈MySql的储存引擎(表类型)

    浅谈mysql的存储引擎(表类型) 什么是MySql数据库 通常意义上,数据库也就是数据的集合,具体到计算机上数据库可以是存储器上一些文件的集合或者一些内存数据的集合. 我们通常说的MySql数据库, ...

  8. mysql事务的管理方式_浅谈MySQL事务管理(基础)

    本篇文章给大家带来的内容是浅谈MySQL事务管理(基础),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助.事务处理用来维护数据库等完整性,保证mysql操作要么成功,要么失败(myisa ...

  9. 浅谈MySQL表类型

    小小子的文章写的不错哦. 转载:http://www.xiaoxiaozi.com/2009/07/14/1171/ 浅谈MySQL表类型 MySQL为我们提供了很多表类型供选择,有MyISAM.IS ...

最新文章

  1. VS2008 error PRJ0002 : 错误的结果 31 (从“C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\rc.exe”返回)。...
  2. Vivado ILA无法触发,点Stop Trigger提示There are no armed ILAs
  3. [iPhone高级] 基于XMPP的IOS聊天客户端程序(IOS端二)
  4. 情人节——微信朋友圈浓浓爱意的9张拼图(HTML版本)
  5. Quest 公司的Shareplex 与 GoldenGate比较
  6. 第二十八章 springboot + zipkin(brave定制-AsyncHttpClient)
  7. Java多线程之可见性之volatile
  8. ZOJ 4067 Books (2018icpc青岛J) (贪心)
  9. android 自动打开钉钉,安卓定时自动打开钉钉考勤打卡
  10. 红linux系统,红帽linux系统下载(iso)
  11. 计算机编程入门基础知识(计算机组成原理/操作系统/计算机网络)
  12. linux使用TCP聊天室设计详解,基于linux的TCP网络聊天室设计与实现
  13. 英语3500词(15/20)crime主题(2022.1.27)
  14. UOJ#311. 【UNR #2】积劳成疾
  15. linux利用su -从普通用户切换root权限
  16. C#开发微信门户及应用(46)-基于Bootstrap的微信门户应用管理系统功能介绍
  17. 未选择的路*弗罗斯特
  18. 【路由器】TP Link TL-WR702N 迷你路由器为何无法进入管理后台
  19. DB2自定义数据库方言
  20. 避免重复造轮子,Java 程序员必备

热门文章

  1. MOSS 2007 错误0x80040E14解决
  2. 【转】PHP获取当前时间、时间戳的各种格式写法汇总[日期时间]
  3. linux下查看mysql版本的四种方法
  4. net.sz.framework 框架 ORM 消消乐超过亿条数据排行榜分析 天王盖地虎
  5. C语言小案例——万年历制作
  6. JProfiler 简要使用说明
  7. 使用 Time Machine 恢复 .ssh等隐藏文件夹
  8. 请问C#中如何自动生成summary注释
  9. 博客园-vb随笔列表
  10. ListView.setAdapter(adapter);空指针异常的解决的总结