标签分类 技术文章:
当前位置:首页 > Mysql技术文章 > MySQL增强版Semisync Replication性能优化

MySQL 5.7增强版Semisync Replication性能优化知识点总结

  • 发布时间:
  • 作者:码农之家原创
  • 点击:196

这篇文章主要知识点是关于MySQL、5.7、增强、Semisync、Replication、性能优化、MySQL Semisynchronous Replication介绍 的内容,如果大家想对相关知识点有系统深入的学习,可以参阅以下电子书

MySQL技术内幕:InnoDB存储引擎
  • 类型:MySQL大小:39.3 MB格式:PDF出版:机械工业出版社作者:姜承尧
立即下载

更多Mysql相关的学习资源可以参阅 Mysql电子书程序设计电子书 等栏目。

MySQL增强版Semisync Replication性能优化

一 前言

前文 介绍了5.5/5.6 版本的MySQL semi sync 基础原理和配置,随着MySQL 5.7 的发布,新版本的MySQL修复了semi sync 的一些bug 并且增强了功能。

支持发送binlog和接受ack的异步化;
支持在事务commit前等待ACK;
在server层判断备库是否要求半同步以减少Plugin锁冲突;
解除binlog dump线程和lock_log的冲突等等。

本文重点分析 第1,2个改进项,因为原来的模式的确会影响系统的tps,新的异步模式可以提高半同步模式下的系统事务处理能力。

二 优化

1、支持发送binlog和接受ack的异步化

通过前面的介绍,我们知道Semisynchronous Replication模式下,app在主库上提交一个事务/event,MySQL将每个事务写入binary并且同步到到slave ,master会等待至少一个slave通知:slave 已经接收到传过来的events并写入relay log,才返回给回话层 写入成功,或者直到传送日志发生超时,系统自动将为异步复制模式。

整体流程的逻辑图

MySQL 5.7增强版Semisync Replication性能优化

5.5 版本semi sync 设计的缺点:

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

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

MySQL 5.7增强版Semisync Replication性能优化

大体的实现思路是:

备库IO线程使用TCP协议和主库交互,读写socket可以同时进行,在开启主库semisync时,启动一个后台线程,使用select监听备库连接socket;
dump线程不再等待备库ACK;在ack reciver线程等待ACK时,dump线程还能继续发送下一组group commit的binlog,进而提升TPS.

2 支持在事务commit前等待ACK;

   新版本的semi sync 增加了rpl_semi_sync_master_wait_point参数 来控制半同步模式下 主库在返回给会话事务成功之前提交事务的方式。

该参数有两个值:

AFTER_SYNC (默认值):master 将每个事务写入binlog ,传递到slave,并且刷新到磁盘。master等待slave 反馈接收到事务并刷新到磁盘。一旦接到slave反馈,master在主库提交事务并且返回结果给会话。 在AFTER_SYNC模式下,所有的客户端在同一时刻查看已经提交的数据。假如发生主库crash,所有在主库上已经提交的事务已经同步到slave并记录到relay log。此时切换到从库,可以保障最小的数据损失。

AFTER_COMMIT: master 将每个事务写入binlog ,传递到slave 刷新到磁盘(relay log),然后在主库提交事务。master在提交事务后等待slave 反馈接收到事务并刷新到磁盘。一旦接到slave反馈,master将结果反馈给客户端。
在AFTER_COMMIT模式下,如果slave 没有应用日志,此时master crash,系统failover到slave,app将发现数据出现不一致,在master提交而slave 没有应用。

MySQL Semisynchronous Replication介绍

前言

    MySQL 5.5版本之前默认的复制是异步(Asynchronous )模式的, MySQL 5.5 以plugins的方式提供了Semisynchronous Replication 模式。在介绍 semi sync 之前,我们先了解:半同步 Asynchronous 和 同步 Synchronous 。

异步复制模式

    主库将已经提交的事务event 写入binlog后,即返回成功给app,该模式下并不保证任何已经提交的事务会传递到任何slave并被成功应用。

全同步复制模式。

    当主库提交一个事务 event,主库会等待该事务被传递到所有的slave上,且所有slave applay 该事务/event 通知主库之后,才会返回回话,事务已经成功。

   从定义中可以看出 异步模式不能保证数据的安全性,因为它不等待主库提交的事务在slave 上落盘,而全同步模式 由于要等待所有的slave 确认已提交事务成功被应用,如此则会带来事务处理上的延时。semi sync 则取了一个比较折中的方式,确保已提交的事务必须存在于至少两个机器(主库和任一备库),立即返回给客户端 事务成功。

一、Semisynchronous Replication 定义
 Semisynchronous Replication模式下,在主库上提交一个事务/event,它会等待至少一个slave通知主库,slave 已经接收到传递过来的events并写入relay log,才返回给回话层 写入成功,或者直到传送日志发生超时。

