MySQLのレプリケーションとチューニングの原則と方法を分析する

MySQLのレプリケーションとチューニングの原則と方法を分析する

mysql のデフォルト値は full ですが、これを minimal に変更するのが最適です。

binlog_row_image=最小限

4. マスタースレーブレプリケーションの遅延

マスター データベースとスレーブ データベースは同じホスト上にないため、データ同期に遅延が発生します。解決策は、キャッシュを追加し、ビジネス レイヤーがジャンプするのを待つことです。データベース レベルから遅延の問題を軽減する必要がある場合は、レプリケーションの 3 つの主要な手順 (マスター データベースがログを生成し、マスターとスレーブ間の転送ログが生成され、スレーブ データベースがログの内容を復元する) から始めることができます。

1. マスターデータベースがログに書き込む速度

メイン データベースのトランザクション サイズを制御し、大きなトランザクションを複数の小さなトランザクションに分割します。

たとえば、200,000 行のデータを挿入する場合は、一度に 5,000 行を挿入できます (ページングの考え方を使用できます)。

2. マスターとスレーブ間のバイナリログ転送時間

マスター サーバーとスレーブ サーバーは、可能な限り同じコンピューター ルームまたは地域に配置する必要があります。

ログフォーマットがMIXEDに変更され、設定行のログフォーマットが最小限ではなくなりました。原理の詳細については、上記のログフォーマットの紹介を参照してください。

3. ライブラリからログを復元する時間を短縮する

MySQL バージョン 5.7 以降では、論理クロック方式を使用して SQL マルチスレッドを割り当てることができます。

論理クロックを設定します: slave_parallel_type = 'logical_clock';

レプリケーション スレッドの数を設定します: slave_parallel_workers=4;

5. 留意点

MySQL を再起動する場合は、MySQL ユーザーに切り替えてから操作を実行するのが最適です。そうしないと、ファイルの起動後に権限の問題が発生します。 MySQL 環境をセットアップした後、構成で log-bin オプションを設定します。こうすることで、将来データベースからデータベースをコピーする必要がある場合でも、データベースを再起動して業務を中断する必要がなくなります。メイン データベースのファイアウォールの対応する mysql ポートを開く必要があります。スレーブデータベースは、ポーリングではなくマスターデータベースから送信される情報をリッスンすることでマスターデータベースと同期するため、通信障害が発生した場合、再接続後にマスターデータベースがデータの変更を行わないと、スレーブデータベースはデータを同期しません。そのため、空のトランザクションを挿入することでデータを同期できます。

以上が今回編集部がまとめた内容の全てです。123WORDPRESS.COMをよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Linux での MySQL データベースのマスター スレーブ同期レプリケーション構成
  • MySql マスタースレーブレプリケーションを実装する Docker 方式の詳細説明 (実践編)
  • MySQLのレプリケーションの詳細な分析
  • MySQL 高可用性ソリューション MMM (MySQL マルチマスター レプリケーション マネージャー)
  • MySQL 5.7.18 マスタースレーブレプリケーション設定(マスター 1 台とスレーブ 1 台)チュートリアルの詳細な説明
  • Mysql5.7.18 のインストールとマスタースレーブレプリケーションの詳細なグラフィック説明
  • MySQL マスタースレーブレプリケーションプロセスの詳細な説明
  • pt-heartbeat を使用して MySQL レプリケーションの遅延を監視する方法の詳細な説明
  • MySQL マスタースレーブレプリケーションの読み書き分離構造の詳細な説明
  • docker を使用して MySQL マスタースレーブレプリケーション環境を迅速に構築する方法の詳細な説明
  • MySQL の準同期レプリケーションについての簡単な説明
  • MySQL レプリケーションの利点と原則を詳しく説明します

1. はじめに

MySQL にはレプリケーション ソリューションが付属しており、次のような利点があります。

データのバックアップ。

負荷分散。

分散データ。

コンセプト紹介:

マスター: 複製されるデータベース。

スレーブ: マスターのデータを複製するデータベース。

再現手順:
(1)マスターは変更の詳細を記録し、バイナリログに保存します。
(2)マスターはスレーブに同期メッセージを送信する。
(3)スレーブはメッセージを受信後、マスターのバイナリログをローカルリレーログにコピーします。
(4)スレーブはリレーログ内のメッセージを再現し、データベースデータを変更する。

