AFTER_COMMIT(5.6默认值)

master将每个事务写入binlog ,传递到slave 刷新到磁盘(relay log),同时主库提交事务。master等待slave 反馈收到relay log,只有收到ACK后master才将commit OK结果反馈给客户端。

AFTER_SYNC(5.7默认值,但5.6中无此模式)

master 将每个事务写入binlog , 传递到slave 刷新到磁盘(relay log)。master等待slave 反馈接收到relay log的ack之后,再提交事务并且返回commit OK结果给客户端。 即使主库crash,所有在主库上已经提交的事务都能保证已经同步到slave的relay log中。

因此5.7引入了after_sync模式,带来的主要收益是解决after_commit导致的master crash主从间数据不一致问题,因此在引入after_sync模式后,所有提交的数据已经都被复制,故障切换时数据一致性将得到提升。

2 性能提升支持发送binlog和接受ack的异步化

旧版本的semi sync 受限于dump thread ,原因是dump thread 承担了两份不同且又十分频繁的任务:传送binlog 给slave ,还需要等待slave反馈信息,而且这两个任务是串行的,dump thread 必须等待 slave 返回之后才会传送下一个 events 事务。dump thread 已然成为整个半同步提高性能的瓶颈。在高并发业务场景下,这样的机制会影响数据库整体的TPS .

图:Without ACK receiving thread

为了解决上述问题,在5.7版本的semi sync 框架中,独立出一个 ack collector thread ,专门用于接收slave 的反馈信息。这样master 上有两个线程独立工作,可以同时发送binlog 到slave ,和接收slave的反馈。

图:With ACK receiving thread3 性能提升控制主库接收slave 写事务成功反馈数量

MySQL 5.7新增了rpl_semi_sync_master_wait_slave_count参数,可以用来控制主库接受多少个slave写事务成功反馈,给高可用架构切换提供了灵活性。

如图所示,当count值为2时,master需等待两个slave的ack

4 性能提升

Binlog 互斥锁改进

旧版本半同步复制在主提交binlog的写会话和dump thread读binlog的操作都会对binlog添加互斥锁,导致binlog文件的读写是串行化的,存在并发度的问题。

MySQL 5.7对binlog lock进行了以下两方面优化

1.移除了dump thread对binlog的互斥锁

2.加入了安全边际保证binlog的读安全

5 性能提升组提交

5.7引入了新的变量slave-parallel-type,其可以配置的值有:

DATABASE (5.7之前默认值),基于库的并行复制方式;LOGICAL_CLOCK (5.7新增值),基于组提交的并行复制方式;

MySQL 5.6版本也支持所谓的并行复制,但是其并行只是基于DATABASE的,也就是基于库的。如果用户的MySQL数据库实例中存在多个DATABASE ,对于从机复制的速度的确可以有比较大的帮助,如果用户实例仅有一个库,那么就无法实现并行回放,甚至性能会比原来的单线程更差。

MySQL5.7中增加了一种新的并行模式:为同时进入COMMIT阶段的事务分配相同的序列号,这些拥有相同序列号的事务在备库是可以并发执行的。

MySQL 5.7真正实现的并行复制,这其中最为主要的原因就是slave服务器的回放与主机是一致的即master服务器上是怎么并行执行的slave上就怎样进行并行回放。不再有库的并行复制限制,对于二进制日志格式也无特殊的要求(基于库的并行复制也没有要求)。

因此下面的序列中可以并发的序列为(其中前面一个数字为last_committed ,后面一个数字为sequence_number ):

trx1 1…..2trx2 1………….3trx3 1…………………….4trx4        2……………………….5trx5               3…………………………..6trx6                     3………………………………7trx7                            6………………………………..8

备库并行规则:当分发一个事务时,其last_committed 序列号比当前正在执行的事务的最小sequence_number要小时,则允许执行。

因此,

a)trx1执行,last_commit<2的可并发,trx2, trx3可继续分发执行

b)trx1执行完成后,last_commit < 3的可以执行, trx4可分发

c)trx2执行完成后,last_commit < 4的可以执行, trx5, trx6可分发

d)trx3、trx4、trx5完成后,last_commit < 7的可以执行,trx7可分发

综上所述

我们认为MySQL 5.7版对Loss-Less半同步复制技术的优化,使得其成熟度和执行效率都得到了质的提高。我们建议在使用MySQL 5.7作为生产环境的部署时,可以使用半同步技术作为高可用与读写分离方案的数据复制方案。

请点击输入图片描述

