部署基於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_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