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

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

开宗明义,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数据可视化工具
【推荐】 关于《金字塔原理》的主要内容

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

  1. spring分布式事务学习笔记(1)

    此文已由作者夏昀授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 分布式事务对性能有一定的影响,所以不是最佳的解决方案,能通过设计避免最好尽量避免. 分布式事务(Distrib ...

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

    操作系统:windows8.1,之前安装过mysql,这次安装在配置的最后一部执行“Apply security settings”的过程中弹出经典错误: Access denied for user ...

  3. 从MySQL临时表谈到filesort

    内部临时表的类型和产生时机相关,翻译自:http://dev.mysql.com/doc/refman/5.6/en/internal-temporary-tables.html In some ca ...

  4. 服务器访问数据库表mysql

    服务器的MySQL配置就不说了,直接说一些用到的基础命令 登陆 show databases; use 数据库: show tables; 执行sql即可: 一定要有分号 select * from ...

  5. win7搭建php7+apache2.4

    从事php开发的工作也将近两年的时间了,期间在windows上安装了很多次php+apache+mysql,但一直没有写过一篇属于自己的文章,今天心血来潮准备写一篇,长话短说,开搞!! 我在配置php ...

  6. mybatis generator Date类型时间丢失

    开篇 本次项目换用了Oracle数据库,讲真,真的不好用,不太喜欢,比较喜欢轻量级的MySQL但是不得不说从Oracle的严谨中学到不少好东西. <resultMap id="Base ...

  7. MVC5+EF6+MYSQl,使用codeFirst的数据迁移

    之前本人在用MVC4+EF5+MYSQL搭建自己的博客.地址:www.seesharply.com;遇到一个问题,就是采用ef的codefirst模式来编写程序,我们一般会在程序开发初期直接在glob ...

  8. MySQL优化聊两句

    原文地址:http://www.cnblogs.com/verrion/p/mysql_optimised.html MySQL优化聊两句 MySQL不多介绍,今天聊两句该如何优化以及从哪些方面入手, ...

  9. 记:MySQL 5.7.3.0 安装 全程截图

    前言: 下一个班快讲MySQL数据库了,正好把服务器里面的MySQL卸了重装了一下. 截个图,作为笔记.也正好留给需要的朋友们. 目录: 下载软件 运行安装程序 安装程序欢迎界面 许可协议 查找更新 ...

随机推荐

  1. python学习之-- 进程 和 线程

    python 进程/线程详解 进程定义:以一个整体的形式暴露给操作系统管理,它里面包含对各种资源的调用,内存的管理,网络接口的调用等等,对各种资源管理的集合,就可以叫做一个进程. 线程定义:线程是操作 ...

  2. HDU 5360 【优先队列+贪心】

    题意: 给定N个无序区间. 对合法区间的定义是: 在这个区间之前已经选出了至少l个合法区间,最多选出了r个合法区间.则该区间为合法区间. 输出最多能挑选出多少个合法区间,并输出合法区间的数量. 思路: ...

  3. 信号量学习 & 共享内存同步

    刚刚这篇文章学习了共享内存:http://www.cnblogs.com/charlesblc/p/6142139.html 里面也提到了共享内存,自己不进行同步,需要其他手段比如信号量来进行.那么现 ...

  4. Data obtained from ping: is it round trip or one way?

    I have 2 servers, each in two separate locations. I need to host an application on one, and the data ...

  5. 为Java说句公道话

    为Java说句公道话 有些人问我,在现有的语言里面,有什么好的推荐?我说:"Java. " 他们非常吃惊:"什么?Java!" 所以我如今来解释一下. Java ...

  6. [RxJS] Implement RxJS `switchMap` by Canceling Inner Subscriptions as Values are Passed Through

    switchMap is mergeMap that checks for an "inner" subscription. If the "inner" su ...

  7. SQL 连接(JOIN)

    SQL 连接(JOIN) SQL join 用于把来自两个或多个表的行结合起来. SQL JOIN SQL JOIN 子句用于把来自两个或多个表的行结合起来,基于这些表之间的共同字段. 最常见的 JO ...

  8. react 项目中 引入 bootstrap

    react-bootstrap是一个非常受欢迎的针对react封装过的bootstrap,它本身不包含css,所以也是需要使用bootstrap原生库. 在create-react-app建的项目目录 ...

  9. Android中的动画具体解释系列【2】——飞舞的蝴蝶

    这一篇来使用逐帧动画和补间动画来实现一个小样例,首先我们来看看Android中的补间动画. Android中使用Animation代表抽象的动画类,该类包含以下几个子类: AlphaAnimation ...

  10. 19-6/24作业: 将一个double类型的小数,按照四舍五入保留两位小数

    ☞要求 将一个double类型的小数,按照四舍五入保留两位小数 ☞实现方式 1.获得一个double类型的小数 2.使用BigDecimal包的setScale进行操作 3.输出结果 ☞代码内容 pa ...