MySQL のマスター/マスター レプリケーション構造は、マスター/スレーブ レプリケーション構造とは異なります。マスター/マスター レプリケーション構造では、どちらかのサーバー上のデータ インベントリの変更がもう一方のサーバーに同期されるため、2 つのサーバーは相互にマスター/スレーブとなり、外部にサービスを提供できます。
設定手順:
1. 設定ファイルを変更する
(1) サーバA(192.168.115.119)は以下のように設定されています(この設定は[mysqld]領域に記述する必要があります)
サーバーID=10
ログビン=マスタービン
ログスレーブ更新=true
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
binlog_format=ステートメント
自動インクリメントインクリメント = 2
自動インクリメントオフセット = 1
(2) サーバB(192.168.115.120)は以下のように設定します(この設定は[mysqld]領域に記述する必要があります)
サーバーID=20
ログビン=マスタービン
ログスレーブ更新=true
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
binlog_format=ステートメント
自動インクリメントインクリメント = 2
自動インクリメントオフセット = 2
注: この 2 つは、server-id と auto-increment-offset のみが異なります。
auto-increment-offset は、データベースの自動拡張の開始点を設定するために使用されます。両方のサーバーに自動拡張値 2 が設定されているため、2 つのサーバー間のデータ同期を避けるために、開始点は異なる必要があります。主キー競合が発生する場合
replicate-do-db は同期するデータベースを指定できます
また: auto-increment-increment の値は、構造全体のサーバーの総数に設定する必要があります。この場合、2 つのサーバーが使用されるため、値は 2 に設定されます。
(3) 両方のサーバーを再起動します
systemctl で mysqld を再起動します
2. ユーザーを相互に承認します (サーバー A 上のユーザーにサーバー B へのアクセスを許可するか、その逆を許可します)。
(1) サーバーA (192.168.115.119)
*.* のレプリケーション スレーブを「123.com」によって識別される「スレーブ」@「192.168.115.%」に許可します。
フラッシュ権限。
(2) サーバー B (192.168.115.120) 上
*.* のレプリケーション スレーブを「123.com」によって識別される「スレーブ」@「192.168.115.%」に許可します。
フラッシュ権限。
3. バイナリログ情報を相互に報告する
(1) サーバーA (192.168.115.119)
マスターステータスを表示します。
(2) サーバー B (192.168.115.120) 上
マスターステータスを表示します。
(3) サーバーA(192.168.115.119)のマスターを指定
マスターを master_host='192.168.115.120',master_user='slave',master_password='123.com',master_log_file='master-bin.000001',master_log_pos=612 に変更します。
(4) サーバーB(192.168.115.120)のマスターを指定
マスターを master_host='192.168.115.119',master_user='slave',master_password='123.com',master_log_file='master-bin.000001',master_log_pos=612 に変更します。
4. 両方のサーバーで次のコマンドを実行します。
スレーブを開始します。
5. ステータスの確認
スレーブステータスを表示\G;
(1) サーバーA(192.168.115.119)で表示
mysql> スレーブのステータスを表示\G;
**************************** 1. 行 ******************** *******
スレーブ_IO_状態:
マスターホスト: 192.168.115.120
マスター_ユーザー: スレーブ
マスターポート: 3306
接続再試行: 60
マスターログファイル: master-bin.000001
Read_Master_Log_Pos: 612
Relay_Log_File: bogon-relay-bin.000001
Relay_Log_Pos: 4
Relay_Master_Log_File: master-bin.000001
スレーブ_IO_実行中: いいえ
スレーブ_SQL_実行: はい
レプリケート_Do_DB:
レプリケート_無視_DB:
Replicate_Do_Table:
レプリケート_無視_テーブル:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
最終エラー:
スキップカウンター: 0
Exec_Master_Log_Pos: 612
リレーログスペース: 154
until_Condition: なし
ログファイルまで:
until_Log_Pos: 0
Master_SSL_Allowed: いいえ
マスター_SSL_CA_ファイル:
マスター_SSL_CA_パス:
マスター_SSL_証明書:
マスター_SSL_暗号:
マスター_SSL_キー:
Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: いいえ
Last_IO_Errno: 1593
Last_IO_Error: 致命的エラー: マスターとスレーブの MySQL サーバー ID が等しいため、スレーブ I/O スレッドが停止します。レプリケーションが機能するには、これらの ID が異なっている必要があります (または、スレーブで --replicate-same-server-id オプションを使用する必要がありますが、これは必ずしも意味があるわけではありません。使用する前にマニュアルを確認してください)。
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
マスターサーバーID: 1
マスター_UUID:
マスター情報ファイル: /usr/local/mysql/data/master.info
SQL_遅延: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: スレーブはすべてのリレー ログを読み取りました。さらなるアップデートを待っています
マスター再試行回数: 86400
マスターバインド:
Last_IO_Error_Timestamp: 230727 10:23:39
Last_SQL_Error_Timestamp:
マスター_SSL_Crl:
マスター_SSL_Crlパス:
取得された_Gtid_Set:
実行された_Gtid_Set:
自動位置: 0
レプリケート_リライト_DB:
チャンネル名:
マスター_TLS_バージョン:
セット内の 1 行 (0.00 秒)
(2) サーバーB(192.168.115.120)で表示
mysql> スレーブのステータスを表示\G;
**************************** 1. 行 ******************** *******
スレーブ_IO_状態:
マスターホスト: 192.168.115.120
マスター_ユーザー: スレーブ
マスターポート: 3306
接続再試行: 60
マスターログファイル: master-bin.000001
Read_Master_Log_Pos: 612
Relay_Log_File: bogon-relay-bin.000001
Relay_Log_Pos: 4
Relay_Master_Log_File: master-bin.000001
スレーブ_IO_実行中: いいえ
スレーブ_SQL_実行: はい
レプリケート_Do_DB:
レプリケート_無視_DB:
Replicate_Do_Table:
レプリケート_無視_テーブル:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
最終エラー:
スキップカウンター: 0
Exec_Master_Log_Pos: 612
リレーログスペース: 154
until_Condition: なし
ログファイルまで:
until_Log_Pos: 0
Master_SSL_Allowed: いいえ
マスター_SSL_CA_ファイル:
マスター_SSL_CA_パス:
マスター_SSL_証明書:
マスター_SSL_暗号:
マスター_SSL_キー:
Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: いいえ
Last_IO_Errno: 1593
Last_IO_Error: 致命的エラー: マスターとスレーブの MySQL サーバー ID が等しいため、スレーブ I/O スレッドが停止します。レプリケーションが機能するには、これらの ID が異なっている必要があります (または、スレーブで --replicate-same-server-id オプションを使用する必要がありますが、これは必ずしも意味があるわけではありません。使用する前にマニュアルを確認してください)。
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
マスターサーバーID: 1
マスター_UUID:
マスター情報ファイル: /usr/local/mysql/data/master.info
SQL_遅延: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: スレーブはすべてのリレー ログを読み取りました。さらなるアップデートを待っています
マスター再試行回数: 86400
マスターバインド:
Last_IO_Error_Timestamp: 230727 10:23:35
Last_SQL_Error_Timestamp:
マスター_SSL_Crl:
マスター_SSL_Crlパス:
取得された_Gtid_Set:
実行された_Gtid_Set:
自動位置: 0
レプリケート_リライト_DB:
チャンネル名:
マスター_TLS_バージョン:
セット内の 1 行 (0.00 秒)
(3) エラー解析
エラー:
クエリが指定されていません
この時点で、2 つのサーバーが同じエラーを表示していることがわかりました。エラー分析
(4) 問題解決
1. メインサーバーで次のコマンドを実行して、現在のサーバー ID を取得します。
「server_id」のような変数を表示します。
2. スレーブ サーバーで次のコマンドを実行して、現在のサーバー ID を取得します。
「server_id」のような変数を表示します。
この時点では、2 つのサーバーの ID が同じであることがわかります。そのため、2 つのサーバーの MySQL 設定ファイル /etc/my.cnf を変更し、`server-id` パラメーターを見つけて、それに設定します。メインサーバーとは異なるユニークな値。(2 つの設定ファイルの最後の「server-id」をそれぞれコメントアウトします)
3. 両方のサーバーを再起動して、設定を有効にします。
systemctl で mysqld を再起動します
4. 2 つのサーバーは再び mysql に入り、次のコマンドを使用してレプリケーションとレプリケーション スレッドを開始します。
スレーブを停止します。
スレーブを開始します。
(5) 本コマンド実行後
サーバーA(192.168.115.119)に表示されます
mysql> スレーブのステータスを表示\G;
**************************** 1. 行 ******************** *******
スレーブ_IO_状態:
マスターホスト: 192.168.115.120
マスター_ユーザー: スレーブ
マスターポート: 3306
接続再試行: 60
マスターログファイル: master-bin.000001
Read_Master_Log_Pos: 612
Relay_Log_File: bogon-relay-bin.000002
Relay_Log_Pos: 4
Relay_Master_Log_File: master-bin.000001
スレーブ_IO_実行中: いいえ
スレーブ_SQL_実行: はい
レプリケート_Do_DB:
レプリケート_無視_DB:
Replicate_Do_Table:
レプリケート_無視_テーブル:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
最終エラー:
スキップカウンター: 0
Exec_Master_Log_Pos: 612
リレーログスペース: 154
until_Condition: なし
ログファイルまで:
until_Log_Pos: 0
Master_SSL_Allowed: いいえ
マスター_SSL_CA_ファイル:
マスター_SSL_CA_パス:
マスター_SSL_証明書:
マスター_SSL_暗号:
マスター_SSL_キー:
Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: いいえ
Last_IO_Errno: 1593
Last_IO_Error: 致命的エラー: マスターとスレーブの MySQL サーバー UUID が等しいため、スレーブ I/O スレッドが停止します。レプリケーションが機能するには、これらの UUID が異なっている必要があります。
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
マスターサーバーID: 20
マスター_UUID:
マスター情報ファイル: /usr/local/mysql/data/master.info
SQL_遅延: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: スレーブはすべてのリレー ログを読み取りました。さらなるアップデートを待っています
マスター再試行回数: 86400
マスターバインド:
Last_IO_Error_Timestamp: 230727 10:45:35
Last_SQL_Error_Timestamp:
マスター_SSL_Crl:
マスター_SSL_Crlパス:
取得された_Gtid_Set:
実行された_Gtid_Set:
自動位置: 0
レプリケート_リライト_DB:
チャンネル名:
マスター_TLS_バージョン:
セット内の 1 行 (0.00 秒)
エラー:
クエリが指定されていません
エラー番号 1593 は、マスター サーバーとスレーブ サーバーが同じ MySQL サーバー UUID を持つことが原因で発生する問題です。エラー メッセージ「Last_IO_Error: 致命的エラー: マスターとスレーブが同じ MySQL サーバー UUID を持っているため、スレーブ I/O スレッドが停止します。レプリケーションが機能するには、これらの UUID が異なる必要があります。」は、レプリケーションが適切に機能するためには、マスターとスレーブの UUID が異なる必要があることを示しています。スレーブ MySQL サーバーの UUID は異なる必要があります。
MySQL サーバーの UUID はサーバーを一意に識別する値であり、レプリケーション時の認証と識別に使用されます。2 つのサーバーの UUID が同じであるため、スレーブ サーバーの IO スレッドが動作を停止し、レプリケーションを続行できなくなります。
(6) 問題の説明:
クラスターのセットアップ時にメイン サービスのイメージを複製すると、すべてのノードのサービス UUID が一致するため、クラスターにノードを追加するときに UUID 競合エラーが表示されます。
(7) 解決策
1. uuid 関数を使用して新しい uuid を生成します
mysql> select uuid();
+-------------------------------------------------+
| uuid() |
+-------------------------------------------------+
| 18093dc8-2c8f-11ee-bf5e-000c2973c1d9 |
+-------------------------------------------------+
セット内の 1 行 (0.00 秒)
2. 設定ファイルのディレクトリを表示します。
mysql> 'datadir' のような変数を表示します。
+---------------+----------------------+
| 変数名 | 値 |
+---------------+----------------------+
| データディレクトリ | /usr/local/mysql/data/ |
+---------------+----------------------+
セット内の 1 行 (0.01 秒)
3. 設定ファイルのディレクトリを編集します
vim /usr/local/mysql/data/auto.cnf
4. 新しく生成された uuid を uuid で変更します。
サーバー-uuid=18093dc8-2c8f-11ee-bf5e-000c2973c1d9
5. サービスを再起動します
サービスmysqldの再起動
次に、再度 mysql に入り、2 台のサーバーでそれぞれ show master status を実行し、下図のデータが変更されていることを確認し、2 台のサーバーで再度マスターを指定し、スレーブの電源を投入し、スレーブの状態を確認します。
私が 2 つの「はい」を見つけるまで、つまり:
スレーブ_IO_実行中: はい
スレーブ_SQL_実行: はい
構成が成功したことを示します
6. 同期されているかどうかをテストする
(1) サーバA(192.168.115.119)で動作
データベース jx を作成します。
データベースを表示します。
(2) サーバB(192.168.115.120)で動作
データベースを表示します。
(3) サーバB(192.168.115.120)で動作
データベース jx1 を作成します。
データベースを表示します。
(4) サーバA(192.168.115.119)で動作
データベースを表示します。
テスト中に、主に 2 台のマシン間の通信でいくつかの問題も発生しました。
両方のサーバーの mysql ポートを相互に開いたままにしておく必要があることに注意してください。そうしないと、同期が成功しません。