このプロセスを説明する典型的な図を以下に示します。

2. レプリケーションの実装

レプリケーションを実装するには、次の手順が必要です。

1. MySQLマスターライブラリのバイナリログとサーバーIDを設定する

MySQL設定ファイルは通常/etc/my.cnfに保存されます。

# [mysqld] の下に設定オプション [mysqld] を追加する
サーバーID=1
ログ bin = mysql-bin.log

server-id は、データベース クラスター全体におけるデータベースの一意の識別子であり、一意である必要があります。
MySQLを再起動します。

注: このファイルがすでに MySQL 構成ファイルで構成されている場合には、この手順をスキップできます。

2. 新しいコピーアカウントを作成する

データベースからマスター データベース データをコピーするための新しいアカウントをマスター データベースに作成し、コピー権限を付与します。

mysql> GRANT REPLICATION SLAVE、REPLICATION CLIENT ON *.* TO user_name@'host' IDENTIFIED BY 'password';

3. MySQLマスターデータベースのサーバーIDを設定する

2 番目のステップの構成と同様に、注意すべき点が 2 つあります。

スレーブ ライブラリを他のスレーブ ライブラリのマスター ライブラリとして使用する必要がない場合は、バイナリ ロギングを構成する必要はありません。多くの場合、レプリケーションでは、マスター データベース内のすべてのデータベース (特に MySQL 情報構成データベース) のレプリケーションは必要ありません。したがって、replicate_do_dbを設定してレプリケートされたデータベースを指定することができます。4.データベースからマスターデータベースのデータを初期化します。

データ量が多くない場合は、mysqldump ツールを使用してマスター データベースのデータをエクスポートし、スレーブ データベースにインポートできます。

mysqldump --single-transaction --triggers --master-data データベース名 > data.sql

データ量が多い場合は、ここでは紹介されていない Xtrabackup を使用してデータベースをエクスポートする必要があります。
初期化にバイナリ ログを直接使用しないのはなぜかと疑問に思う学生もいるかもしれません。

マスター データベースが長時間実行されている場合、バイナリ ログに従ってスレーブ データベースを使用してデータをコピーするのは適切ではありません。バイナリ ログを直接使用してスレーブ データベースを初期化すると、時間がかかり、パフォーマンスが低下します。ほとんどの場合、マスター データベースのバイナリ ログ構成項目はオンになっていないため、以前の操作のバイナリ ログは存在しません。 5. レプリケーションを有効にする

ライブラリから次のコマンドを実行します

mysql> MASTERをMASTER_HOST='host'に変更します。
-> MASTER_USER='ユーザー'、
-> MASTER_PASSWORD='パスワード',
-> MASTER_LOG_FILE='mysql-bin.000001',
-> MASTER_LOG_POS=0;

最後の 2 つのコマンド、MASTER_LOG_FILE と MASTER_LOG_POS に注意してください。これらは、ライブラリから読み取りを開始するバイナリ ファイルとオフセットの開始位置を示します。これらの 2 つのパラメーターは、インポートした SQL にあります。

レプリケーションを有効にする

スレーブを起動します。

この時点でレプリケーションは完了です。マスター データベースでデータが更新されたり、新しいデータが追加されたりすると、その結果をスレーブ データベースで照会できます。


レプリケーション スレッドのステータスは、マスター データベースで照会することもできます。

3. レプリケーションログの形式

マスター データベースがデータを保存する方法に応じて、MySQL レプリケーションには 3 つのログ形式があります。

コピー方法特徴アドバンテージ欠点
行形式のコピーに基づいて、変更する必要がある各行のデータ情報を記録します。 SQL ステートメントが 2w 行のデータを変更する場合、2w 行のログ形式が記録されます。データの強い一貫性が保証され、実行後の結果が記録されるため、スレーブデータベースへの復元が高速になります。ログレコードの数が多く、マスターとスレーブ間の転送に時間がかかります。
声明セグメントベースのログ形式のレプリケーション。つまり、変更された行レコードではなく、変更された SQL レコードを記録します。ログ記録は最小限です。出力結果が不確定な関数の中には、スレーブデータベースで実行した場合に問題が発生するものがあります。例えば、スレーブデータベースがログに基づいてマスターデータベースのデータを復元する場合、再度 SQL を実行する必要があり、比較的長い時間がかかります。
混合上記の 2 つのログ形式を組み合わせてログを記録します。どのログ形式を使用するかは MySQL 自体が決定します。上記の 2 つのログ形式の長所と短所はバランスが取れています。

