MySql マスタースレーブレプリケーションの実装原理と構成

MySql マスタースレーブレプリケーションの実装原理と構成

データベースの読み取りと書き込みの分離は、トラフィック量の多い大規模システムやインターネット アプリケーションにとって不可欠かつ重要な機能です。 MySQL の場合、標準的な読み取り/書き込み分離はマスター/スレーブ モードであり、書き込みノード マスターの後に複数の読み取りノードが続きます。読み取りノードの数はシステムの負荷によって異なり、通常は 1 ~ 3 個の読み取りノードで構成されます。 Mycat の読み取り/書き込み分離および自動切り替えメカニズムなどの一般的な読み取り/書き込み分離ミドルウェアでは、MySQL のマスター/スレーブ レプリケーション メカニズムの連携が必要です。

マスタースレーブ構成に関する注意事項

1. マスターDBサーバーとスレーブDBサーバーのデータベースのバージョンが一致している

2. マスターDBサーバとスレーブDBサーバのデータベースデータ名が一致している

3. マスターDBサーバーはバイナリログを開始します。マスターDBサーバーとスレーブDBサーバーのserver_idは一意である必要があります。MySQLマスターサーバーの構成

ステップ 1: my.conf ファイルを変更します。

[mysqld] セクションの下に以下を追加します。

binlog-ignore-db=mysql

# バイナリログを有効にする log-bin=mysql-bin
//バイナリログには、ステートメント/行/混合の3つの形式があります
binlog_format=行
#メインサーバーの一意のID。通常はIPアドレスの最後のセグメントです。server-id=82

ステップ2: MySQLサービスを再起動する

サービスmysqlの再起動

ステップ3: アカウントを作成し、スレーブを承認する

mysql> 'slave'@'%' に *.* のファイル権限を許可し、'slavepw' によって識別されます。
mysql> 'slave'@'%' ('slavepw' で識別) に、*.* のレプリケーション スレーブ、レプリケーション クライアントを付与します。

通常、ルート アカウントは使用されません。「%」は、アカウントとパスワードが正しい限り、すべてのクライアントが接続できることを意味します。ここでは、セキュリティを強化するために、192.168.145.226 などの特定のクライアント IP アドレスを使用できます。

権限の更新

mysql> 権限をフラッシュします。

ステップ4: マスターのステータスを照会する

mysql> マスターステータスを表示します。
+------------------+----------+--------------+------------------+------------------+
| ファイル | 位置 | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+------------------+
| mysql-bin.000001 | 881 | | mysql | |
+------------------+----------+--------------+------------------+------------------+
セット内の 1 行 (0.00 秒)

MySQLスレーブサーバーの構成

ステップ1: my.confファイルを変更する

[mysqld]# サーバーからの一意のID。通常はIPアドレスの最後のセグメントです。server-id=83

ステップ2: スレーブサーバーを構成する

mysql>マスターをmaster_host='192.168.11.82'、master_port=3306、master_user='slave'、master_password='slavepw'、master_log_file='mysql-bin.000001'、master_log_pos=881に変更します。

文の途中で切断されないように注意してください。master_port は MySQL サーバーのポート番号 (引用符なし)、master_user は同期操作を実行するデータベース アカウント、"881" には一重引用符がありません (ここで 881 は show master status に表示される位置の値、ここで mysql-bin.000001 はファイルに対応する値です)。

ステップ3: サーバーからレプリケーション機能を開始する

mysql>スレーブを起動します。

ステップ 4: スレーブ サーバーのレプリケーション機能のステータスを確認します。

mysql> スレーブのステータスを表示します。

Slave_IO_Running: Yes //このステータスはYESである必要があります

Slave_SQL_Running: Yes //このステータスはYESである必要があります

注意: Slave_IO プロセスと Slave_SQL プロセスは正常に実行される必要があります (つまり、YES 状態)。そうでない場合はエラー状態になります (たとえば、どちらかが NO の場合はエラーです)。

確認する

マスター ノードでテーブルを作成してデータを挿入すると、スレーブ ノードでもテーブルが作成され、データが挿入されることがわかります。

MySQL マスタースレーブレプリケーションの原理は何ですか?

マスター データベースは変更を binlog ログに書き込み、スレーブ データベースがマスター データベースに接続した後、スレーブ データベースには、マスター データベースの binlog ログをローカル コンピューターにコピーし、リレー ログに書き込む IO スレッドがあります。次に、スレーブ データベースの SQL スレッドがリレー ログからバイナリ ログを読み取り、バイナリ ログの内容を実行します。つまり、SQL をローカルで再度実行して、データがマスター データベースのデータと同じであることを確認します。

