来自 计算机前端 2019-12-28 09:41 的文章
当前位置: 美高梅4858官方网站 > 计算机前端 > 正文

MySQL rpl_semi_sync_master_timeout相关的意气风发件BUG

MySQL rpl_semi_sync_master_timeout相关的风度翩翩件BUG

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

美高梅4858官方网站,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的代码,立即水落石出!

pluginsemisyncsemisync_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天的话,要循环259贰零零贰0次,超级快才怪!

4. 修复

把这段代码中的while替换等价的写法后,难题消除。测出的qps在3700左右,和rpl_semi_sync_master_timeout无关。

4.1 校订代码

pluginsemisyncsemisync_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. > start_ts.tv_nsec + (unsigned long long)wait_timeout_ * TIME_MILLION;
  6. > 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=1make

注:上边包车型客车编写翻译选项填的相比随便,从网络随意抄了后再改的,只求编写翻译通过。

4.3 拷贝半同步插件

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

4.4重启MySQL

5. 补充

该Bug已告知到MySQL官网,

rpl_semi_sync_master_timeout相关的豆蔻年华件BUG 1.背景 布署基于MySQL原生复制的HA系统时,发未来半风度翩翩并方式下,半后生可畏并复制降级为异步复制的超时...

本文由美高梅4858官方网站发布于计算机前端,转载请注明出处:MySQL rpl_semi_sync_master_timeout相关的意气风发件BUG

关键词: