01 並列レプリケーションの概念 MySQL のマスター スレーブ レプリケーション アーキテクチャでは、マスター データベースで多くの SQL ステートメントが同時に実行されることがよくあります。これらの SQL ステートメントがロック待機を生成しない限り、複数の SQL スレッドを同時に実行しても問題はありません。 MySQL スレーブ データベースは IO_thread を使用してマスター データベース上の binlog を取得し、それをローカルに保存してリレー ログとしてディスクに書き込み、これらのリレー ログを sql_thread を通じて適用することがわかっています。 MySQL 5.6 より前のバージョンでは、マスター データベースで複数のスレッドが同時に SQL を実行する場合、sql_thread は 1 つしかありませんでした。TPS が高いシナリオでは、マスター データベースが大幅に遅延することがありました。この問題を解決するために、MySQL は sql_thread を複数のワーカーに進化させ、リレー ログ内のトランザクションをスレーブ側で並列に適用することで、リレー ログの適用速度を向上させ、レプリケーションの遅延を削減しました。ここで並列レプリケーションが登場します。 MySQL では、レプリケーション スレッドはパラメータ slave_parallel_workers によって制御されます。通常、8G メモリと 8 コア CPU を搭載したマシンでは、この値を 8 に設定するのが適切です。CPU のコア数が多い場合は、8 から 16 の間の数値に調整できます。 mysql> 'slave_parallel_workers' のような変数を表示します。 +------------------------+-------+ | 変数名 | 値 | +------------------------+-------+ | スレーブ並列ワーカー | 8 | +------------------------+-------+ セットに 1 行、警告 1 件 (0.00 秒) 02 並列レプリケーションの進化 並列レプリケーションの本質は、同時に実行される SQL ステートメントのロック競合がないことです。 MySQL バージョン 5.6 では、MySQL がサポートする粒度は、データベースに応じてリレー ログを並列に実行することです。この方法では、異なるデータベース上の SQL がテーブル内の同じ行の内容を変更することは絶対にないため、いくつかの問題を解決できます。こうすることでロックの競合は発生しなくなります。この並列レプリケーション方法は、いくつかのデータベースが均等に分散され、各データベースが同様の頻度で使用されるシナリオに適しています。ビジネスのデータがホット テーブルに集中している場合、並列レプリケーションはシングル スレッド レプリケーションに退化します。 その後、MariaDB の並列レプリケーションにいくつかの改善が行われました。そのアプローチは次のとおりです。 1. マスター データベースで並列送信できるトランザクション、つまり、REDO ログ コミット ステージに入ったトランザクションは、スレーブ データベースでも並列送信できます。したがって、マスター データベースで並列送信されたトランザクションは、commit_id によって識別されます。次の並列トランザクション グループの commit_id は、このグループの commit_id+1 です。 2. すべてのトランザクションのcommit_idをbinlogに書き込む 3. データベースからバイナリログを適用するときは、すべてのバイナリログをcommit_idに応じて異なるワーカーに分割します。 4. このグループ内の commit_id のすべてのトランザクションがスレーブ データベースでコミットされた後、次のトランザクション バッチが実行されます。 この方法により、スレーブからのリレー ログの適用速度が大幅に向上しますが、スレーブが前のトランザクション セットを適用している間、前のセットのワーカーの一部がアイドル状態であっても、次のトランザクション セットが待機状態になるという問題があります。マスター データベースでは、データが常に書き込まれる可能性があります。その結果、マスター ノードとスレーブ ノードのシステム スループットは一致せず、マスター データベースのスループットはスレーブ データベースのスループットよりもはるかに高くなります。 MySQL 5.7 の並列レプリケーションは、MariaDB に基づいて改善されています。トランザクションが redo ログ準備段階に入ると、WAL テクノロジにより、トランザクションが競合検出段階を通過したことがわかります。 MySQL 5.7 の並列レプリケーションでは、マスター データベース上の redo ログ準備フェーズのすべてのトランザクションと、このフェーズ以降のトランザクション、つまり redo ログ コミット フェーズのトランザクションがスレーブ データベース上で並列に実行されるため、ワーカー スレッドの不要な待機が削減されます。 ここで、さらに 2 つのパラメータについて説明する必要があります。
これら 2 つのパラメータは、binlog 書き込みから fsync までの時間を意図的に延長し、binlog 書き込み回数を減らすために使用されます。 MySQL 5.7 の並列レプリケーション戦略では、これらを使用して、より多くの「準備段階で同時にトランザクション」を作成できます。これにより、スタンバイ データベース レプリケーションの並列処理が向上します。 プライマリ データベースのコミットを「意図的に」遅くし、スタンバイ データベースの実行を高速化することができます。 MySQL 5.7 でスタンバイ データベースの遅延に対処する場合、スタンバイ データベースのレプリケーションの同時実行性を向上させるために、これら 2 つのパラメータ値を調整することを検討できます。 上記は、MySQL 並列レプリケーションの詳細についての簡単な分析です。MySQL 並列レプリケーションの詳細については、123WORDPRESS.COM の他の関連記事に注目してください。 以下もご興味があるかもしれません:
|
Vueボタンコンポーネントのカスタムカプセル化コードは参考用です。具体的な内容は次のとおりです。ボタ...
この記事では、MySQL インデックス カバレッジについて例を挙げて説明します。ご参考までに、詳細は...
この記事では、参考までに簡単なタイマーを実装するためのJavaScriptの具体的なコードを紹介しま...
目次VueUse にはどのようなユーティリティがありますか? VueUseをVueプロジェクトにイン...
多くの Web サイト デザイナーが犯す最も一般的な間違いは、Web ページが IE で正常に表示さ...
Alibaba Cloud yum コマンドでのデフォルトの MySQL バージョンは 5.17**...
目次1 Dockerをインストールする2 国内ミラーソースの設定3 中国語環境基本版Centos7イ...
目次0x0 はじめに0x1 インストール0x2 ノードサイドバー0x3 統合例0x0 はじめにプロジ...
この記事では、カレンダー効果を素早く実現するためのJavaScriptの具体的なコードを例として紹介...
新しいコンピューターに変更したので、すべての環境を新しいコンピューター上で設定する必要があります。ふ...
学習目標: Windowsシステムを使用してMySQLデータベースをインストールする方法を学びます。...
一部の Web ページは大きく見えなくても開くのに非常に時間がかかる場合があります。一方、他の We...
文書タイプDoctype は、指示を解析するためにどのバージョンの HTML を使用するかをブラウザ...
1. CSSナビゲーションバー(1)ナビゲーションバーの機能ナビゲーション バーを使いこなすことは、...
JavaとMysql 8.0.18バージョンの接続方法については、参考までに具体的な内容は以下のとお...