Mysqlはマスタースレーブ構成とマルチマスターマルチスレーブ構成を実装します

Mysqlはマスタースレーブ構成とマルチマスターマルチスレーブ構成を実装します

現在シミュレーションしているのは、マスター スレーブ システム (ホスト 1 台とスレーブ 1 台) です。マスター スレーブ同期の原理は、bin-log バイナリ ファイルを同期し、このファイルの内容をホストからスレーブに同期することです。

1. 設定ファイルの変更

1. ホスト構成ファイルを変更する

まず、mysql ホスト (192.168.254.130) の /etc/my.cnf 構成ファイルが必要になり、次の構成を追加します。

#ホストの固有ID
サーバーID=1
#バイナリログ log-bin=mysql-bin
#同期する必要のないデータベース binlog-ignore-db=mysql
binlog-ignore-db=情報スキーマ
#同期データベース名 binlog-do-db=mycat
#バイナリ形式 binlog_format=ステートメント

my.cnfファイル全体を見てみましょう

[root@localhost デスクトップ]# cat /etc/my.cnf
[mysqld]
データディレクトリ=/usr/local/mysql/data
ベースディレクトリ=/usr/local/mysql
ソケット=/usr/local/mysql/data/mysql.sock
ユーザー=mysql
# さまざまなセキュリティリスクを防ぐために、シンボリックリンクを無効にすることをお勧めします
シンボリックリンク=0

サーバーID=1
ログ bin = mysql bin
binlog-ignore-db=mysql
binlog-ignore-db=情報スキーマ
binlog-do-db=mycat
binlog_format=ステートメント


[mysqld_safe]
ログエラー=/usr/local/mysql/data/mysqld.log
pid ファイル = /usr/local/mysql/data/mysqld/mysqld.pid
[root@localhost デスクトップ]#

ホストの構成ファイルを変更した後、次のコマンドを使用してサービスを再起動する必要があります。

[root@localhost サポートファイル]# ls
マジック mysqld_multi.server mysql-log-rotate mysql.server
[root@localhost サポートファイル]# pwd
/usr/local/mysql/サポートファイル
[root@localhost サポートファイル]# ./mysql.server を再起動します

次に、スレーブ マシン (192.168.254.131) の構成ファイルを変更します。

2. スレーブ構成

スレーブの設定変更は比較的簡単です。

#スレーブマシンの固有ID
サーバーID=2
#リレーログ relay-log=mysql-relay

設定を変更した後、スレーブを再起動します

2. MySQLクライアントコマンド操作

次に、次のコマンドを使用して、mysql コマンドラインに接続できます。

[root@localhost bin]# 
[root@localhost bin]# pwd
ローカル
[root@localhost bin]# ./mysql -uroot -p

1. ホスト操作

1) 同期ユーザーを作成する

まず、次のコマンドを実行して、ホスト上でマスターとスレーブの同期専用のユーザーを作成します。

*.* 上のレプリケーション スレーブを '123456' によって識別される 'SLAVE'@'%' に付与します。

2) 同期されたファイルのステータスを確認する

次に、show master status; を使用して、ホストの同期ステータスを表示します。

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

2. スレーブ操作

1) スレーブホストを設定する

次のコマンドを実行して、ホストとの同期を確立するために必要な情報を設定します。

マスターをMASTER_HOST='192.168.254.130'に変更します。
MASTER_USER='スレーブ'、
マスターパスワード = '123456'、
MASTER_LOG_FILE='mysql-bin.000001',
マスターログPOS = 430;

ここでホスト構成が設定されていることを通知するメッセージが表示された場合、stop slave&reset master によってリセットできます。

2) 同期を開始する

次に、スレーブを起動して同期を開始します。

以下が見られます:

mysql>スレーブステータスを表示\G
************************** 1. 行 ****************************
               Slave_IO_State: マスターがイベントを送信するのを待機中
                  マスターホスト: 192.168.254.130
                  マスターユーザー: スレーブ
                  マスターポート: 3306
                接続再試行: 60
              マスターログファイル:mysql-bin.000001
          読み取りマスターログ位置: 592
               リレーログファイル:mysql-relay.000002
                リレーログ位置: 482
        リレーマスターログファイル: mysql-bin.000001
             スレーブIO実行中: はい
            スレーブSQL実行中: はい
              レプリケート_Do_DB: 
          レプリケート_無視_DB: 
           テーブルの複製: 
       無視テーブルを複製: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   最終エラー番号: 0
                   最終エラー: 
                 スキップカウンタ: 0
          実行マスターログポジション: 592
              リレーログスペース: 685
              Until_Condition: なし
               ログファイルまで: 
                ログ位置まで: 0
           マスターSSL許可: いいえ
           マスターSSLCAファイル: 
           マスターSSLCAパス: 
              マスターSSL証明書: 
            マスターSSL暗号: 
               マスターSSLキー: 
        マスターより遅れている秒数: 0
