ホームページ  >  記事  >  バックエンド開発  >  MySQL rpl_semi_sync_master_timeout に関連する BUG_PHP チュートリアル

MySQL rpl_semi_sync_master_timeout に関連する BUG_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-12 08:57:331166ブラウズ

MySQL rpl_semi_sync_master_timeout に関連するバグ

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 実行


結果は次のとおりです:

2147483648214748364
rpl_semi_sync_master_enabled rpl_semi_sync_master_timeout qps メモ
21474836480 13.9 約248日
196.3 約24.8日
1251.67 約2.5日
86400000 2146.96 1日
43200000 3211.17 12時間
21600000 3583.02 6時間
10000 3637.16 10秒 (デフォルト値)
オフ - 8926.76


3. 理由

上記の表から、rpl_semi_sync_master_timeout が大きい場合、各クエリの実行時間が rpl_semi_sync_master_timeout に比例することがわかります。

なぜこのような奇妙なことが起こるのですか? MySQL コードを開くと、真実がすぐに明らかになります。


プラグインemisyncsemisync_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. unsignedlonglongdiff_nsecs =
  10. start_ts.tv_nsec + (unsignedlonglong)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. }

しばらくあります上記の Loop では、ループの数は rpl_semi_sync_master_timeout に対応する秒数に等しくなります。つまり、300 日に設定すると、25,920,000 回ループすることになりますが、これは遅くありません。



4. 修復

そのコード内の while を同等の記述に置き換えると、問題は解決されます。測定された qps は約 3700 ですが、これは rpl_semi_sync_master_timeout とは関係ありません。

4.1 コードを変更します

pluginsemisyncsemisync_master.cc:

  1. # diff plugin/semisync/semisync_master.cc plugin/semisync/semisync_master.cc_bak
  2. 687,688c687,688
  3. < start_ts.tv_nsec + ((符号なし長long )wait_timeout_ % TIME_THOUSAND) * TIME_MILLION;
  4. < abstime.tv_sec = start_ts.tv_sec + (符号なし long long)wait_timeout_ / TIME_THOUSAND>長い長い署名) wait_timeout_ * TIME_MILLION;
  5. > abstime.tv_sec = start_ts.tv_sec;

  6. 注: 上記のコンパイル オプションは、インターネットからコピーして変更したものです。コンパイルを通過させたいだけです。
4.3 半同期プラグインをコピーします

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.4 MySQLを再起動します

5. 補足

このバグはMySQL公式Webサイトhttp://bugs.mysql.com/80651に報告されています


http://www.bkjia.com/PHPjc/1108686.html

www.bkjia.com

tru​​e

http://www.bkjia.com/PHPjc/1108686.html

MySQL rpl_semi_sync_master_timeout 1 に関連するバグ。MySQL ネイティブ レプリケーションに基づいて HA システムをデプロイする場合、半同期モードでは、半同期レプリケーションが非同期レプリケーション タイムアウトにダウングレードされることが判明しました...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。