MySQL 5.7 より前では、ステートメント形式がデフォルトで使用されていました。

設定方法は構成ファイルで設定できます (推奨):

binlog_format=行

または、一時的にグローバル変数を設定します (現在の MySQL 接続は有効です)。

ログ形式を表示します。mysql > show variables like 'binlog_format';
ログ形式を設定するmysql> set binlog_format='row';

通常、マスターサーバーとスレーブサーバーの 2 つは同じコンピュータルームに配置されるため、2 つのサーバー間の同期速度は速くなります。強力な一貫性を確保するには、行ログ形式 (行) を優先する必要があります。転送速度を確保するには、混合モード (混合) を選択できます。
ラインのログ形式には、次の 3 つの記録モードがあります。

記録方法特徴
最小限変更された列のデータのみを記録する
満杯変更された行のすべての列のデータを記録する
ノブロブ機能は上記と同じですが、BLOB 型およびテキスト型の列が変更されていない場合、これらの列 (つまり、大きなデータ列) のデータは記録されません。

<<:  Dockerイメージをプルしてバージョンを確認する方法

>>:  JS Canvas インターフェースとアニメーション効果

推薦する

JavaScript キャンバス テトリス ゲーム

テトリスは非常に古典的な小さなゲームで、私もそれを書いてみました。しかし、できるだけ簡潔で論理的なコ...

Docker を使ってゼロから SOLO 個人ブログを構築する方法

目次1. 環境整備2. Dockerをインストールする3. MySQLマスタースレーブデータベースを...

CSS3でハートを描く

成果を達成する要件/機能: CSS + HTML を使用してハートを描く方法。分析:正方形と 2 つ...

CocosCreatorでスワイプした位置にテクスチャを表示する方法

目次1. プロジェクト要件2. 文書の内容3. プロジェクト例4. プロジェクトコード1. プロジェ...

MySQL Installer 8.0.21 インストール チュートリアル (画像とテキスト付き)

1. 理由新しいシステムに MySQL を再インストールする必要があったので、将来詳細を忘れた場合...

Vueはシンプルなマーキー効果を実装します

この記事では、Vueの具体的なコードを共有して、シンプルなマーキー効果を実現しています。具体的な内容...

Spring Boot 階層化パッケージング Docker イメージの実践と分析 (推奨)

目次1. Springbootプロジェクトを準備する2. 関連する設定を実行する3.パッケージ4.D...

HTML スペースコードの簡単な分析

HTML についてどれくらい知っていますか? 現在、基本的な HTML コードを学習している場合は、...

Dockerのデフォルトネットワークセグメントを変更する実装方法の分析

背景同社のサーバーはすべて Alibaba Cloud ECS ホストを購入しています。デフォルトの...

OpenSSL は双方向認証のチュートリアルを実装します (サーバーとクライアントのコード付き)

1. 背景1.1 問題点最近の製品テスト レポートでは、PKI ベースの認証方法の使用が推奨されて...

高品質なコードを書く Web フロントエンド開発実践書の抜粋

(P4) Web 標準は一連の標準で構成されています。中心となる概念は、Web ページの構造、スタイ...

Linux サーバーに SSH パスワードなしでログインする方法

テスト サーバーにログインするたびに、必ず ssh ログインのパスワードを入力する必要があります。ロ...

Docker Swarmを使用してWordPressを構築する方法

原因かつて私は Vultr に WordPress を設定しましたが、よく知られている理由により、こ...

要素テーブルヘッダー行の高さの問題の解決

目次序文1. 問題の原因2. 解決策VueはelementUIテーブルtr thの高さと背景色を変更...

MySQL の列から行への変換と年月グループ化の例

以下のように表示されます。 SELECT count(DISTINCT(a.rect_id)) zc...