MySQLデータベースのマスタースレーブレプリケーションの原理と機能の分析

MySQLデータベースのマスタースレーブレプリケーションの原理と機能の分析

1. データベースのマスター/スレーブ分類:

マスタースレーブには、従来のマスタースレーブ/GTIDマスタースレーブの2種類があります。

2. MySQLマスタースレーブ導入の起源

現実世界では、データは極めて重要です。データベースを保存する方法はたくさんありますが、データベースには隠れた危険が潜んでいます。
隠れた危険:

データベースを使用してデータを保存する場合、データベースサーバーがクラッシュするとデータが失われます。データが多すぎてアクセス数が多い場合は、1 つのサーバーではサービスの品質を保証できません。

そこで、マスタースレーブデータベースが誕生した。

3. マスタースレーブ機能

フェイルオーバー、読み取りと書き込みの分離を実現、クエリサービスデータベース管理システムバックアップ(DBSM)を提供、ビジネスへの影響を回避

4. マスタースレーブ複製の原理

bin ログ: バイナリ ログ。書き込み操作 (追加、削除、変更、クエリ) を記録します。

リレーログ: リレーログ

  1. マスター データベースは、すべての書き込み操作を binlog ログに記録してログ ダンプ スレッドを生成し、binlog ログをスレーブ データベースの I/O スレッドに渡します。
  2. スレーブ ライブラリには 2 つのスレッドがあります。
    I/O スレッド
    SQL スレッド
  3. スレーブ ライブラリの I/O スレッドは、マスター ライブラリに binlog ログを取得してリレー ログに書き込むように要求します。
  4. SQLスレッドはリレーログファイル内のログを読み取り、特定の操作を解析してマスターとスレーブと同じ操作を実行し、データの一貫性を実現します。

5. マスタースレーブレプリケーション構成(データが整合している場合)

ステップ:

  • マスターデータベースのデータがスレーブデータベースのデータと同じであることを確認します。
  • マスターデータベースに同期アカウントを作成し、スレーブデータベースでの使用を許可します。
  • マスターデータベースを構成する(構成ファイルを変更する)
  • スレーブデータベースを構成する(構成ファイルを変更する)

環境要件:

2 つの MySQL サーバー、1 つのマスター サーバー (書き込み機能) と 1 つのスレーブ サーバー (読み取り機能)

メインデータベース(centos8) IPアドレス:192.168.136.145 centos8.0/mysql5.7 同じデータ
セクション 6: データは同じではありません (会社が以前にデータを持っている可能性があります)
データベース(centos8)のIPアドレス:192.168.136.191 centos7.0/mysql5.7 同じデータ

5.1 マスターサーバーとスレーブサーバーにそれぞれmysql5.7をインストールする

関連するチュートリアルチュートリアル(非常に詳細)をご覧いただけます: https://www.jb51.net/article/221946.htm

#バイナリインストール: https://blog.csdn.net/qq_47945825/article/details/116848970?spm=1001.2014.3001.5501
#またはネットワークリポジトリからインストールします: (通常はバイナリインストール)
https://blog.csdn.net/qq_47945825/article/details/116245442?spm=1001.2014.3001.5501

5.2 マスターデータベースのデータはスレーブデータベースのデータと一致している

[root@mysql01 ~]# mysql -uroot -e 'データベースを表示;'
+--------------------+
| データベース |
+--------------------+
| 情報スキーマ |
|mysql |
| パフォーマンススキーマ |
|システム|
+--------------------+
[root@mysql02 ~]# mysql -uroot -e 'データベースを表示;'
+--------------------+
| データベース |
+--------------------+
| 情報スキーマ |
|mysql |
| パフォーマンススキーマ |
|システム|
+--------------------+

5.3 マスターデータベースに同期アカウントを作成し、スレーブデータベースでの使用を許可する

レプリケーション: レプリケーションスレーブ: 192.168.136.191 から: データベース IP アドレスから

