記事ディレクトリ
- マスタースレーブレプリケーション原理+実際の動作
-
- MySQL のマスター/スレーブ レプリケーションとは何ですか?
- マスター/スレーブ レプリケーションが必要な理由は何ですか?
- マスター/スレーブ レプリケーションの原理
- マスター/スレーブ レプリケーション設定 (1 つのマスターと 1 つのスレーブ)
マスタースレーブレプリケーション原理+実際の動作
MySQL のマスター/スレーブ レプリケーションとは何ですか?
MySQL のマスター/スレーブ レプリケーションとは、MySQL データベース サーバーのマスター ノードから 1 つ以上のスレーブ ノードにデータをコピーできることを意味します。MySQL はデフォルトで非同期レプリケーションを使用するため、スレーブ ノードは自身のデータを更新するために常にマスター サーバーにアクセスする必要はありません。データの更新はリモート接続で実行できます。スレーブ ノードはすべてのデータベースまたは特定のデータベースをコピーできます。マスター データベースまたは特定のテーブル。
マスター/スレーブ レプリケーションが必要な理由は何ですか?
1. データのホット バックアップを実行します。バックアップ データベースとして、メイン データベース サーバーに障害が発生した後、スレーブ データベースに切り替えて作業を継続し、データ損失を回避できます。
2. アーキテクチャの拡張。業務量がますます増大し、I/Oアクセス頻度が高くなり、1台のマシンでは対応できなくなるため、ディスクI/Oアクセス頻度を低減するためにマルチデータベースストレージを利用しています。単一マシンの I/O パフォーマンスを向上させます。
3. 読み取りと書き込みを分離することで、データベースはより優れた同時実行性をサポートできるようになります。特にレポートでは重要です。一部のレポート SQL ステートメントは非常に遅いため、テーブル ロックが発生し、フロントエンド サービスに影響を与えます。フロントデスクがマスターを使用し、レポートがスレーブを使用する場合、レポート SQL はフロントデスクのロックを引き起こさず、フロントデスクの速度を確保します。
マスター/スレーブ レプリケーションの原理
- スレーブサーバ上でstart smileコマンドを実行し、マスタ・スレーブレプリケーションスイッチをオンにし、マスタ・スレーブレプリケーションを開始します。
- このとき、スレーブ サーバーの IO スレッドは、マスターで許可されているレプリケーション ユーザー権限を介してマスター サーバーへの接続を要求し、binlog ログ ファイルの指定された場所 (ログ ファイル名とlocation は、マスター/スレーブ サービスの構成時に実行される変更マスター コマンドです) 指定した後、binlog ログの内容の送信を開始します。
- マスター サーバーがスレーブ サーバーの IO スレッドからリクエストを受信した後、レプリケーションを担当する IO スレッドは、スレーブ サーバーの IO によって要求された情報に基づいて、指定された binlog ログ ファイルの指定された場所以降の binlog ログ情報をバッチで読み取ります。スレーブ側の IO スレッドは、マスター サーバー側に記録された IO スレッドだけでなく、バイナリ ログ ログの内容に加えて、バイナリ ログ内の次に指定された更新位置を含む情報を返します。
- スレーブ サーバーの IO スレッドは、マスター サーバー上のダンプ スレッドによって送信されたログの内容、ログ ファイル、および場所を取得すると、binlog ログの内容をスレーブ自身のリレー ログ リレー ログ ファイル (Mysql-relay-bin) に書き込みます。 . .xxx) を作成し、新しい binlog ファイルの名前と場所を master-info ファイルに記録します。これにより、次回 msater 側で新しい binlog ログが読み取られるときに、新しい binlog ファイルの読み取りを開始するようにマスター サーバーに指示できるようになります。指定されたファイルと新しい binlog ログの場所 binlog ログの内容
- スレーブサーバー側 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
知らせ:
- スレーブサーバーはバイナリログを無効にすることができます
- マスターサーバーとスレーブサーバーの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スレッドの起動に失敗しましたか?
考えられる理由:
- クローンマシンを作成すると UUID の競合が発生する
- ファイアウォールがオフになっています
- マスター情報構成情報が正しく入力されていません
9. マスター/スレーブ レプリケーションの効果をテストする
-
マスターサーバー上でテーブルとデータベースを作成し、データを挿入し、スレーブサーバー上のデータが一貫しているかどうかを確認し、一貫していれば成功です。
-
メインサーバーはプロセスリストを表示します。
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
-
メインサーバービューポート
[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 マスタースレーブレプリケーションを設定してみましょう!!