Master_SSL_Verify_Server_Cert: いいえ
                最終IOエラー番号: 0
                最後のIOエラー: 
               最終SQLエラー番号: 0
               最後のSQLエラー: 
  Replicate_Ignore_Server_Ids: 
             マスターサーバーID: 1
                  マスター_UUID: 74397a99-accf-11eb-ae0d-000c2912d302
             マスター情報ファイル: /usr/local/mysql/data/master.info
                    SQL_遅延: 0
          SQL_残り遅延: NULL
      Slave_SQL_Running_State: スレーブはすべてのリレーログを読み取りました。さらに更新を待機しています。
           マスター再試行回数: 86400
                  マスターバインド: 
      最終IOエラータイムスタンプ: 
     最終SQLエラータイムスタンプ: 
               マスターSSL証明書: 
           マスターSSLCrlパス: 
           取得済み_Gtid_Set: 
            実行されたGtidセット: 
                自動位置: 0
         Replicate_Rewrite_DB: 
                 チャンネル名: 
           マスター TLS バージョン: 
セット内の 1 行 (0.00 秒)

マイSQL>

ここで、Slave_IO_Running と Slave_SQL_Running が両方とも YES であることがわかります。これは、成功を意味します。次の場合:

************************** 1. 行 ****************************
               Slave_IO_State: マスターに接続中
                  マスターホスト: 192.168.254.130
                  マスターユーザー: スレーブ
                  マスターポート: 3306
                接続再試行: 60
              マスターログファイル:mysql-bin.000001
          読み取りマスターログ位置: 430
               リレーログファイル:mysql-relay.000001
                リレーログ位置: 4
        リレーマスターログファイル: mysql-bin.000001
             Slave_IO_Running: 接続中
            スレーブSQL実行中: はい
              レプリケート_Do_DB: 
          レプリケート_無視_DB: 
           テーブルの複製: 
       無視テーブルを複製: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   最終エラー番号: 0
                   最終エラー: 
                 スキップカウンタ: 0
          実行マスターログ位置: 430
              リレーログスペース: 154
              Until_Condition: なし
               ログファイルまで: 
                ログ位置まで: 0
           マスターSSL許可: いいえ
           マスターSSLCAファイル: 
           マスターSSLCAパス: 
              マスターSSL証明書: 
            マスターSSL暗号: 
               マスターSSLキー: 
        マスターより遅れている秒数: NULL
Master_SSL_Verify_Server_Cert: いいえ
                最終IOエラー番号: 1045
                Last_IO_Error: マスター '[email protected]:3306' への接続エラー - 再試行時間: 60 再試行: 1
               最終SQLエラー番号: 0
               最後のSQLエラー: 
  Replicate_Ignore_Server_Ids: 
             マスターサーバー ID: 0
                  マスターUUID: 
             マスター情報ファイル: /usr/local/mysql/data/master.info
                    SQL_遅延: 0
          SQL_残り遅延: NULL
      Slave_SQL_Running_State: スレーブはすべてのリレーログを読み取りました。さらに更新を待機しています。
           マスター再試行回数: 86400
                  マスターバインド: 
      最終IOエラータイムスタンプ: 210505 00:18:08
     最終SQLエラータイムスタンプ: 
               マスターSSL証明書: 
           マスターSSLCrlパス: 
           取得済み_Gtid_Set: 
            実行されたGtidセット: 
                自動位置: 0
         Replicate_Rewrite_DB: 
                 チャンネル名: 
           マスター TLS バージョン: 
セット内の 1 行 (0.00 秒)

ここで Last_IO_Error にエラーがあることがわかりますので、ログに何が報告されているか確認してみましょう。現在、私の問題は、同期ユーザーがエラーのため同期できないことです。前述のように、まず同期を​​停止してリセットし、同期コマンドを修正してから再度操作してください。

3. マスタースレーブ同期テスト

1. ホスト作成ライブラリ

まず、ホスト上で同期するために先ほど設定したデータベース mycat を作成します。

mysql> データベース mycat を作成します。
クエリは正常、1 行が影響を受けました (0.00 秒)

mysql> mycat を使用します。
データベースが変更されました
mysql> データベースを表示します。
+--------------------+
| データベース |
+--------------------+
| 情報スキーマ |
| マイキャット |
|mysql |
| パフォーマンススキーマ |
|システム|
+--------------------+
セット内の行数は 5 です (0.00 秒)