mysql> 'vvv'@'192.168.136.191' を作成し、'vvv0917' で識別します。
クエリは正常、影響を受けた行は 0 行 (0.00 秒)
mysql> *.* のレプリケーションスレーブを 'vvv'@'192.168.136.191' に付与します。
クエリは正常、影響を受けた行は 0 行 (0.00 秒)
mysql> 権限をフラッシュします。
クエリは正常、影響を受けた行は 0 行 (0.00 秒)

5.4 スレーブでの接続をテストする

[root@mysql02 ~]# mysql -uvvv -vvv0917 -h192.168.136.145
mysql> データベースを表示します。
+--------------------+
| データベース |
+--------------------+
| 情報スキーマ |
+--------------------+
セット内の 1 行 (0.00 秒)

5.5 マスターデータベースを構成する

[root@mysql01 ~]# cat /etc/my.cnf 
[mysqld]
ベースディレクトリ = /usr/local/mysql
データディレクトリ = /opt/data
ソケット = /tmp/mysql.sock
ポート = 3306
pid ファイル = /opt/data/mysql.pid
ユーザー = mysql
名前解決をスキップ
log-bin=mysql_bin #binlog を開始 log server-id=10 #データベース サーバーの一意の識別子。ID はスレーブ データベースより小さくする必要があります #サービスを再起動します (この再起動方法では、mysqld.service ファイルが設定されている必要があります)
[root@mysql01 ~]# systemctl mysqldを再起動します
プライマリ データベースのステータスを確認します。
mysql> マスターステータスを表示します。
+------------------+----------+--------------+------------------+------------------+
| ファイル | 位置 | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+------------------+
| mysql_bin.000004 | 962 | | | |
+------------------+----------+--------------+------------------+---

5.6 スレーブデータベースを構成する

[root@mysql02 ~]# cat /etc/my.cnf
[mysqld]
ベースディレクトリ = /usr/local/mysql 
データディレクトリ = /opt/data 
ソケット = /tmp/mysql.sock 
ポート = 3307
ユーザー = mysql
pid ファイル = /opt/data/mysql.pid
名前解決をスキップ
#許可テーブルをスキップする 
server-id=20 #サーバーID、プライマリデータベースIDより大きい
relay-log=mysql_relay_log #リレーログを開始 #log-bin=mysql-bin 
#サービスを再起動します:
[root@mysql02 ~]# systemctl mysqldを再起動します

5.7 マスタースレーブレプリケーション機能の設定と起動(mysql02スレーブデータベース)

[root@slave02 ~]# mysql -uroot -p
mysql>マスターを次のように変更します
    -> マスターホスト='192.168.136.145',
    -> マスターユーザー='vvv',
    -> マスターパスワード = 'vvv0917',
    -> マスターログファイル='mysql_bin.000004'、
    -> マスターログ位置 = 962;
クエリは正常、影響を受けた行は 0 行、警告は 2 件 (0.01 秒)
mysql> start slave; #stop slave を実行してシャットダウンします クエリは正常です。0 行が影響を受けました (0.01 秒)
#構成ステータスを表示します。
mysql> スレーブステータスを表示します\G; 
   Slave_IO_State: マスターがイベントを送信するのを待機中
                  マスターホスト: 192.168.136.145
                  マスターユーザー: vvv
                  マスターポート: 3306
                接続再試行: 60
              マスターログファイル: mysql_bin.000004
          読み取りマスターログ位置: 962
               リレーログファイル: mysql_relay_log.000002
                リレーログ位置: 320
        リレーマスターログファイル: mysql_bin.000004
             スレーブIO実行中: はい
            スレーブSQL実行中: はい
            #ここでは両方ともyesである必要があります。これは構成が成功したことを意味し、そうでない場合は失敗します

5.8 テスト:

メインライブラリ:

mysql> データベースを表示します。
+--------------------+
| データベース |
+--------------------+
| 情報スキーマ |
|mysql |
| パフォーマンススキーマ |
|システム|
+--------------------+

ライブラリから:

mysql> データベースを表示します。
+--------------------+
| データベース |
+--------------------+
| 情報スキーマ |
|mysql |
| パフォーマンススキーマ |
|システム|
+--------------------+


メインライブラリはデータベース clq を作成し、データを追加します。