MySQL Semisynchronous Replication介绍

 二、优缺点

   优点:当事务返回成功给客户端时,则事务至少在两台机器上存在,增强数据安全性。相比异步模式和全同步模式,是一种折中。
    缺点:半同步的确会对数据库性能有一定影响,因为事务的提交必须等待slave 反馈。性能损耗取决于tcp/IP 网络传输时间,也即传输已提交事务和等待slave 反馈已经接收事务的时间。

三、MySQL 半同步的特性

    1 当slave 连接主库时,它会告知主库它是不是semi sync 模式。
    2 如果主库启用了semi sync模式,且至少一个slave 也启用了semi sync模式,一个在主库操作事务的进程在事务提交之后,且至少一个slave 通知主库成功接收所有事务之前,该进程会处于blocks 等待状态或者直到超时发生。
    3 当且仅当传递过来的events 传递到slave,被写入relay log,刷新到磁盘才会通知主库完成。
    4 Semisynchronous replication 必须在主备两端都同时启用,否则任何一个未设置,主备之间的复制模式将转变为异步复制模式。
    5 当所有slave 在(rpl_semi_sync_master_timeout的默认值)时间内未返回给主库成功接收event,主备之间就会变回原来的异步状态。
 其中关于第二点 MySQL 5.7 已经做了优化,由ack Collector (Col) thread 等待备库的成功接收事务的通知,这点后续会做详细介绍--《5.7 Semisync replication 增强》。

四、异常处理

   当备库Crash时,主库会在某次等待超时后,关闭Semi-sync的特性,降级为普通的异步复制,这种情况比较简单。
MySQL的 error.log 会提示:

复制代码 代码如下:
   
140523 22:26:00 [Warning] Timeout waiting for reply of binlog (file: mysql-bin.000002, pos: 465893519), semi-sync up to file , position 0.
140523 22:26:00 [Note] Semi-sync replication switched OFF.

    比较难以处理的情况是:当主机/主库Crash时,可能存在一些事务已经在主库提交,但是还没有来的及传给任何备库,也即这些事务都是没有返回给客户端的,所以发起事务的客户端并不知道这个事务是否已经完成--"墙头事务"。这时,如果客户端不做切换,只是等Crash的主库恢复后,继续在主库进行操作,客户端会发现前面的"墙头事务"都已经完成,可以继续进行后续的业务处理;另一种情况,如果客户端Failover到备库上,客户端会发现前面的“墙头事务”都没有成功,则需要重新做这些事务,然后继续进行后续的业务处理,其实此时主备是不一致的,需要通过主备数据校验来检查哪一个库是正确的,然后进行修复。
五、小结

   总之相比于MySQL 5.5 版本之前的异步复制模式 semi sync 已经有了很大的进步,增强了数据的安全性,以安全换一定的性能损耗还是可以接受的。后续会介绍如何安装和使用semi sync。

以上就是本次给大家分享的关于Mysql的全部知识点内容总结,大家还可以在下方相关文章里找到MySql Date函数用法总结、 Mysql中LAST_INSERT_ID()函数使、 mysql查询当天、本周,本月、 等mysql文章进一步学习,感谢大家的阅读和支持。

上一篇:windows server2014 安装 Mysql Applying Security出错的简单解决方法

下一篇:mysql中数字进行格式化方法总结

展开 +

收起 -

学习笔记
网友NO.418740

mysql 5.7.11 winx64快速安装配置教程

本文为大家分享了mysql 5.7.11安装配置方法,供大家参考,具体内容如下 一、安装总体思路: 在官网下载zip安装包; 解压拷贝到C盘下; 配置环境变量; 修改mysql根目录下配置文件my-default.ini; 初始化mysql,安装mysql,启动mysql服务; 修改root用户密码; 成功安装。 二、具体步骤说明 1.下载安装包。 2.拷贝到C盘: 解压后拷贝文件夹至C盘:C:\Program Files\mysql。建议文件夹名字简单些。 3.配置环境变量: 计算机—右键—高级系统设置—高级—环境变量—修改Path, 将地址栏“C:\Program Files\mysql\bin;”粘贴到最后, 注意: 不同的路径之间用英文的“;”分开,确定,退出。 4.修改mysql根目录下配置文件my-default.ini: 首先,在mysql目录中新建一个data文件夹; 其次,编辑配置文件my-default.ini: 去掉basedir和datadir前面的# basedir添加的是MySQL的解压路径:C:\Program Files\mysql datadir添加的是MySQL的data文件夹路径:C:\Program Files\mysql\data。 最后,保存,关闭。下图是我的my-default.ini内容截图: 5.初始化mysql,安装mysql,启动mysql服务【这一步很重要】: 我的DOS命令运行及结果如下: C:\Program Files\mysql\binmysqld --initialize-insecure --user=mysqlC:\Program Files\mysql\binmysqld install mysql --defaults-file="C:\Program Files\mysql\my-default.ini"Service successfully installed.C:\Program Files\mysql\binnet ……

网友NO.899035

mysql 5.7.10 winx64安装配置方法图文教程(win10)

