MySQL 学習ノート: マスター/スレーブ レプリケーションの原理と構成

記事ディレクトリ

マスタースレーブレプリケーション原理+実際の動作

MySQL のマスター/スレーブ レプリケーションとは何ですか?

MySQL のマスター/スレーブ レプリケーションとは、MySQL データベース サーバーのマスター ノードから 1 つ以上のスレーブ ノードにデータをコピーできることを意味します。MySQL はデフォルトで非同期レプリケーションを使用するため、スレーブ ノードは自身のデータを更新するために常にマスター サーバーにアクセスする必要はありません。データの更新はリモート接続で実行できます。スレーブ ノードはすべてのデータベースまたは特定のデータベースをコピーできます。マスター データベースまたは特定のテーブル。

マスター/スレーブ レプリケーションが必要な理由は何ですか?

1. データのホット バックアップを実行します。バックアップ データベースとして、メイン データベース サーバーに障害が発生した後、スレーブ データベースに切り替えて作業を継続し、データ損失を回避できます。
2. アーキテクチャの拡張。業務量がますます増大し、I/Oアクセス頻度が高くなり、1台のマシンでは対応できなくなるため、ディスクI/Oアクセス頻度を低減するためにマルチデータベースストレージを利用しています。単一マシンの I/O パフォーマンスを向上させます。
3. 読み取りと書き込みを分離することで、データベースはより優れた同時実行性をサポートできるようになります。特にレポートでは重要です。一部のレポート SQL ステートメントは非常に遅いため、テーブル ロックが発生し、フロントエンド サービスに影響を与えます。フロントデスクがマスターを使用し、レポートがスレーブを使用する場合、レポート SQL はフロントデスクのロックを引き起こさず、フロントデスクの速度を確保します。

マスター/スレーブ レプリケーションの原理

ここに画像の説明を挿入します

  1. スレーブサーバ上でstart smileコマンドを実行し、マスタ・スレーブレプリケーションスイッチをオンにし、マスタ・スレーブレプリケーションを開始します。
  2. このとき、スレーブ サーバーの IO スレッドは、マスターで許可されているレプリケーション ユーザー権限を介してマスター サーバーへの接続を要求し、binlog ログ ファイルの指定された場所 (ログ ファイル名とlocation は、マスター/スレーブ サービスの構成時に実行される変更マスター コマンドです) 指定した後、binlog ログの内容の送信を開始します。
  3. マスター サーバーがスレーブ サーバーの IO スレッドからリクエストを受信した後、レプリケーションを担当する IO スレッドは、スレーブ サーバーの IO によって要求された情報に基づいて、指定された binlog ログ ファイルの指定された場所以降の binlog ログ情報をバッチで読み取ります。スレーブ側の IO スレッドは、マスター サーバー側に記録された IO スレッドだけでなく、バ​​イナリ ログ ログの内容に加えて、バイナリ ログ内の次に指定された更新位置を含む情報を返します。
  4. スレーブ サーバーの IO スレッドは、マスター サーバー上のダンプ スレッドによって送信されたログの内容、ログ ファイル、および場所を取得すると、binlog ログの内容をスレーブ自身のリレー ログ リレー ログ ファイル (Mysql-relay-bin) に書き込みます。 . .xxx) を作成し、新しい binlog ファイルの名前と場所を master-info ファイルに記録します。これにより、次回 msater 側で新しい binlog ログが読み取られるときに、新しい binlog ファイルの読み取りを開始するようにマスター サーバーに指示できるようになります。指定されたファイルと新しい binlog ログの場所 binlog ログの内容
  5. スレーブサーバー側 SQL スレッドは、ローカルリレーログに新しく追加された IO スレッドのログ内容をリアルタイムで検出し、リレーログファイル内の内容をタイムリーに SQL ステートメントに解析し、アプリケーションを実行します。 SQL ステートメントが解析される順序で独自のスレーブ サーバーを実行し、現在のアプリケーション リレー ログのファイル名と場所をリレーログ.info に記録します。

マスター/スレーブ レプリケーション設定 (1 つのマスターと 1 つのスレーブ)

1.mysqlサーバーを2台用意する

マスター 192.168.31.153

スレーブ 192.168.31.111

両方のサーバーで mysql サービスが開始されていることを確認してください

2. メインサーバーでバイナリログを有効にする

設定ファイル /etc/my.cnf を編集し、mysqld を追加します (他のフィールドは省略されています)

マスター

[mysqld]
log_bin
server_id = 1

奴隷

[mysqld]
log_bin 
server_id = 2

知らせ:

  1. スレーブサーバーはバイナリログを無効にすることができます
  2. マスターサーバーとスレーブサーバーのserver_idを同じにすることはできません

mysqld サービスを再起動し、構成ファイルを更新します。

[root@slave mysql]# service mysqld restart

質問

[root@slave mysql]# service mysqld stop
 ERROR! MySQL server PID file could not be found!

mysqld を再起動できません—>pid ファイルが見つかりません

理由: ホスト名を変更した後、ホスト名が接頭辞として付けられた元の pid ファイルを読み取ることができなくなります。

の解き方?

mysqld プロセスと mysqld_safe プロセスを強制終了します。

[root@master backup]# ps aux|grep mysql
root        922  0.0  0.3 115540  1720 ?        S    00:58   0:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/data/mysql --pid-file=/data/mysql/mysql1.pid
mysql      1290  0.0 42.8 1544532 205672 ?      Sl   00:58   0:05 /usr/local/mysq/bin/mysqld --basedir=/usr/local/mysql --datadir=/data/mysql --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=chen.err --open-files-limit=8192 --pid-file=/data/mysql/mysql1.pid --socket=/data/mysql/mysql.sock --port=3306
root       1634  0.0  0.2 112824   988 pts/0    R+   03:10   0:00 grep --color=auto mysql
[root@master backup]# kill -9 922
[root@master backup]# kill -9 1290

