web-dev-qa-db-ja.com

MySQLレプリケーションスレーブは非常に遅い

私は完全に困惑させる複製の問題に取り組んでいます!このクライアントには[〜#〜] huge [〜#〜]ベアメタルHWに2つのMySQLレプリケーションクラスタがあります。以下の環境を参照してください。

スレーブのIO_Treadは、数時間以上遅れています。はい、SQL_treadではなくIO_treadです。それほど大きなbinlogレコードをすべてダウンロードしてディスクに書き込むことが難しいのはなぜですか。リソースのボトルネックを見つけようとしましたが、巨大なハードウェアを見つけることができませんでした。

唯一の奇妙な観察は、スレーブが8x IOマスターよりもOPSであることです。しかし、これでもSSDディスクに実際に過負荷をかけることはありません。パケットトレースは頻繁にスレーブを示しますTCPウィンドウをゼロに設定します。なぜ、リソースがたくさんあるのですか?

この奇妙な行動を引き起こしている可能性のあるアイデアを持っている人はいますか?なぜスレーブにIOがあるのですか?IO_treadが遅くなる原因は何ですか?

環境:両方のマシン:ベアメタルデル、MySQL 5.6.30、12CPU、128GBメモリ、SSD上のデータディレクトリ、ネットI/F:Emulex 10Gb、ROWベースのbinlog FMT

症状:

マスター:CPU:67%1プロセッサーを軽く使用、MEM:70%使用、30%空き、IO OPS:〜2500 tps、30%utils on SSD、スレーブクライアントトレッド:binlogをスレーブに送信します

SLAVE:

CPU:40%1プロセッサーを軽く使用、MEM:70%使用、30%空き、IO OPS:〜16000 tps、SSDで70%使用、ネットI/Fでのエラーカウンターは0 (ゼロ)、TCPウィンドウはしばしばIO_treadで0に設定され、スレーブIO_treadは非常に遅いです。1時間以上遅れます!

同じマスターの別のスレーブはまったく問題ありません!このスレーブのHWスペックはかなり低くなっています!

マスターbinlogのダウンロード中に問題が発生しました。なぜこれがめちゃくちゃ高いIO rate?

スレーブを停止すると、IO OPSも停止します(予想どおり、OPSはMySQLからのものです)。

大量のデータをマスターからスレーブに(ncatを使用して)ネットワーク経由でコピーすると、期待どおりのパフォーマンスが得られます。

その他の観察:

役割を逆にしても、問題は同じままです。

同じHWを持つ別のレプリケーションクラスターに問題はありません。 IOスレーブ上のこのクラスターのOPSはマスター上のOPSよりもわずかです。このクラスターはSTATEMENTベースのバイナリログを使用します

2

コメントするには50名の担当者が必要なので、次のように始めます。

  1. ファイルシステムに偶然ZFSを使用していますか(予期せずディスクを調整する可能性があります)?
  2. 構成ファイルは(ほぼ)同一ですか(レプリケーションマスター/スレーブ設定を除く)?メモリバッファを除いて、設定は他のスレーブと同じにする必要があります(サーバーのハードウェアが異なるように聞こえます)。 https://www.percona.com/doc/percona-toolkit/2.2/pt-config-diff.html
  3. (スレーブで実行し、投稿)SHOW SLAVE STATUS\G
  4. (マスターで実行し、投稿)SHOW MASTER STATUS\G
  5. スレーブステータスを数回確認します(1分ほど間隔を空ける)。 Exec_Master_Log_PosとRead_Master_Log_Pos(またはRetrieved_Gtid_SetとExecuted_Gtid_Set)の両方が移動していますか(それらが追いついている場合に理想的です)。
  6. リレーログはテーブルまたはファイルとして保存されていますか?

編集リックの投稿を読んだ後、戻って気づきました(最初は両方ともSBRであったと考えられます)高速で実行されているクラスターがSBR(ステートメントベースのレプリケーション)を実行している、遅いものはRBR(行ベース)です。クエリの種類と、たとえば1時間に生成するバイナリログの数に関するリックの質問は重要です。

RBRの方が速い場合もあれば、SBRが優先される場合もあります。すべてのシナリオをテストおよびベンチマークすることは常に重要です。

1
Allan Mason

I/Oスレッドが遅れている場合、ネットワークは低速です。

SQLスレッドが遅れている場合、それはレプリケーションのシリアルの性質(新しいバージョンがない場合)またはSELECTsからの競合、ディスクI/O、またはハードウェアの違い(通常、スレーブは少なくともマスターと同じくらい強力です)など.

巨大なUPDATEsまたはDELETEsを実行している場合、行ベースのレプリケーションはレプリケーションストリーム(binlog)に多くのものを入れます。これは関連がありますか?

「マスター:CPU:67%1プロセッサーを軽く使用」-1つのコアの67%でもかなり高いです。おそらく、いくつかの必要な複合インデックスが不足していますか?

スレーブはレプリケーションを妨害する可能性があるSELECTsを大量に実行していますか?

両方のマシンのSHOW VARIABLES LIKE 'query_cache%';の値は何ですか? RAMの容量に関係なく、 `query_cache_sizeを、たとえば50Mより大きく設定しないでください。

1時間あたり何GBのバイナリログが作成されますか?

1
Rick James