mysql还是比较好用的一款关系型数据库,今天重装了win10系统,于是想尝试安装解压版的mysql,安装完成之后写来和有需要的小伙伴们一起分享。 工具: win10系统 64bit mysql-5.7.10-winx64.zip 方法/步骤1: 要安装mysql,首先我们得去mysql官网下载我们需要的资源,选择Downloads—Community,这时候就能看到MySQL Community Server,这是今天我们要学习配置的版本。 好了,到这里就能下载mysql-5.7.10-winx64.zip版本的安装包了。上面是32bit的,图片中标记的是64bit的,大家可以根据自己的实际情况选择下载。 经过短短的等待,安装文件下载好了。下面一步就是解压缩,我这里将文件解压到了E盘,放到了文件夹mysql5.7中。 新建一个my.ini文件,然后用记事本打开输入mysql的基本配置: [mysql]; 设置mysql客户端默认字符集default-character-set=utf8[mysqld];设置3306端口port = 3306; 设置mysql的安装目录basedir=E:\mysql5.7; 设置mysql数据库的数据的存放目录datadir=E:\mysql5.7\data; 允许最大连接数max_connections=200; 服务端使用的字符集默认为8比特编码的latin1字符集character-set-server=utf8; 创建新表时将使用的默认存储引擎default-storage-engine=INNODB 以管理员身份打开cmd窗口后,将目录切换到你的解压文件bin目录下。再输入mysqld install回车运行就可以了,注意是mysqld不是mysql。 接下来我们用mysq……

网友NO.117687

mysql5.7创建用户授权删除用户撤销授权

一, 创建用户: 命令: CREATE USER 'username'@'host' IDENTIFIED BY 'password'; 说明:username - 你将创建的用户名, host - 指定该用户在哪个主机上可以登陆,如果是本地用户可用localhost, 如果想让该用户可以从任意远程主机登陆,可以使用通配符%. password - 该用户的登陆密码,密码可以为空,如果为空则该用户可以不需要密码登陆服务器. 例子: CREATE USER 'dog'@'localhost' IDENTIFIED BY 'password'; CREATE USER 'pig'@'192.168.1.100' IDENDIFIED BY 'password'; CREATE USER 'pig'@'192.168.1.%' IDENDIFIED BY 'password'; CREATE USER 'pig'@'%' IDENTIFIED BY 'password'; CREATE USER 'pig'@'%' IDENTIFIED BY ''; CREATE USER 'pig'@'%'; 二,授权: 命令: GRANT privileges ON databasename.tablename TO 'username'@'host' 说明: privileges - 用户的操作权限,如SELECT , INSERT , UPDATE 等(详细列表见该文最后面).如果要授予所的权限则使用ALL.;databasename - 数据库名,tablename-表名,如果要授予该用户对所有数据库和表的相应操作权限则可用*表示, 如*.*. 例子: GRANT SELECT, INSERT ON test.user TO 'pig'@'%'; GRANT ALL ON *.* TO 'pig'@'%'; 注意:用以上命令授权的用户不能给其它用户授权,如果想让该用户可以授权,用以下命令: GRANT privileges ON databasename.tablename TO 'username'@'host' WITH GRANT OPTION; 权限信息用user、db、host、tables_priv和columns_priv表被存储在MySQL数据库中(即在名为mysql的数据库中)。 权限……

网友NO.771868

MySQL5.7.21安装与密码图文配置教程

MySQL5.7.21安装与密码设置教程,具体如下 官方参考手册 1.解压MySQL 5.7.20安装包,如X:\MySQL\mysql-5.7.21-winx64。(是没有data和my.ini的) 2.配置mysql的环境变量,创建MYSQL_HOME,并且在Path添加上%MYSQL_HOME%\bin; 3,配置my.ini. 并把my.ini放到bin目录下(1.如果放在mysql-5.7.21-winx64 目录下,在下面执行net start mysql时可能无法启动MYSQL服务、2.不会自动生成data) [client] default-character-set=utf8 [mysqld]#解压目录 如:D:\MySQL\mysql-5.7.21-winx64 basedir = %MYSQL_HOME% #解压目录 如:D:\MySQL\mysql-5.7.21-winx64\data datadir = %MYSQL_HOME%\data port = 3306 default-character-set=utf8 4. 以管理员身份进入命令行(可在小娜搜索输入cmd找到),并进入X:\MySQL\mysql-5.7.21-winx64\bin目录下输入命令:mysqld --initialize-insecure (生成无密码的root用户) 后,在mysql-5.7.20-winx64 目录下就会出现data文件 5.再输入mysqld --install,如果出现Service successfully installed 说明注册成功了。 注意: 如果此操作报错Install/Remove of the Service Denied!,建议使用管理员身份进入命令提示符 6.启动MySQL服务,命令: net start mysql 7.设置密码 mysqladmin -u root password 密码 8.修改密码方法如下 :接着输入mysql -uroot -p 由于之前登陆过,直接输入刚才设置密码(登录root第一次是免密码的直接回车进入到) MYSQL 接着输入:update mysql.user set authentication_……

<
1
>

Copyright 2018-2019 xz577.com 码农之家

版权责任说明