mysqlサービスを再起動します

[root@master backup]# service mysqld start
Starting MySQL. SUCCESS! 

3. 2台のサーバーの基本データを統一する

マスターのすべてのデータベースをホーム ディレクトリにエクスポートします。

[root@master ~]# mysqldump -uroot -p"Sanchuang1234#" --all-databases >all_db.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.

scp をスレーブサーバーのホームディレクトリに移動します

[root@master ~]# scp all_db.sql [email protected]:/root/
all_db.sql                                                100%  903KB  63.5MB/s   00:00  

スレーブサーバーはSQLファイルをインポートします

[root@slave ~]# mysql -uroot -p"Sanchuang1234#" <all_db.sql 
mysql: [Warning] Using a password on the command line interface can be insecure.

4. マスターサーバーはすべてのバイナリファイルをクリアします

完全バックアップが実行され、新しいデータが生成されないため、古いバイナリ ログは必要なくなります。

root@(none) 03:27  mysql>reset master;
Query OK, 0 rows affected (0.01 sec)

root@(none) 03:27  mysql>show master status;
+-------------------+----------+--------------+------------------+-------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000001 |      154 |              |                  |                   |
+-------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

5. マスターサーバー上で新しい許可ユーザーを作成し、バイナリログをスレーブにコピーします。

root@(none) 03:27  mysql>grant replication slave on *.* to 'chenlb'@'192.168.31.%' identified by 'Sanchuang1234#';
Query OK, 0 rows affected, 1 warning (0.02 sec)

192.168.31.% – スレーブサーバーが配置されているネットワークセグメント

6.スレーブサーバ構成マスタ情報情報

root@(none) 03:25  mysql>change master to master_host='192.168.31.153',
    -> master_user='chenlb',
    -> master_password='Sanchuang1234#',
    -> master_port=3306,
    -> master_log_file='master-bin.000001',
    -> master_log_pos=154;
Query OK, 0 rows affected, 2 warnings (0.01 sec)

パラメータの意味

マスターを master_host='192.168.31.153' に変更します マスターサーバーの IP アドレスを指定します

master_user='chenlb' マスターサーバーによって承認されたユーザー
master_password='Sanchuang1234#' マスターサーバーによって承認されたユーザーのパスワード
master_port=3306 マスターサーバーの mysql ポート番号
master_log_file='master-bin.000001' バイナリログマスターサーバーによって使用されます
master_log_pos=154 バイナリログの位置番号

7. スレーブが正常に構成されているかどうかを確認します

root@(none) 03:43  mysql>show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: 
                  Master_Host: 192.168.31.153
                  Master_User: chenlb
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master-bin.000001
          Read_Master_Log_Pos: 154
               Relay_Log_File: slave-relay-bin.000001
                Relay_Log_Pos: 4
        Relay_Master_Log_File: master-bin.000001
             Slave_IO_Running: No
            Slave_SQL_Running: No

Slave_IO_Running: 有効化されていないスレーブの IO スレッドはありません
Slave_SQL_Running: 有効化されていないスレーブの SQL スレッドはありません。

8. スレーブの起動

root@(none) 03:43  mysql>stop slave;
Query OK, 0 rows affected, 1 warning (0.00 sec)

root@(none) 03:44  mysql>start slave;
Query OK, 0 rows affected (0.00 sec)

root@(none) 03:44  mysql>show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.31.153
                  Master_User: chenlb
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master-bin.000001
          Read_Master_Log_Pos: 450
               Relay_Log_File: slave-relay-bin.000002
                Relay_Log_Pos: 617
        Relay_Master_Log_File: master-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

Slave_IO_Running: はい、スレーブが正常に有効になりました。Slave_SQL_Running
: はい、スレーブが正常に有効になりました。

IO スレッドと SQL スレッドの両方が開始され、yes が示されます。

IOスレッドとSQLスレッドの起動に失敗しましたか?

考えられる理由:

  1. クローンマシンを作成すると UUID の競合が発生する
  2. ファイアウォールがオフになっています
  3. マスター情報構成情報が正しく入力されていません

9. マスター/スレーブ レプリケーションの効果をテストする

  1. マスターサーバー上でテーブルとデータベースを作成し、データを挿入し、スレーブサーバー上のデータが一貫しているかどうかを確認し、一貫していれば成功です。

  2. メインサーバーはプロセスリストを表示します。

    root@(none) 03:58  mysql>show processlist\G;
    *************************** 1. row ***************************
         Id: 6
       User: chenlb
       Host: 192.168.31.111:51274
         db: NULL
    Command: Binlog Dump
       Time: 828
      State: Master has sent all binlog to slave; waiting for more updates
       Info: NULL
    
  3. メインサーバービューポート

    [root@master ~]# netstat -anplut|grep ES
    tcp        0     36 192.168.31.153:22       192.168.31.68:61205     ESTABLISHED 1466/sshd: root@pts 
    tcp6       0      0 192.168.31.153:3306     192.168.31.111:51274    ESTABLISHED 2205/mysqld
    

スレーブは常にマスターに接続されます。トランスポート層プロトコルは tcp を使用します。接続が確立されるため、使用されるアカウントとパスワードは、マスター サーバー上で新しく許可されたユーザーのアカウント パスワードであり、バイナリ ログをマスター サーバーにコピーするために使用されます。奴隷。

以上、MySQL マスタースレーブレプリケーションの紹介でしたので、実際に mysql マスタースレーブレプリケーションを設定してみましょう!

おすすめ

転載: blog.csdn.net/qq_57629230/article/details/130394630