ここで非常に重要な点があります。それは、スレーブ データベースのデータをマスター データベースと同期するプロセスがシリアル化される、つまり、マスター データベースでの並列操作がスレーブ データベースでシリアルに実行されるということです。これは非常に重要なポイントです。スレーブ データベースはマスター データベースからログをコピーし、SQL をシリアル実行するという特性上、同時実行性の高いシナリオでは、スレーブ データベースのデータはマスター データベースのデータよりも確実に遅くなり、遅延が発生します。そのため、メイン データベースに書き込まれたばかりのデータが読み取れないことが頻繁に発生し、読み取りに数十ミリ秒または数百ミリ秒かかる場合があります。

ここで別の問題があります。マスター データベースが突然ダウンし、データがスレーブ データベースに同期されていない場合、一部のデータがスレーブ データベースで使用できなくなり、一部のデータが失われる可能性があります。

そのため、MySQL には実際にこの領域で 2 つのメカニズムがあります。1 つは半同期レプリケーションで、マスター データベースのデータ損失の問題を解決するために使用されます。もう 1 つは並列レプリケーションで、マスターとスレーブの同期遅延の問題を解決するために使用されます。

このいわゆる半同期レプリケーション ( semi-syncレプリケーションとも呼ばれる) は、マスター データベースが binlog ログを書き込んだ後、直ちにスレーブ データベースにデータを強制的に同期させることを意味します。スレーブ データベースがログをローカル リレー ログに書き込んだ後、マスター データベースに ack を返します。マスター データベースは、スレーブ データベースから少なくとも 1 つの ack を受信した場合にのみ、書き込み操作が完了したと見なします。

いわゆる並列レプリケーションとは、データベースから複数のスレッドを開始し、リレー ログ内の異なるデータベースのログを並列に読み取り、異なるデータベースのログを並列に再生することを意味します。これがデータベース レベルの並列処理です。

MySQL マスタースレーブ同期遅延問題

過去には、マスターとスレーブの同期の遅延によって発生したオンライン バグに対処したことがあります。これは、軽微な製造上の事故でした。

これがそのシーンですか?クラスメートがコードロジックを次のように書きました。まずデータを挿入し、それをチェックアウトして、データを更新します。実稼働環境のピーク時には、書き込み同時実行数が 2000/s に達しました。このとき、マスター スレーブ間のレプリケーション遅延は約数十ミリ秒でした。毎日何らかのデータが存在し、重要なデータのステータスが更新されることを期待しますが、ピーク時には更新されません。ユーザーはカスタマー サービスにフィードバックを提供し、カスタマー サービスは私たちにフィードバックを提供します。

MySQL コマンドを使用します:

ステータスを表示

Seconds_Behind_Masterを見ると、スレーブ データベースがマスター データベースからデータをコピーする際に数ミリ秒遅れていることがわかります。

一般的に、マスタースレーブ遅延が深刻な場合は、次の解決策があります。

メイン データベースを複数のメイン データベースに分割するデータベース シャーディングにより、各メイン データベースの書き込み同時実行性が数倍減少し、マスター スレーブ間の遅延は無視できるようになります。 MySQL でサポートされている並列レプリケーションを有効にし、複数のデータベースを並列に複製します。特定のデータベースの書き込み同時実行性が非常に高く、単一のデータベースの書き込み同時実行性が 2000/s に達した場合、並列レプリケーションは依然として意味がありません。コードを書き直します。コードを書く生徒は注意が必要です。データを挿入するときに、すぐに見つけられない場合があります。存在していて最初に挿入する必要がある場合は、すぐにクエリを実行し、その後すぐに逆の操作を実行する必要があります。このクエリには、メイン データベースへの直接接続を設定します。この方法は推奨されません。これを行うと、読み取りと書き込みを分離する意味が失われます。並列レプリケーションを有効にする

マルチスレッド レプリケーションを有効にするには、次の 2 つのデフォルトのキー パラメータがあります。

mysql> 'slave_parallel_%' のような変数を表示します。
+------------------------+-----------+
| 変数名 | 値 |
+------------------------+-----------+
| スレーブ並列型 | データベース |
| スレーブ並列ワーカー | 0 |
+------------------------+-----------+
セット内の 2 行 (0.00 秒)