mysql> データベース clq を作成します。
クエリは正常、1 行が影響を受けました (0.00 秒)
mysql> テーブル clq01(id int(11)not null primary key auto_increment,name varchar(100)not null,age tinyint(4)); を作成します。 
mysql> clq01(名前、年齢) の値 ('A'、20)、('B'、21)、('C'、22) を挿入します。
クエリは正常、3 行が影響を受けました (0.00 秒)

ギャラリーからの眺め:

mysql> clq01 から * を選択します。
+----+------+------+s
| ID | 名前 | 年齢 |
+----+------+------s+
| 1 | A | 20 |
| 2 | B | 21 |
| 3 | C | 22 |
+----+------+------+
                              #マスタースレーブレプリケーションが完了しました!


6. マスタースレーブ構成(データが不一致の場合)

6.1 一般的に、完全にバックアップされたマスターデータベースでは、データベースに読み取りロックを追加するために別のターミナルを開く必要があります(読み取り専用、書き込み不可)

他の人がデータを書き込むことで生じる差異を回避する

読み取りロック付きのテーブルをフラッシュする:
quit: 終了してロックを解除します (バックアップ完了後にロックを解除します)

6.2 マスターデータベースのデータがスレーブデータベースのデータと同じであることを確認する

#まずメインデータベースを準備します [root@mysql01 ~]# mysqldump -uroot -A > all-databases.sql 
#スレーブデータベースにデータをコピーします [root@mysql01 ~]# ls /clq
すべてのデータベース.sql
[root@mysql01 ~]# scp /clq/all-databases.sql [email protected]:/clq/
ホスト「192.168.136.193 (192.168.136.193)」の信頼性を確立できません。
ECDSA キーのフィンガープリントは SHA256:XIAQEoJ+M0vOHmCwQvhUdw12u5s2nvkN0A4TMKLaFiY です。
本当に接続を続行しますか (はい/いいえ/[指紋])はい
[email protected]のパスワード: 
すべてのデータベース.sql 100% 853KB 115.4MB/秒 00:00  
[root@mysql02 clq]# ll
合計使用量 896 #データベースから表示 -rw-r--r--。 1 ルート ルート 873266 5月17日 19:36 all-databases.sql

6.3 一貫性を保つために、スレーブライブラリ上のマスターライブラリにあるライブラリを確認する

[root@mysql02 clq]# mysql -uroot -pHuawei0917@ < all-databases.sql 
mysql: [警告] コマンドライン インターフェイスでパスワードを使用すると安全でない可能性があります。
[root@mysql02 clq]# mysql -uroot -pHuawei0917@ -e 'データベースを表示;'
mysql: [警告] コマンドライン インターフェイスでパスワードを使用すると安全でない可能性があります。
+--------------------+
| データベース |
+--------------------+
| 情報スキーマ |
| クリック |
|mysql |
| パフォーマンススキーマ |
|システム|
+--------------------+
メインライブラリ:
mysql> データベースを表示します。
+--------------------+
| データベース |
+--------------------+
| 情報スキーマ |
| クリック |
|mysql |
| パフォーマンススキーマ |
|システム|
+--------------------+


6.4 2つのライブラリの設定ファイルが対応するファイルで設定されていることを確認する

[root@mysql01 ~]# cat /etc/my.cnf 
[mysqld]
ベースディレクトリ = /usr/local/mysql
データディレクトリ = /opt/data
ソケット = /tmp/mysql.sock
ポート = 3306
pid ファイル = /opt/data/mysql.pid
ユーザー = mysql
名前解決をスキップ
log-bin=mysql_bin #ログファイル server-id=10 #サービスIDの一意の識別子
[root@mysql02 ~]# cat /etc/my.cnf
[mysqld]
ベースディレクトリ = /usr/local/mysql 
データディレクトリ = /opt/data 
ソケット = /tmp/mysql.sock 
ポート = 3307
ユーザー = mysql
pid ファイル = /opt/data/mysql.pid
名前解決をスキップ
#許可テーブルをスキップする 
server-id=20 #サービスIDを一意に識別します(メインデータベースより大きい)
relay-log=mysql_relay_log #リレーログ#log-bin=mysql-bin 


この後の手順は 5.5 以降とまったく同じです。