マイSQL>

2. マシンからライブラリを表示する

すると、スレーブマシン上でこのライブラリを見ることができます

mysql> データベースを表示します。
+--------------------+
| データベース |
+--------------------+
| 情報スキーマ |
| マイキャット |
|mysql |
| パフォーマンススキーマ |
|システム|
+--------------------+
セット内の行数は 5 です (0.00 秒)

3. テーブルデータの初期化

次にテーブルデータをテストします

1) ホストまず、ホスト上にテーブルを作成し、データを挿入します

mysql> mycat を使用します。
データベースが変更されました
マイSQL> 
mysql> テーブル `test1`( を作成します。
    -> id int auto_increment not null 主キー、
    -> 名前 varchar(10) デフォルト null
    -> );
クエリは正常、影響を受けた行は 0 行 (0.03 秒)

mysql> test1(`id`,`name`) に値(1,"petty") を挿入します。
クエリは正常、1 行が影響を受けました (0.16 秒)

mysql> test1 から * を選択します。
+----+-------+
| ID | 名前 |
+----+-------+
| 1 | ささいな |
+----+-------+
セット内の 1 行 (0.00 秒)

マイSQL>

2) 次に、スレーブが正常に同期されているかどうかを確認します。

mysql> mycat を使用します。
テーブル名と列名の補完のためのテーブル情報の読み取り
-Aでこの機能をオフにすると起動が速くなります。

データベースが変更されました
mysql> テーブルを表示します。
+-----------------+
| テーブル_in_mycat |
+-----------------+
| テスト1 |
+-----------------+
セット内の 1 行 (0.00 秒)

mysql> test1 から * を選択します。
+----+-------+
| ID | 名前 |
+----+-------+
| 1 | ささいな |
+----+-------+
セット内の 1 行 (0.00 秒)

マイSQL> 

マスター/スレーブ構成が成功したことがわかります。

4. 複数のマスターと複数のスレーブ

複数のマスターと複数のスレーブを持つこともできます。たとえば、マスターとスレーブの順序は、1 番がマスター、2 番がスレーブ、3 番がマスター、4 番がスレーブです。同時に、ホスト 1 とホスト 3 は、お互いにマスターとスレーブです。このようにして、ホストの 1 つに問題があっても、MySQL クラスター全体は正常に動作します。

​ 現在マシンは 3 台しかないため、デモの作成には 3 台のみが使用されます (Windows が 1 台、Linux が 2 台)。

1. ホスト番号1 (192.168.254.30)

1) 設定を変更するには、まず元の etc/my.cnf ファイルを変更して以下を追加する必要があります。

# スレーブとして、bin-log log log-slave-updatesも変更します
#自動増分増加=2
#自己増分の開始位置 auto-increment-offset=1

ファイル全体に関する情報

[root@localhost デスクトップ]# cat /etc/my.cnf
[mysqld]
データディレクトリ=/usr/local/mysql/data
ベースディレクトリ=/usr/local/mysql
ソケット=/usr/local/mysql/data/mysql.sock
ユーザー=mysql
# さまざまなセキュリティリスクを防ぐために、シンボリックリンクを無効にすることをお勧めします
シンボリックリンク=0

サーバーID=1
ログ bin = mysql bin
binlog-ignore-db=mysql
binlog-ignore-db=情報スキーマ
binlog-do-db=mycat
binlog_format=ステートメント

ログスレーブ更新
自動増分増分=2
自動増分オフセット=1

[mysqld_safe]
ログエラー=/usr/local/mysql/data/mysqld.log
pid ファイル = /usr/local/mysql/data/mysqld/mysqld.pid
[root@localhost デスクトップ]# 

このファイルを変更した後はマシンを再起動する必要があります

2. スレーブ2号(192.168.254.31)

このマシンはすでに30台のマシンに接続するように構成されているため、今回は変更する必要はありません。

3. ホスト番号3(192.168.254.1)

1) 設定ファイルを変更します。このマシンはWindowsなので、my.iniファイルを変更して、

サーバーID=3
ログ bin = mysql bin
binlog-ignore-db=mysql
binlog-ignore-db=情報スキーマ
binlog-do-db=mycat
binlog_format=ステートメント

ログスレーブ更新
自動増分増分=2
自動増分オフセット=2

上記の server-id を変更し、その増加開始点 auto-increment-offset=2 も変更したことに注意してください。同時にサービスを再起動します。

