私は完全に困惑させる複製の問題に取り組んでいます!このクライアントには[〜#〜] 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ベースのバイナリログを使用します
コメントするには50名の担当者が必要なので、次のように始めます。
編集リックの投稿を読んだ後、戻って気づきました(最初は両方ともSBRであったと考えられます)高速で実行されているクラスターがSBR(ステートメントベースのレプリケーション)を実行している、遅いものはRBR(行ベース)です。クエリの種類と、たとえば1時間に生成するバイナリログの数に関するリックの質問は重要です。
RBRの方が速い場合もあれば、SBRが優先される場合もあります。すべてのシナリオをテストおよびベンチマークすることは常に重要です。
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のバイナリログが作成されますか?