まとめ:

マスター データベースがデータを変更すると、スレーブ データベースのデータもそれに応じて変更されます。
逆に、スレーブ データベースのデータが変更されても、マスター データベースのデータは変更されません。

データベースで実行されているコマンドプロセスを表示する

mysql> プロセスリストを表示します。
+----+------+------------------------+------+------------+------+---------------------------------------------------------------+------------------+
| ID | ユーザー | ホスト | db | コマンド | 時間 | 状態 | 情報 |
+----+------+------------------------+------+------------+------+---------------------------------------------------------------+------------------+
| 5 | repl | 192.168.136.219:39788 | NULL | バイナリログダンプ | 1575 | マスターはすべてのバイナリログをスレーブに送信しました。さらに更新を待機しています | NULL |
| 7 | root | localhost | NULL | クエリ | 0 | 開始 | プロセスリストを表示 |
+----+------+------------------------+------+------------+------+---------------------------------------------------------------+------------------+
セット内の 2 行 (0.00 秒)

上記は、MySQL データベースのマスタースレーブレプリケーションの原理と機能の詳細な分析です。MySQL データベースのマスタースレーブレプリケーションの詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • MySQL マスタースレーブレプリケーションの実装手順
  • MySQL マスタースレーブ同期の原理と応用
  • mysql5.6 マスタースレーブ設定と非同期の問題の詳細な説明

<<:  Vue ブラウザログアウトの実装例

>>:  docker compose を使用して FastDfs ファイル サーバーをインストールする詳細な例

推薦する

Vueは、センシティブな単語フィルタリングコンポーネントを検出するためのさまざまなアイデアを実装しています。

目次前面に書かれた要件分析 v1アイデア1: インターセプションメソッドを使用して入力ボックスの入力...

js 属性オブジェクトの hasOwnProperty メソッドの使用

オブジェクトの hasOwnProperty() メソッドは、オブジェクトに特定の独自の (継承され...

CSS の子要素の Z インデックスと親要素の兄弟ノードの階層問題を解決する

1. 問題の出現フラット リストを作成しました。リストの一部には、マウスをホバーすると表示されるポッ...

MySQL 5.6 圧縮パッケージのインストール方法

MySQL には、msi インストールと zip 解凍の 2 つのインストール方法があります。 zi...

Linux ファイル/ディレクトリの権限と所有権の管理

1. ファイルの権限と所有権の概要1. アクセス権Read r: ファイルの内容を表示し、ディレクト...

ブラウザ(IEシリーズ)を判別するための条件付きコメント

<!--[if IE 6]> IE6 のみが認識可能 <![endif]-->...

Vue.js ドロップダウン コンポーネント付きテキストボックス

ドロップダウン付きのテキストボックスを使用すると、ユーザーはドロップダウン リストから入力を選択した...

Linux プロセスが占有するポート番号を表示する 6 つの方法

Linux システム管理者にとって、サービスがポートに正しくバインドされているか、またはポートをリッ...

JS の 6 つの継承方法とその長所と短所

目次序文プロトタイプチェーン継承コンストラクタの継承組み合わせ継承(プロトタイプチェーン継承とコンス...

nginx/apache 静的リソースのクロスドメインアクセスの問題を解決する詳細な説明

1. Apache 静的リソースのクロスドメイン アクセスApache設定ファイルhttpd.con...

CocosCreatorオブジェクトプールの使い方

目次序文:特定の操作ステップ1: プレハブを準備するステップ2: オブジェクトプールを初期化するステ...

シンプルなウェブ計算機を実装するJavaScript

背景私は新しいプロジェクト チームに配属されたので、プロジェクトでは js を使用する必要があります...

HTMLでvueとel​​ement-uiを直接参照する方法

コードは次のようになります。 <!DOCTYPE html> <html> ...

Office ファイルのオンライン プレビュー用の Vue サンプル コード

最近、電子アーカイブに取り組んでおり、バックエンドではファイルの Huawei Cloud OSS ...

JSはBaidu Newsナビゲーションバーの効果を実現

この記事では、Baidu News Navigation Barの効果を実現するための具体的なJSコ...