MySQL之不得不说的keepsync和trysync

此文已由作者温正湖授权网易云社区发布。

欢迎访问网易云社区,了解更多网易技术产品运营经验。

开宗明义,keepsync和trysync是网易MySQL分支版本InnoSQL的两个参数,非常重要的两个参数。从某种程度上说,他们决定了MySQL主从复制实例是采用异步复制(async)还是半同步复制(semi-sync)。为什么不得不说呢,因为不断有同学问怎么看当前RDS实例是同步还是异步状态,keepsync和trysync这两个参数是干嘛用的,怎么进行设置?于是简单写下semi-sync和这两个参数关系。

MySQL semi-sync

在MySQL中有个非常著名的semi-sync插件(plugin),或者叫半同步插件。如果将主从复制作为一个系统, 处于半同步下的主从复制系统,即使主库MySQL宕机且无法修复,只要从库MySQL正常, 用户向该系统发送的已经返回commit的请求数据仍然不会丢失,满足事务ACID中的D(Durability)。这是在MySQL传统的异步复制体系下迈出的非常具有里程碑意义的一步,其实在这一点上,InnoSQL一直处于领先的位置。为什么叫半同步复制,而不是同步(全同步)复制,这是因为在semi-sync复制下,主库MySQL上事务记录的Binlog信息,发送给从库MySQL,在从库MySQL的IO Thread将其以Relay-Log形式(本质上还是Binlog,只不过披了一个马甲)持久化后即向主库MySQL返回ACK信息,而不是在SQL Thread(其实已经不是一个Thread了,姑且这么说吧)将该事务对应的Relay-Log在从库MySQL上执行后才返回ACK(这个就是全同步)。semi-sync之所以不丢数据,原因就在于主库只有收到从库ACK信息后,才会给用户/客户端返回事务已提交。显然此时只要从库存放Relay-Log的硬盘不坏,数据是不会丢的。不过最近看来,很不乐观。:)

虽然有这么牛X一个插件,但默认情况下MySQL复制还是异步的。要开启semi-sync,还是简单做几个操作。先要在主从上都安装semi-sync插件(主: INSTALL PLUGIN rpl_semi_sync_master SONAME ‘semisync_master.so‘;从:INSTALL PLUGIN rpl_semi_sync_slave SONAME ‘semisync_slave.so‘;);然后还要设置几个参数(主:rpl_semi_sync_master_enabled=1;从:rpl_semi_sync_slave_enabled=1);当然,要从异步状态切为同步状态,还需要重新start slave。在上述都做了之后,通过Rpl_semi_sync_slave_status 状态值可以查看当前复制是否已经是semi-sync状态(状态为ON)。是不是敲简单。正常的,人一旦理解了一个技术或掌握了一个知识点,就会觉得其实挺简单的。需要注意的是,semi-sync在某些场景下会退化为异步,如果用户不知情,刚好这个时候主库MySQL挂了,那就悲剧了(丢数据了),所以,监控Rpl_semi_sync_slave_status状态挺重要,当然,MySQL还提供了其他几个状态用来观察semi-sync复制状态。那么什么时候会退化为异步呢,就得来说说rpl_semi_sync_master_timeout,超过所设置的微秒数后,主库MySQL退化为异步复制。默认时间为1000,也就是如果主库发送Binlog后,从库1s之内没有返回ACK,主库就切异步了。如果用户不想轻易切异步,就需要设置一个更大的值。但设置大了又会带来了其他问题。

InnoSQL增强

为了更好得掌控实例semi-sync和async状态切换,在InnoSQL中新增了两个参数rpl_semi_sync_master_keepsyncrepl和rpl_semi_sync_master_trysyncrepl。用来更灵活得控制状态切换行为,部分取代rpl_semi_sync_master_timeout的作用,两者的取值均为ON/OFF。当然,这两个参数不是独立起作用的,而是在前面所述的参数基础上发挥作用的。不知不过前面所述的参数变为了必要条件而非充分条件。

