MySQL rpl_semi_sync_master_timeout相關的一件BUG

來源:互聯網
上載者:User

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:

  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天的話,要迴圈25920000次,不慢才怪!



4. 修複

把那段代碼中的while替換等價的寫法後,問題解決。測出的qps在3700左右,和rpl_semi_sync_master_timeout無關。

4.1 修改代碼

plugin\semisync\semisync_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. ---
  6. > start_ts.tv_nsec + (unsigned long long)wait_timeout_ * TIME_MILLION;
  7. > 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重啟MySQL5. 補充

該Bug已報告到MySQL官方網站,http://bugs.mysql.com/80651

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.