部署基于mysql原生复制的ha系统时,发现在半同步模式下,半同步复制降级为异步复制的超时时间如果设得很长,会严重影响性能高,这是个很奇怪的现象。
组合不同参数,用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 |
从上面的表不难看出,当rpl_semi_sync_master_timeout很大时,每个查询的执行时间和rpl_semi_sync_master_timeout成正比。
为什么会出现这么奇葩的事?翻开MySQL的代码,立刻真相大白!
plugin\semisync\semisync_master.cc:
把那段代码中的while替换等价的写法后,问题解决。测出的qps在3700左右,和rpl_semi_sync_master_timeout无关。
plugin\semisync\semisync_master.cc:
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
注:上面的编译选项填的比较随意,从网上随便抄了后再改的,只求编译通过。
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
该Bug已报告到MySQL官方网站,http://bugs.mysql.com/80651
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号