記事ディレクトリ
MySQL マスター/スレーブ レプリケーション (1 つのマスターと 1 つのスレーブ)
マスタースレーブレプリケーションとは
MySQL のマスター/スレーブ レプリケーションとは、MySQL データベース サーバーのマスター ノードから 1 つ以上のスレーブ ノードにデータをコピーできることを意味します。マスター ノードはすべての書き込み操作を記録し、これらの書き込み操作をバイナリ ログに記録します。スレーブノードはマスターノードに接続することでこれらのバイナリログを取得・適用することでデータレプリケーションを実現します。
MySQL はデフォルトで非同期レプリケーションを使用します。つまり、マスター ノードが書き込み操作を実行した後、スレーブ ノードがこれらの操作を適用するのを待たずに、ただちにクライアントに操作を返します。スレーブ ノードは、マスター ノードのバイナリ ログを非同期で受信して適用し、マスター ノード データとの一貫性を維持します。
スレーブ ノードはマスター ノード内のすべてのデータベースを複製することも、特定のデータベースまたは特定のテーブルを複製することを選択することもできます。マスターノードとスレーブノードのパラメータを設定することで、対応した設定を行うことができます。
マスタースレーブレプリケーションの原理
マスターサーバーはデータの変更を記録し、これらの変更をバイナリログに書き込みます。
スレーブ サーバーはマスターのバイナリ ログを定期的にチェックします。変更が見つかった場合は、マスターにバイナリ イベントの送信を要求します。マスターは I/O スレッドを開き、バイナリ イベントをスレーブに送信し、ファイルに保存します。スレーブノードのローカルリレーログ。
スレーブ ノードは SQL スレッドを開始し、リレー ログからバイナリ ログを読み取り、それをローカルで再生して、スレーブ ノードのデータをマスター ノードと一致させます。
最後に、I/O スレッドと SQL スレッドはスリープ状態になり、次に目覚めるまで待機します。
マスター/スレーブ レプリケーションの利点
-
可用性の向上: マスター ノードに障害が発生した場合、すぐにスレーブ ノードに切り替わり、データベースの継続的な可用性が確保されます。
-
負荷分散: 書き込みリクエストをマスター ノードに分散し、読み取り操作をスレーブ ノードに分散して、マスター ノードの負荷を軽減し、パフォーマンスを向上させます。
-
データのバックアップ: スレーブ ノードをマスター ノードのバックアップとして使用して、データ損失を防ぐことができます。
準備
サーバーを 2 台用意し、MySQL を別々にインストールします。
IP | タイプ |
---|---|
192.168.200.10 | マスターノード |
192.168.200.20 | スレーブノード |
ステップ 1: ホスト名を変更する
ホスト名 192.168.200.10 をマスターに変更します
192.168.200.20スレーブのホスト名を変更します
[root@master ~]# hostname -I
192.168.200.10
[root@localhost ~]# hostnamectl set-hostname master
[root@localhost ~]# bash
[root@master ~]#
[root@slave ~]# hostname -I
192.168.200.20
[root@localhost ~]# hostnamectl set-hostname slave
[root@localhost ~]# bash
[root@slave ~]#
ステップ 2: yum を使用してインストールする
[root@master ~]# yum install -y mariadb-server mariadb
[root@slave ~]# yum install -y mariadb-server mariadb
ステップ 4: mysql サービスを開始し、起動時に自動的に開始するように設定します。
[root@master ~]# systemctl enable mariadb --now
[root@slave ~]# systemctl enable mariadb --now
# 查看状态
[root@slave ~]# systemctl status mariadb
[root@slave ~]# systemctl status mariadb
ステップ 5: ポートが公開されているかどうかを確認する
[root@master ~]# netstat -tlnp |grep 3306
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 15802/mysqld
[root@slave ~]# netstat -tlnp |grep 3306
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 15991/mysqld
ステップ 6: データベースを初期化してログインをテストする
[root@master ~]# mysql_secure_installation
[root@slave ~]# mysql_secure_installation
[root@master ~]# mysql -uroot -p000000
MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '000000';flush privileges;
# root 用户授予所有数据库的所有权限,并设置密码为 '000000'
MariaDB [(none)]> exit;
[root@slave ~]# mysql -uroot -p000000
MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '000000';flush privileges;
MariaDB [(none)]> exit;
ステップ 7: ファイアウォールがポート 3306 を解放する
[root@master ~]# firewall-cmd --zone=public --add-port=3306/tcp --permanent && firewall-cmd --reload
success
success
[root@slave ~]# firewall-cmd --zone=public --add-port=3306/tcp --permanent && firewall-cmd --reload
success
success
SQLyogで接続する
メインデータベースマスターを構成する
MySQLデータベースの設定ファイルを変更する
[root@master ~]# vim /etc/my.cnf
[mysqld]
# 添加如下两行信息
server-id=10
log_bin
mysqlサービスを再起動します
[root@master ~]# systemctl restart mariadb
コピー用のアカウントを作成して許可する
スレーブ ノードにマスター/スレーブ レプリケーションを実行する権限を与えます。このコマンドを実行すると、スレーブ ノード ユーザーにはcsq
レプリケーション権限が付与され、パスワードを使用して000000
レプリケーションのためにマスター ノードに接続できるようになります。
MariaDB [(none)]> grant replication slave on *.* to 'csq'@'192.168.200.%' identified by '000000';
mysqlにログイン
マスターノード上のバイナリログファイルのリストを表示します。
记住下面的Log_name 和File_size,配置从数据库要用
MariaDB [(none)]> show master logs;
+--------------------+-----------+
| Log_name | File_size |
+--------------------+-----------+
| mariadb-bin.000001 | 398 |
+--------------------+-----------+
# Log_name 列显示二进制日志文件的名称
# File_size 列显示二进制日志文件的大小
スレーブデータベースの設定 スレーブ
mysqlデータベース構成ファイルを変更する
[root@slave ~]# vim /etc/my.cnf
[mysqld]
# 添加如下信息
server-id=20
mysqlサービスを再起動します
[root@slave ~]# systemctl restart mariadb
mysqlにログイン
メインデータベースに接続するための情報を設定します
# 因为配置主数据库的信息参数有很多当你忘记的时候可以查看如下命令
mysql> help change master to;
コピーして少し変更することもできます
这里要设置刚刚创建的用户账号信息,以及主数据库的IP
MariaDB [(none)]> CHANGE MASTER TO
-> MASTER_HOST='192.168.200.10',
-> MASTER_USER='csq',
-> MASTER_PASSWORD='000000',
-> MASTER_PORT=3306,
-> MASTER_LOG_FILE='mariadb-bin.000001',
-> MASTER_LOG_POS=398;
# MASTER_LOG_FILE 和 MASTER_LOG_POS
# 这两个参数就是指定主数据库的二进制日志文件名称和位置
# 从节点可以确定从哪个位置开始复制数据
スレーブ ノードでマスター/スレーブ レプリケーション プロセスを開始します。
MariaDB [(none)]> start slave;
# 执行该命令后,从节点将开始连接主节点,并开始复制主节点上的二进制日志
スレーブデータベースのステータスを確認する
MariaDB [(none)]> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.200.10
Master_User: csq
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mariadb-bin.000001
Read_Master_Log_Pos: 398
Relay_Log_File: mariadb-relay-bin.000002
Relay_Log_Pos: 531
Relay_Master_Log_File: mariadb-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 398
Relay_Log_Space: 827
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 10
テスト
マスター データベースはデータベース CSQ を作成します
MariaDB [(none)]> create database CSQ;
データベースから見る
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| CSQ |
| mysql |
| performance_schema |
+--------------------+
SQLyogビュー
完了