MySQL rpl_semi_sync_master_timeout相关的一件BUG

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 1.背景 部署基于MySQL原生复制的HA系统时,发现在半同步模式下,半同步复制降级为异步复制的超时时间如果设得很长,会严重影响性能高,这是个很奇怪的现象。 2.现象 组合不同参数,用sysbench做压力测试。

1.背景

部署基于MySQL原生复制的HA系统时,发现在半同步模式下,半同步复制降级为异步复制的超时时间如果设得很长,会严重影响性能高,这是个很奇怪的现象。


2.现象

组合不同参数,用sysbench做压力测试。

sysbench --db-driver=mysql  --mysql-db=test2 --mysql-host=srdsdevapp69  --mysql-table-engine=innodb --oltp-table-size=5000000 --num-threads=10 --max-time=10 --max-requests=0 --oltp-test-mode=complex --oltp-read-only=off --test=/opt/sysbench-0.5/sysbench/tests/db/insert.lua  run


结果如下:

rpl_semi_sync_master_enabled rpl_semi_sync_master_timeout qps 备注
on 21474836480 13.99 248天
2147483648 196.3 24.8天
214748364 1251.67 约2.5天
86400000 2146.96 1天
43200000 3211.17 12小时
21600000 3583.02 6小时
10000 3637.16 10秒(默认值)
off - 8926.76  


3. 原因

从上面的表不难看出,当rpl_semi_sync_master_timeout很大时,每个查询的执行时间和rpl_semi_sync_master_timeout成正比。

为什么会出现这么奇葩的事?翻开MySQL的代码,立刻真相大白!


plugin\semisync\semisync_master.cc:

点击(此处)折叠或打开

  1. #define TIME_THOUSAND 1000            
  2. #define TIME_MILLION 1000000    
  3. #define TIME_BILLION 1000000000
  4. ...
  5. int ReplSemiSyncMaster::commitTrx(const char* trx_wait_binlog_name,
  6.                   my_off_t trx_wait_binlog_pos)
  7. {
  8. ...
  9.       unsigned long long diff_nsecs =
  10.         start_ts.tv_nsec + (unsigned long long)wait_timeout_ * TIME_MILLION;
  11.       abstime.tv_sec = start_ts.tv_sec;
  12.       while (diff_nsecs >= TIME_BILLION)//这个while循环是罪魁祸首!!!
  13.       {
  14.         abstime.tv_sec++;
  15.         diff_nsecs -= TIME_BILLION;
  16.       }
  17.       abstime.tv_nsec = diff_nsecs;
  18. ...
  19. }

上面有个while循环,循环次数等于rpl_semi_sync_master_timeout对应的秒数,也就是说,如果设置成300天的话,要循环25920000次,不慢才怪!



4. 修复

把那段代码中的while替换等价的写法后,问题解决。测出的qps在3700左右,和rpl_semi_sync_master_timeout无关。

4.1 修改代码

plugin\semisync\semisync_master.cc:

点击(此处)折叠或打开

  1. # diff plugin/semisync/semisync_master.cc plugin/semisync/semisync_master.cc_bak
  2. 687,688c687,688
  3. start_ts.tv_nsec + ((unsigned long long)wait_timeout_ % TIME_THOUSAND) * TIME_MILLION;
  4. abstime.tv_sec = start_ts.tv_sec + (unsigned long long)wait_timeout_ / TIME_THOUSAND;
  5. ---
  6. > start_ts.tv_nsec + (unsigned long long)wait_timeout_ * TIME_MILLION;
  7. > abstime.tv_sec = start_ts.tv_sec;


4.2 编译

cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/usr/local/mysql/data -DSYSCONFDIR=/etc -DWITH_MYISAM_STORAGE_ENGINE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_MEMORY_STORAGE_ENGINE=1 -DWITH_READLINE=1 -DMYSQL_UNIX_ADDR=/var/lib/mysql/mysql.sock -DMYSQL_TCP_PORT=3306 -DENABLED_LOCAL_INFILE=1 -DWITH_PARTITION_STORAGE_ENGINE=1 -DEXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_FAST_MUTEXES=1
 
make

注:上面的编译选项填的比较随意,从网上随便抄了后再改的,只求编译通过。

4.3 拷贝半同步插件

chown mysql:mysql  ./plugin/semisync/semisync_master.so
cp -rf ./plugin/semisync/semisync_master.so /usr/local/mysql/lib/mysql/plugin/semisync_master.so
cp -rf ./plugin/semisync/semisync_master.so /usr/local/mysql/lib/plugin/semisync_master.so


4.4 重启MySQL

5. 补充

该Bug已报告到MySQL官方网站,http://bugs.mysql.com/80651

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
SQL 关系型数据库 MySQL
(十八)MySQL排查篇:该如何定位并解决线上突发的Bug与疑难杂症?
前面《MySQL优化篇》、《SQL优化篇》两章中,聊到了关于数据库性能优化的话题,而本文则再来聊一聊关于MySQL线上排查方面的话题。线上排查、性能优化等内容是面试过程中的“常客”,而对于线上遇到的“疑难杂症”,需要通过理性的思维去分析问题、排查问题、定位问题,最后再着手解决问题,同时,如果解决掉所遇到的问题或瓶颈后,也可以在能力范围之内尝试最优解以及适当考虑拓展性。
1020 3
|
关系型数据库 MySQL PHP
【Bug解决】Thinkphp5 PDO::__construct(): MySQL server has gone away解决办法
【Bug解决】Thinkphp5 PDO::__construct(): MySQL server has gone away解决办法
264 0
|
SQL 缓存 关系型数据库
故障案例:MySQL唯一索引有重复值,官方却说This is not a bug
故障案例:MySQL唯一索引有重复值,官方却说This is not a bug
410 0
|
SQL Oracle 关系型数据库
这次被坑惨了,MySQL的隐式转换导致了一个线上BUG
某一天,开发问我,为什么针对一个查询会有两条记录,且其中一条记录并不符合条件select * from tablea where xxno = 170325171202362928;xxno为 170325171202362928 和 170325171202362930的都出现在结果中。 一个等值查询为什么会有另外一个不同值的记录查询出来呢? 我们一起来看看究竟!
|
SQL 关系型数据库 MySQL
MySQL 8.0.23上遇到一个FIND_IN_SET的BUG(一)
MySQL 8.0.23上遇到一个FIND_IN_SET的BUG(一)
195 0
MySQL 8.0.23上遇到一个FIND_IN_SET的BUG(一)
|
存储 固态存储 关系型数据库
MySQL 5.6 change buffer bug导致crash
Insert buffer 内部标识长度的位图没有正确更新,导致问题
229 0
|
SQL 运维 监控
一个诡异的MySQL查询超时问题,居然隐藏着存在了两年的BUG
一个诡异的MySQL查询超时问题,居然隐藏着存在了两年的BUG
244 0
|
SQL 关系型数据库 MySQL
看来,MySQL next-key lock 的 bug 并没有被修复!
在上一篇文章《MySQL next-key lock 加锁范围是什么?》中已经介绍了主键索引的加锁范围,现在来回顾一下
363 0
|
关系型数据库 MySQL Java
【BUG日记】【MySQL】多个排序字段,是有优先级的,先来先优先。
【BUG日记】【MySQL】多个排序字段,是有优先级的,先来先优先。
294 0
【BUG日记】【MySQL】多个排序字段,是有优先级的,先来先优先。

推荐镜像

更多