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数据可视化工具
【推荐】 关于《金字塔原理》的主要内容
MySQL之不得不说的keepsync和trysync的更多相关文章
- spring分布式事务学习笔记(1)
此文已由作者夏昀授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 分布式事务对性能有一定的影响,所以不是最佳的解决方案,能通过设计避免最好尽量避免. 分布式事务(Distrib ...
- windows下mysql安装失败的一个解决案例
操作系统:windows8.1,之前安装过mysql,这次安装在配置的最后一部执行“Apply security settings”的过程中弹出经典错误: Access denied for user ...
- 从MySQL临时表谈到filesort
内部临时表的类型和产生时机相关,翻译自:http://dev.mysql.com/doc/refman/5.6/en/internal-temporary-tables.html In some ca ...
- 服务器访问数据库表mysql
服务器的MySQL配置就不说了,直接说一些用到的基础命令 登陆 show databases; use 数据库: show tables; 执行sql即可: 一定要有分号 select * from ...
- win7搭建php7+apache2.4
从事php开发的工作也将近两年的时间了,期间在windows上安装了很多次php+apache+mysql,但一直没有写过一篇属于自己的文章,今天心血来潮准备写一篇,长话短说,开搞!! 我在配置php ...
- mybatis generator Date类型时间丢失
开篇 本次项目换用了Oracle数据库,讲真,真的不好用,不太喜欢,比较喜欢轻量级的MySQL但是不得不说从Oracle的严谨中学到不少好东西. <resultMap id="Base ...
- MVC5+EF6+MYSQl,使用codeFirst的数据迁移
之前本人在用MVC4+EF5+MYSQL搭建自己的博客.地址:www.seesharply.com;遇到一个问题,就是采用ef的codefirst模式来编写程序,我们一般会在程序开发初期直接在glob ...
- MySQL优化聊两句
原文地址:http://www.cnblogs.com/verrion/p/mysql_optimised.html MySQL优化聊两句 MySQL不多介绍,今天聊两句该如何优化以及从哪些方面入手, ...
- 记:MySQL 5.7.3.0 安装 全程截图
前言: 下一个班快讲MySQL数据库了,正好把服务器里面的MySQL卸了重装了一下. 截个图,作为笔记.也正好留给需要的朋友们. 目录: 下载软件 运行安装程序 安装程序欢迎界面 许可协议 查找更新 ...
随机推荐
- APP后端处理表情的一些技巧
app应用中文字夹带表情是个很常见的现象.甚至一些40多岁的大叔级用户,也喜欢在自己的昵称中夹带表情,在产品运营后发现这个现象,彻底颠覆了我的世界观. 在后台处理表情的时间,我遇到过下面3个问题: 1 ...
- express 写接口
实例下载:百度云盘免密码 (): 指注释 一.准备工作 1.安装express npm install express -g npm install express-generator -g 2.初始 ...
- topcoder srm 552
div1 250pt: 题意:用RGB三种颜色的球摆N层的三角形,要求相邻的不同色,给出RGB的数量,问最多能摆几个 解法:三种颜色的数量要么是全一样,要么是两个一样,另外一个比他们多一个,于是可以分 ...
- [Bash] Find Files and Folders with `find` in Bash
find is a powerful tool that can not only find files but it can run a command on each matching file ...
- OpenJudge百炼习题解答(C++)--题3142:球弹跳高度的计算
题: 总时间限制: 1000ms 内存限制: 65536kB 描写叙述 一球从某一高度落下(整数,单位米),每次落地后反跳回原来高度的一半.再落下. 编程计算气球在第10次落地时,共经过多少米? ...
- HDU 2795 Billboard(宣传栏贴公告,线段树应用)
HDU 2795 Billboard(宣传栏贴公告,线段树应用) ACM 题目地址:HDU 2795 Billboard 题意: 要在h*w宣传栏上贴公告,每条公告的高度都是为1的,并且每条公告都要 ...
- .NET中lock的使用方法及注意事项[转]
标准-->ms官方: http://msdn.microsoft.com/zh-cn/library/c5kehkcz(v=vs.90).aspx A.为什么不要 "lock(this ...
- hdu4737A Bit Fun 线段树
//给一串序列,问有多少对[i,j]使得 //[i,j]区间的全部数的或的值小于m //能够知道'或'操作的加(a|b)>=max(a,b) //能够枚举区间的右边r,找左边第一个不满足的位置 ...
- 【iOS系列】-UITableViewCell的展开与收缩的实现思路
UITableViewCell的展开与收缩的实现思路 现在项目中很多地方都会用到,所以我这里介绍一种可以复用的思路,这与文章后面的Swift的实现思路不同,具体大家可自行对比. Demo项目地址 开始 ...
- Eclipse项目遇到问题汇总
1:gc overhead limit exceeded 原因:这是由于项目中eclipse内存分配不足导致 修改:修改eclipse.ini文件 修改如下: ...