mysql确认半同步命令_怎么判断mysql是否是半同步复制相关推荐

  1. linux ntp时间立即同步命令_记一次生产环境部署NTP服务及配置时间同步

    概述 linux服务器在提供服务时,要和其他机器进行请求的交互,实际生产环境中,可能因为时间不同步,导致了服务异常. 下面介绍下怎么部署NTP服务来解决这个问题. ps:强烈吐槽下头条这个新排版功能, ...

  2. mysql 数据库安装命令_教你MySQL数据库的编译安装以及命令详解(5.7版本)

    一.安装MySQL所需的环境依赖包 [root@localhost opt]# yum -y install gcc gcc-c++ make ncurses ncurses-devel bison ...

  3. mysql update多个字段_常见的MySQL命令大全fourth

    1:使用SHOW语句找出在服务器上当前存在什么数据库: mysql> SHOW DATABASES; 2:2.创建一个数据库MYSQLDATA mysql> Create DATABASE ...

  4. mysql用help查看帮助_深入理解mysql帮助命令(help)

    在安装.管理和使用mysql过程中,你是不是需要记忆很多的mysql命令.而且对于新手来说,很不多的命令不知道该如何应用,对于老手来说很多命令时间长了忘记具体的用法. 其实mysql的帮助信息,已经给 ...

  5. h命令可以获取mysql客户端的帮助信息_如何获取MySQL帮助信息

    在开发或测试环境在碰到MySQL相关故障时,大多数朋友可能会通过论坛发帖,QQ群讨论方式来获取帮助.该方式是获取帮助的有效途径之一.然而如果在生产环境,在没有网络的环境下,这些方式就无助于问题的解决. ...

  6. mysql禁用历史命令_如何禁止mysql记录历史命令

    如何禁止mysql记录历史命令?在执行 SQL命令时,mysql会将历史命令记录到~/.mysql_history文件中,因此我们用上下键就可以翻阅历史命令了. 也许某些特殊需要我们可能需要不让它记录 ...

  7. mysql面试常用命令_面试之MySQL基本命令

    既然要操作数据库就从数据库链接写起,包括建库.建表.增删该查字段及约束,删库,删表的数据,以下主要是对我以往面试的总结,欢迎补充! 一.数据库连接 1.连接本机(p和密码123456之间无空格) my ...

  8. mysql重启数据库实例命令_各个平台的mysql重启命令

    inux平台及windows平台mysql重启方法 Linux下重启MySQL的正确方法: 1.通过rpm包安装的MySQL service mysqld restart 2.从源码包安装的MySQL ...

  9. mysql创建sql文件命令_创建包含sql命令的sql脚本文件

    sql脚本是包含一到多个sql命令的sql语句,我们可以将这些sql脚本放在一个文本文件中(我们称之为"sql脚本文件"),然后通过相关的命令执行这个sql脚本文件.基本步骤如下: ...

最新文章

  1. 2.5 学习词嵌入-深度学习第五课《序列模型》-Stanford吴恩达教授
  2. MySQL substring-index_mysql函数之SUBSTRING_INDEX(str,/,-1)
  3. linux默认安装数据库密码是多少,Linux服务器上安装MySql数据库(默认安装,密码为空),首次使用需要修改密码(示例代码)...
  4. 做自媒体培训赚的盆满钵满
  5. 组合总和3 leetcode 216
  6. 【linux运维】linux运维常用工具有哪些?
  7. ubuntu hadoop安装教程
  8. MongoDB的安装启动
  9. Excel K4宏病毒专杀
  10. IDEA快捷键设置,选择Eclipse风格的快捷键,自动补全快捷键,关闭当前窗口快捷键Ctrl+W 自动导入设置,引入外
  11. 单片机全局变量 局部变量 堆与栈
  12. stm32h7内存分配_【STM32H7教程】第9章 STM32H7重要知识点数据类型,变量和堆栈...
  13. 【报错】WebSocket connection to ‘ws://xxx.xxx.x.xxxx:8080/ws‘failed:
  14. jzoj P1285 奶酪厂
  15. [NAS] Synology (群晖) DSM 7.X 挂载NTFS硬盘
  16. 自己家里的电脑架设传奇外网教程
  17. 李沐动手学深度学习笔记---含并行连结的网络 GoogLeNet / Inception V3
  18. ppt怎么压缩文件大小?学会这几种方法
  19. 换了个地方,来北京工作,面试了4家python爬虫,写一些这四家(记得的)笔试题(2)
  20. Android多图加载成动画

热门文章

  1. matlab机械手ikine函数,关于Mtalab-robotics工具箱中的fkine和ikine两个函数的问题讨论!...
  2. java socket 阻塞模式_(四) 如何将socket设置为非阻塞模式
  3. 遍历children_589. N叉树的前序遍历
  4. python logging模块 默认_python logging模块
  5. PWA将带来新一轮大前端技术洗牌?
  6. JAVA 取得当前目录的路径/Servlet/class/文件路径/web路径/url地址
  7. Android的面孔_Actiyity
  8. 【WebSocket初探 】
  9. 马老师 生产环境mysql主从复制、架构优化方案
  10. 《算法导论》读书笔记之第1章 算法在计算机中的作用