Home > Article > Backend Development > A BUG_PHP tutorial related to MySQL rpl_semi_sync_master_timeout
When deploying an HA system based on MySQL native replication, it was found that in semi-sync mode, semi-sync If the timeout period for downgrading replication to asynchronous replication is set very long, it will seriously affect performance. This is a very strange phenomenon.
Combine different parameters and use sysbench for stress testing.
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 |
The results are as follows:
rpl_semi_sync_master_enabled | rpl_semi_sync_master_timeout | qps | Remarks |
---|---|---|---|
on | 21474836480 | 13.99 | About 248 days |
2147483648 | 196.3 | About 24.8 days | |
214748364 | 1251.67 | About 2.5 days | |
86400000 | 2146.96 | 1 day | |
43200000 | 3211.17 | 12 hours | |
21600000 | 3583.02 | 6 hours | |
10000 | 3637.16 | 10 seconds (default) | |
off | - | 8926.76 |
It is easy to see from the above table that when rpl_semi_sync_master_timeout is large, the execution time of each query is proportional to rpl_semi_sync_master_timeout.
Why does such a weird thing happen? Open the MySQL code and the truth will be revealed immediately!
After replacing the while in that code with equivalent writing, the problem is solved. The measured qps is around 3700, which has nothing to do with rpl_semi_sync_master_timeout.
pluginsemisyncsemisync_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
Note: The above compilation options I filled it out quite casually. I just copied it from the Internet and then changed it. I just wanted it to be compiled and passed.
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
The bug has been resolved Report to the official MySQL website, http://bugs.mysql.com/80651