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つの方法)

推薦する

SSH ポート転送とは何ですか?何の役に立つの?

目次序文1. ローカルポート転送2. リモートポート転送3. 動的ポート転送(SOCKS5) 4. ...

要素テーブルからヘッダーを削除する方法

show-header属性を使用したドキュメントのヒントshow-header <el-テーブ...

ドロップダウンメニューを実装するためのネイティブ js

ドロップダウン メニューも実生活では非常に一般的です。実装に使用される js コードは、タブ選択やア...

DIV共通属性コレクション

1. 物件リストコードをコピーコードは次のとおりです。色: #999999 テキスト色フォントファミ...

VirtualBox を使用して Mac 上にローカル仮想マシン環境を構築する方法

1. ビッグデータとHadoopビッグデータについて研究し学ぶには、当然 Hadoop から始める必...

Tomcat ソースコード起動コンソールの中国語文字化けのデバッグプロセス記録

問題を見つける今日はTomcatのソースコードを勉強するつもりなので、公式サイトからTomcatのソ...

Linux の MariaDB データベースについて

目次Linux の MariaDB データベースについて1. データベースとは何ですか? 2. デー...

nginx がどのようにして高いパフォーマンスとスケーラビリティを実現するのかを深く理解する

NGINX の全体的なアーキテクチャは、連携して動作する一連のプロセスによって特徴付けられます。メイ...

初心者でもjsのtypeofとinstanceofの違いを理解できます

目次1. 型2. インスタンス3. 違い1. 型typeof 演算子は、評価されていないオペランドの...

CSS で隠し要素を実現する 7 つの興味深い方法

序文非表示要素の 3 つの属性である表示、可視性、不透明度の類似点と相違点は、フロントエンドの就職面...

Linux環境で環境変数を設定する方法

JDKダウンロードアドレス: http://www.oracle.com/technetwork/j...

MySQLでTEXT/BLOB型を使用する際の注意点を詳しく説明します

1. TEXTとBLOBの違いTEXT ファミリと BLOB ファミリの唯一の違いは、BLOB 型は...

MySQL サービス 1067 エラーの解決策: mysql 実行可能ファイルのパスを変更する

今日、MySQLサービス1067エラー問題に遭遇しました。システムアカウントを使用するように設定して...

jsの継承の6つの方法を詳しく解説

プロトタイプチェーン継承プロトタイプ継承は、ECMAScript における主な継承方法です。基本的な...

Ubuntu サーバーで MySQL を設定し、リモート接続を実装する方法

サーバー: Ubuntu Server 16.04 LSSクライアント: Ubuntu 16.04 ...