スレーブパラレルタイプのデフォルト値はデータベースです

スレーブ並列ワーカー デフォルト値は0です

開ける:

mysql> スレーブ sql_thread を停止します。

クエリは正常、影響を受けた行は 0 行 (0.05 秒)

mysql> グローバルslave_parallel_typeを'LOGICAL_CLOCK'に設定します。

クエリは正常、影響を受けた行は 0 行 (0.00 秒)

mysql> グローバルslave_parallel_workersを4に設定します。

クエリは正常、影響を受けた行は 0 行 (0.00 秒)

mysql> スレーブ sql_thread を開始します。

クエリは正常、影響を受けた行は 0 行 (0.07 秒)

参考文献:

https://www.jianshu.com/p/3932551e0221

https://github.com/doocs/advanced-java/blob/master/docs/high-concurrency/mysql-read-write-separation.md

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • MySQL マスタースレーブレプリケーションにおける重複キーの問題を修正する方法
  • MySql マスタースレーブレプリケーションメカニズムの包括的な分析
  • MySQL マスタースレーブレプリケーションと読み取り書き込み分離の詳細な説明
  • MYSQL データベース GTID はマスタースレーブレプリケーションを実現します (超便利)
  • MySQL マスタースレーブレプリケーションの原理と注意点
  • MySQL マスタースレーブレプリケーションでエラーをスキップする方法
  • MySQL マスタースレーブレプリケーション構成プロセス
  • MySQL マスタースレーブレプリケーションの原理からインストールと設定までを包括的に解説します。
  • MySQL マスタースレーブレプリケーションのいくつかのレプリケーション方法の概要
  • MySQL マスタースレーブレプリケーション切断の一般的な修復方法

<<:  vue3.0 sfcのセットアップの変更について簡単に説明します。

>>:  HTMLのimgタグで画像の中心部分だけを表示する方法(3つの方法)

推薦する

mysql 8.0.18.zip のインストールと構成方法のグラフィック チュートリアル (Windows 64 ビット)

以前にインストールされたバージョンのデータベースをアンインストールする方法については、この記事を参照...

Vueはタブを切り替えてデータの状態を維持する3つの方法を実装します

Vue でタブ切り替えを実装する 3 つの方法1. v-showはコンテンツの切り替えを制御します1...

MIME TYPEとは?MIME-Typesタイプコレクション

MIME タイプとは何ですか? 1. まず、ブラウザがコンテンツを処理する方法を理解する必要がありま...

CSS で写真のスタッキング効果を実装するサンプルコード

成果を達成するステップ1. 初期index.html最初の写真、一番上の写真を作成します。写真の i...

Vue でよく使われる高階関数と包括的な例

1. 配列のよく使われる高階関数配列があり、その配列に対して次の操作を実行したいとします。 100 ...

CentOS 7 で MySQL 接続数が 214 に制限される問題の解決方法

問題を見つける最近、プロジェクトで問題が発生しました。接続が多すぎるため、「接続が多すぎます」という...

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

目次概要Canvas API: グラフィックスの描画パス線種矩形アーク文章グラデーションと画像の塗り...

Vueのフィルターについて知っておくべきこと

目次序文フィルターとは何かフィルターの使い方グローバルフィルターローカルフィルターフィルターは直列に...

「MySQL サービスを開始できません エラー 1069」を解決する方法

今日、外出中に同僚から、ウェブサイトのバックエンドにアクセスできないというメッセージが届きました。と...

JS 継承の詳細

目次序文準備する要約する継承方法プロトタイプ継承プロトタイプチェーン継承コンストラクタの借用(クラス...

ウェブメッセージボード機能を実現するjs

この記事の例では、Webメッセージボードを実装するためのjsの具体的なコードを参考までに共有していま...

Windows で複数の MySQL インスタンスを実行する方法

序文Windows では、各インスタンスに適切なパラメータを使用してコマンド ラインから複数の My...

Vue+SSMは画像アップロードのプレビュー効果を実現します

現在の要件は、ファイルのアップロード ボタンがあることです。ボタンをクリックすると、アップロードする...

デザイン: 意志の強いデザイナー

<br />長年の専門的なアートデザイン教育を通じて「美とは何か」を学びましたが、「美を...

ウェブページのメモリ使用量とCPU使用量を削減する方法

一部の Web ページは大きく見えなくても開くのに非常に時間がかかる場合があります。一方、他の We...