2) 同期ユーザーを作成する まず、次のコマンドを実行して、ホスト上でマスター/スレーブ同期専用のユーザーを作成します。

 *.* 上のレプリケーション スレーブを '123456' によって識別される 'SLAVE'@'%' に付与します。

3) ステータスを確認する

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

マイSQL>

4) 同期ステータスを設定する

次に、接続先のホスト(30)情報を実行します。

マスターをMASTER_HOST='192.168.254.130'に変更します。
MASTER_USER='スレーブ'、
マスターパスワード = '123456'、
MASTER_LOG_FILE='mysql-bin.000001',
マスターログPOS = 430;

5) ホストNo.1同期(192.168.254.30)
先ほど確認したホスト番号 3 のマスター ステータスであるホスト番号 3 (192.168.254.1) と同期するように設定する必要があります。

マスターをMASTER_HOST='192.168.254.1'に変更します。
MASTER_USER='スレーブ'、
マスターパスワード = '123456'、
MASTER_LOG_FILE='mysql-bin.000001',
マスターログPOS = 154;

次に、ホスト番号 1 で synchronized start slave; を実行し、ホスト番号 3 で synchronized start slave; を実行します。

4. テストして表示する

1) 起こりうる問題(スキップ可能)

ここで、2 台のマシンのマスター ステータスを個別にテストして確認します: show master status;。

mysql>スレーブステータスを表示\G
************************** 1. 行 ****************************
               Slave_IO_State: マスターがイベントを送信するのを待機中
                  マスターホスト: 192.168.254.1
                  マスターユーザー: スレーブ
                  マスターポート: 3306
                接続再試行: 60
              マスターログファイル:mysql-bin.000001
          読み取りマスターログ位置: 154
               リレーログファイル: localhost-relay-bin.000002
                リレーログ位置: 320
        リレーマスターログファイル: mysql-bin.000001
             スレーブIO実行中: はい
            スレーブSQL実行中: はい
........
mysql>スレーブステータスを表示\G
************************** 1. 行 ****************************
               Slave_IO_State: マスターがイベントを送信するのを待機中
                  マスターホスト: 192.168.254.130
                  マスターユーザー: スレーブ
                  マスターポート: 3306
                接続再試行: 60
              マスターログファイル:mysql-bin.000002
          読み取りマスターログ位置: 462
               リレー ログ ファイル: LAPTOP-QR83QEC0-relay-bin.000003
                リレーログ位置: 675
        リレーマスターログファイル: mysql-bin.000002
             スレーブIO実行中: はい
            スレーブSQL実行中: はい
              レプリケート_Do_DB:
.........

同期が「はい」であることがわかります。ここで問題が発生している可能性があり、それを自分で解決する必要があります。たとえば、マシン番号 1 の設定を変更して、そのステータスを確認します。

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

マイSQL> 

このメッセージを使用してマシンNo.3をマシンNo.1と同期させると、(新しい挿入ステートメントを実行したため)レポートされますが、テーブル作成ステートメントはログmysql-bin.000001にあり、ここで再起動し、新しいmysql-bin.000002があるため、元のNo.2の同期情報が変更されています。

mysql>スレーブステータスを表示\G
************************** 1. 行 ****************************
               Slave_IO_State: マスターがイベントを送信するのを待機中
                  マスターホスト: 192.168.254.130
                  マスターユーザー: スレーブ
                  マスターポート: 3306
                接続再試行: 60
              マスターログファイル:mysql-bin.000002
          読み取りマスターログ位置: 462
               リレー ログ ファイル: LAPTOP-QR83QEC0-relay-bin.000002
                リレーログ位置: 320
        リレーマスターログファイル: mysql-bin.000002
             スレーブIO実行中: はい
            スレーブSQL実行中: いいえ
              レプリケート_Do_DB:
          レプリケート_無視_DB:
           テーブルの複製:
       無視テーブルを複製:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   最終エラー番号: 1146
                   Last_Error: クエリでエラー「テーブル 'mycat.test1' が存在しません」が発生しました。デフォルトのデータベース: 'mycat'。クエリ: 'insert into test1(`id`,`name`) value(2,"TOm")'

2) 3 番にデータを挿入します。1 番と 2 番が表示されるかどうか確認するために、3 番にもう一度データを挿入してみましょう。

操作番号3:

mysql> test1(`id`,`name`) に値(3,"kitt") を挿入します。
クエリは正常、1 行が影響を受けました (0.01 秒)

mysql> test1 から * を選択します。
+----+-------+
| ID | 名前 |
+----+-------+
| 1 | ささいな |
| 2 | トム |
| 3 | キット |
+----+-------+
セット内の 3 行 (0.00 秒)

