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 はアニメーション属性を使用してクールな効果を実現します (推奨)

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

推薦する

MySQL 分離レベル操作プロセスの詳細説明 (cmd)

コミットされていない読み取りの例の操作プロセス - コミットされていない読み取り1. 2 つの My...

完全なMySQL学習ノート

目次MyISAM と InnoDBパフォーマンスの低下と SQL の速度低下の理由: MySQL 実...

TypeScript 学習ノート: 型の絞り込み

目次序文型推論真理値の絞り込み平等の縮小演算子の絞り込みインスタンスの絞り込み狭まりの本質ユニオン型...

JavaプログラミングでJavaScriptの超実用的なテーブルプラグインを書く

目次効果ドキュメント最初のステップステップ2ステップ3ソースコード効果ドキュメント最初のステップta...

Linuxにログインする際の文字セットの問題を解決する方法

文字セットエラーは常に存在するロケール: LC_CTYPE をデフォルト ロケールに設定できません:...

HTML でフレームセット タグを使用するチュートリアル

フレームセット ページは通常の Web ページとは多少異なります。依然として <HTML>...

Windows 10 Home EditionにDockerをインストールする方法を教えます

Redisの本やSpring Cloud Alibabaの本を執筆した際に、一部の分散コンポーネント...

Vueはユーザーログインとトークン検証を実装します

フロントエンドとバックエンドを完全に分離する場合、Vue プロジェクトでトークン検証を実装する一般的...

SQL実装 LeetCode (176. 2番目に高い給与)

[LeetCode] 176. 2番目に高い給与従業員テーブルから 2 番目に高い給与を取得する ...

Docker Composeを使用してDOCleverをインストールする詳細なプロセスを説明します

目次1. Docker Composeとは何か、インストールして使用する方法2. DOCleverと...

VMware IOInsight を使用して、仮想マシンのストレージ パフォーマンスの監視を改良する

例: VMware IOInsight は、VM のストレージ I/O 動作を理解するのに役立つツー...

MySQL で SQL 文の実行時間を表示する方法

目次1. 初期SQLの準備2.MysqlはSQL文の実行時間をチェックします3. さまざまなクエリの...

rpm を使用して指定されたバージョンの docker (1.12.6) をインストールする詳細な手順

1. 理由システムが Centos7.3 の場合、yum install docker を使用して直...

Ubuntuの基本設定: openssh-serverのインストールと使用

Ubuntu 17.10 での openssh-server のインストールと使用を記録します。イン...

IE6のmin-widthとmin-heightと互換性を持たせる簡単な方法

ウェブサイトがワイドスクリーンの場合、ブラウザ ウィンドウを左右にドラッグすると、ウェブサイトの幅が...