也就是说,即使rpl_semi_sync_master_enabled、rpl_semi_sync_slave_enabled均为1,如果rpl_semi_sync_master_trysyncrepl为OFF,复制状态也无法从async切换为semi-sync。处于semi-sync状态,即使rpl_semi_sync_master_timeout微秒内从库未返回ACK信息,如果rpl_semi_sync_master_keepsyncrepl为ON,则复制状态也无法从semi-sync切为async。只有在用户/系统管理员将rpl_semi_sync_master_keepsyncrepl改为OFF后才能切为async。

这里引出一个问题,用户怎么决定要不要切异步,根据什么状态来进行判断呢? 显然,一个事务已经花了多少时间等待ACK这个状态非常关键,但MySQL并没有提供该信息给用户,于是在InnoSQL中加入了事务的ACK等待时间状态,可用通过show processlist获取ACK_WAIT_TIME或information_schema.processlist中的ACK_WAIT_TIME来了解每个事务已花费的等待ACK时间状态。用户可规定一个阈值,通过查询ACK_WAIT_TIME字段,如果有事务超过了阈值,那么就设置rpl_semi_sync_master_keepsyncrepl为OFF切异步。

RDS使用方式

接下来进一步聊下网易云RDS如何使用semi-sync。RDS提供了两种高可用实例,分别是同步实例和异步实例,但不管同步还是异步实例,semi-sync插件均启用,且rpl_semi_sync_master_enabled、rpl_semi_sync_slave_enabled均为ON。区别在于rpl_semi_sync_master_trysyncrepl和rpl_semi_sync_master_keepsyncrepl值,同步实例两个参数均为ON,异步实例两个参数均为OFF。RDS支持用户将异步实例修改为同步实例,重要的一步就是rpl_semi_sync_master_trysyncrepl和rpl_semi_sync_master_keepsyncrepl设置为ON,也支持同步实例修改为异步实例,即将其设置为OFF。

同步实例在出现从库MySQL返回ACK超时(卡主)的时候,目前超时设置为5s,会由RDS管理服务器将该实例设置为修复中,实例复制临时转为异步模式(关闭rpl_semi_sync_master_trysyncrepl和rpl_semi_sync_master_keepsyncrepl),重试从库MySQL重启,重新建立到主库的复制关系,并尝试转为同步模式(开启rpl_semi_sync_master_trysyncrepl和rpl_semi_sync_master_keepsyncrepl),确认Rpl_semi_sync_slave_status为ON之后(即转同步成功),将实例重新置为可用/运行中。

最后,上述描述仅聚焦于semi-sync的一些参数和状态,并没有详细介绍semi-sync的原理、实现,介绍说明启用semi-sync的具体步骤。

网易云数据库RDS是一种稳定可靠、可弹性伸缩的在线关系型数据库服务,当前支持MySQL引擎,提供基础版,高可用版,金融版针对不同业务场景的高可用解决方案,点击可免费试用

网易云免费体验馆,0成本体验20+款云产品!

更多网易技术、产品、运营经验分享请点击

相关文章:
【推荐】 遭遇各种内容监管,有些企业到底欠缺的是什么,仅仅是价值观吗?
【推荐】 教你如何选择BI数据可视化工具
【推荐】 关于《金字塔原理》的主要内容

原文地址:https://www.cnblogs.com/163yun/p/9816555.html

时间: 2024-10-25 20:10:12

MySQL之不得不说的keepsync和trysync的相关文章

windows下mysql安装失败的一个解决案例

操作系统:windows8.1,之前安装过mysql,这次安装在配置的最后一部执行“Apply security settings”的过程中弹出经典错误: Access denied for user 'root'@'localhost' (using password:YES) 网上寻找了各种方法,有:原mysql未卸载完全的,失败:有修改密码的,解决方法如下: 解决办法是重新设置root用户密码,在Windows平台下操作步骤如下:1.以系统管理员身份登录到系统:2.如果MySQL服务器正在

win7搭建php7+apache2.4

