MySQLrpl_semi_sync_master_timeout相关的一件BUG_PHP教程
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了MySQLrpl_semi_sync_master_timeout相关的一件BUG_PHP教程,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3205字,纯文字阅读大概需要5分钟。
内容图文
![MySQLrpl_semi_sync_master_timeout相关的一件BUG_PHP教程](/upload/InfoBanner/zyjiaocheng/191/1da91dba97c947dd947291f4fd9cbbf3.jpg)
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 | 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:
- #define TIME_THOUSAND 1000
- #define TIME_MILLION 1000000
- #define TIME_BILLION 1000000000
- ...
- int ReplSemiSyncMaster::commitTrx(const char* trx_wait_binlog_name,
- my_off_t trx_wait_binlog_pos)
- {
- ...
- unsigned long long diff_nsecs =
- start_ts.tv_nsec + (unsigned long long)wait_timeout_ * TIME_MILLION;
- abstime.tv_sec = start_ts.tv_sec;
- while (diff_nsecs >= TIME_BILLION)//这个while循环是罪魁祸首!!!
- {
- abstime.tv_sec++;
- diff_nsecs -= TIME_BILLION;
- }
- abstime.tv_nsec = diff_nsecs;
- ...
- }
上面有个while循环,循环次数等于rpl_semi_sync_master_timeout对应的秒数,也就是说,如果设置成300天的话,要循环25920000次,不慢才怪!
4. 修复
把那段代码中的while替换等价的写法后,问题解决。测出的qps在3700左右,和rpl_semi_sync_master_timeout无关。
4.1 修改代码
plugin\semisync\semisync_master.cc:
- # diff plugin/semisync/semisync_master.cc plugin/semisync/semisync_master.cc_bak
- 687,688c687,688
- < start_ts.tv_nsec + ((unsigned long long)wait_timeout_ % TIME_THOUSAND) * TIME_MILLION;
- < abstime.tv_sec = start_ts.tv_sec + (unsigned long long)wait_timeout_ / TIME_THOUSAND;
- ---
- > start_ts.tv_nsec + (unsigned long long)wait_timeout_ * TIME_MILLION;
- > 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官方网站,http://bugs.mysql.com/80651
http://www.bkjia.com/PHPjc/1108686.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/1108686.htmlTechArticleMySQL rpl_semi_sync_master_timeout相关的一件BUG 1.背景 部署基于MySQL原生复制的HA系统时,发现在半同步模式下,半同步复制降级为异步复制的超时...
内容总结
以上是互联网集市为您收集整理的MySQLrpl_semi_sync_master_timeout相关的一件BUG_PHP教程全部内容,希望文章能够帮你解决MySQLrpl_semi_sync_master_timeout相关的一件BUG_PHP教程所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。