マイSQL>

1位を見る

mysql> test1 から * を選択します。
+----+-------+
| ID | 名前 |
+----+-------+
| 1 | ささいな |
| 2 | トム |
| 3 | キット |
+----+-------+
セット内の 3 行 (0.00 秒)

マイSQL> 

2番の眺め

mysql> test1 から * を選択します。
+----+-------+
| ID | 名前 |
+----+-------+
| 1 | ささいな |
| 2 | トム |
| 3 | キット |
+----+-------+
セット内の 3 行 (0.00 秒)

マイSQL> 

正常に同期が取れており、ホスト番号 3 の挿入情報が番号 1 に表示されていることがわかります。

3) 番号1でデータを処理する

次に、1番の操作を確認します

1位:

mysql> test1(`id`,`name`) に値(4,"lisa") を挿入します。
クエリは正常、1 行が影響を受けました (0.00 秒)

mysql> test1 から * を選択します。
+----+-------+
| ID | 名前 |
+----+-------+
| 1 | ささいな |
| 2 | トム |
| 3 | キット |
| 4 | リサ |
+----+-------+
セット内の 4 行 (0.00 秒)

マイSQL> 

3番目:

mysql> test1 から * を選択します。
+----+-------+
| ID | 名前 |
+----+-------+
| 1 | ささいな |
| 2 | トム |
| 3 | キット |
| 4 | リサ |
+----+-------+
セット内の 4 行 (0.00 秒)

マイSQL>

互いに同期していることがわかります。

これで、MySQL マスタースレーブ構成とマルチマスターマルチスレーブ構成に関するこの記事は終了です。MySQL マスタースレーブ構成とマルチマスターマルチスレーブ構成の詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQL8.0.18 複数マスターと 1 スレーブの構成
  • MySQL マルチマスター双方向およびカスケードレプリケーション

<<:  CSS3 はアニメーション属性を使用してクールな効果を実現します (推奨)

>>:  ホームページのデザインはウェブデザイナーのレベルを最もよく反映する

推薦する

vueはEle.me UIを使用してteambitionのフィルタリング機能を模倣します

目次問題の説明一般的な機能効果は次のとおりです。思考分析完全なコード要約する問題の説明Teambit...

MySQL に接続する際に Navicat for MySQL が 2005 エラーを報告する問題を解決する

前回の記事では、Navicat for Mysql 接続エラー 1251 (接続失敗) の問題を解決...

nginx+uwsgi で Django プロジェクトを開始するための詳細な手順

Django で Web プロジェクトを開発する場合、開発およびテストのプロセスでは Django ...

JavaScriptの基礎を学ぶ

目次1. JavaScriptを記述する場所2. JavaScriptでよく使われる入力文と出力文1...

Zabbix を使用して Nginx/Tomcat/MySQL を監視する方法の詳細なチュートリアル

目次ZabbixはNginxを監視するZabbixはTomcatを監視するZabbixはMySQLを...

MySQLパラダイムの使用に関する詳細な説明

1. パラダイムこのパラダイムの英語名は Normal Form であり、1970 年代にリレーショ...

MySQLのあいまいクエリインデックスの失敗の問題を解決するいくつかの方法

% ワイルドカードを使用すると、インデックス失敗の問題が発生することがよくあります。ここでは、lik...

動的な色切り替えの実装コードをサポートするために、CSS で SVG 画像を参照します。

表示する svg 画像を追加すると、React はファイルが見つからないというメッセージを表示します...

Docker 経由で Redis 6.x クラスターをデプロイする方法

システム環境: Redis バージョン: 6.0.8 Docker バージョン: 19.03.12シ...

linuxdeployqt を使用して Ubuntu で Qt プログラムをパッケージ化する問題を解決する

いくつかの Qt インターフェース プログラムを作成しましたが、Qt 環境がインストールされていない...

NginxはIP経由の直接アクセスを禁止し、カスタム500ページにリダイレクトします

設定ファイルに直接 サーバー{ listen 80 default; # IPへの直接アクセスを禁止...

Docker+keepalived+nginx を使用してマスタースレーブホットスタンバイを実装する方法の例

序文単一障害点を解決するには、マスター/スレーブ ホット スタンバイ ソリューションを構成する必要が...

フォームデータを取得するための Node.js メソッドの 3 つの例

序文Nodejs はサーバーサイド言語です。開発中、登録やログインなどでは、判断のためにフォームを通...

MySQL はカスタムシーケンスを使用して row_number 関数を実装します (詳細な手順)

いくつかの記事を読んだ後、ようやく MySQL で row_number() ソートを実装する方法が...