从事php开发的工作也将近两年的时间了,期间在windows上安装了很多次php+apache+mysql,但一直没有写过一篇属于自己的文章,今天心血来潮准备写一篇,长话短说,开搞!! 我在配置php+apache+mysql的时候选用的版本是: php-7.0.14-Win32-VC14-x64.zip 下载链接:http://windows.php.net/download 注意:要下载  Thread Safe 版本的. httpd-2.4.25-x64-vc11.zip 下载链接:htt

mybatis generator Date类型时间丢失

开篇 本次项目换用了Oracle数据库,讲真,真的不好用,不太喜欢,比较喜欢轻量级的MySQL但是不得不说从Oracle的严谨中学到不少好东西. <resultMap id="BaseResultMap" type="cn.hlyd.yikang.xyj.domain.DrugRecord" > <id column="ID" property="id" jdbcType="VARCHAR"

java面试总结之四

前言 前一篇简单的介绍了一下mysql的相关知识,说到mysql就不得不说一下mybatis框架,这一篇主要讲一讲mybatis的应用和面试的问题.总体来说,mybatis更多的可以理解为一个工具,面试中问到的问题相对较少,大家也可以了解一下hibernate,在面试过程中可以给面试官一种知识丰富的感觉. mybatis的架构 mybatis和数据库交互的方式有两种,一种是传统的根据statementId调用API,另一种是基于Mapper接口实现的,这里我们主要说一说Mapper接口的方式.通

8 个不得不说的 MySQL 陷阱

MySQL安装简单,速度较快,功能丰富.另外它还是开源运动的标杆,它的伟大成就向我们展示了一个成功的公司是可以建立在开源代码之上的. 然而用过mysql的人都曾对着显示器挥舞过拳头.但你不可能发明一种每秒能保存成千上万行互联网数据,并且一点错误都没有的技术吧. 为了在这个夏天躁起来,我们列举了8个抱怨开源关系型数据库的理由.下面列举的理由中不仅限于 MySQL,有一些是针对关系型数据库的.如果我们没有理清楚关系型数据库和 MySQL,我们将会永远陷入90年代的思想上.我们需要推倒然后重建这些.或

mysql体系结构之不得不说

mysql数据库和实例. 数据库:物理操作系统文件或其它形式文件类型的集合.记住数据库是文件! 实例:mysql数据库后台线程以及一个共享内存区组成.记住是程序内存和线程! mysql是个一个单进程多线程架构的数据库,插件式存储引擎是其最大特点,注意,存储引擎是基于表的,而不是数据库. 体系结构看下图.

8个不得不说的mysql陷阱

%E5%86%8D%E8%A7%81googlereader http://www.zcool.com.cn/collection/ZMTcxOTQyNzI?52PJ=704V8 http://www.zcool.com.cn/collection/ZMTY4NTEyMTY http://www.zcool.com.cn/collection/ZMTY5NTQ1NjA=.html http://www.zcool.com.cn/collection/ZMTcyNDA5NzY http://www

浅谈mysql

关于数据库其实我们可以简单的理解为存储货物的一个厂库,里面分别是按照一定的分类存放的物品,然后人们有时会从厂库中拿走或存储一些物品,有时也会更改或增加一些分类 这些物品都分门别类的存放在厂库中,方便人们的查询和存储. MySQL是一个关系型数据库管理系统,开发者为瑞典MySQL AB公司.目前MySQL被广泛地应用在互联网行业.由于其体积小.速度快.总体拥有成本低,尤其是开放源码这一特点,许多互联网公司选择了MySQL作为后端数据库.2008年MySQL被Sun公司收购,2010年甲骨文成功收购

运维角度浅谈:MySQL数据库优化

日志君导读: 一个成熟的数据库架构并不是一开始设计就具备高可用.高伸缩等特性的,它是随着用户量的增加,基础架构才逐渐完善. 作者:zhenliang8,本文转自51CTO博客,点击原文阅读查看网页版文章. 本博文主要谈MySQL数据库发展周期中所面临的问题及优化方案,暂且抛开前端应用不说,大致分为以下五个阶段: 1.数据库表设计 项目立项后,开发部根据产品部需求开发项目,开发工程师工作其中一部分就是对表结构设计.对于数据库来说,这点很重要,如果设计不当,会直接影响访问速度和用户体验.影响的因素很