MySQL マスター/スレーブ設定: 1 つのマスターと 1 つのスレーブ

目次

1. 環境

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

3. 1 つのマスターと 1 つのスレーブを設定します

1. マスター/スレーブサーバーのファイアウォールを閉じます。

2. マスタースレーブサーバーSELINUXを終了します。

3. メインサーバーの構成

4. スレーブサーバーの設定

5. マスターとスレーブの同期を確認する

4、自由

1. 装備サービス

2、caching_sha2_パスワード

3、最大接続エラー数


1. 環境

メインサーバー サーバーから
オペレーティング·システム ロッキー 8.8 ロッキー 8.6
MySQLのバージョン 8.0.32 8.0.32
IP 10.0.0.151 10.0.0.152

注: マスター サーバーとスレーブ サーバーの MySQL バージョンが一致していることが最善ですが、一致していない場合は、互換性の問題を十分に考慮する必要があります。

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

MySQL のマスター/スレーブ レプリケーション アーキテクチャには、主に 3 つのスレッドと 2 つのログが含まれています。3 つのスレッドはダンプ スレッド、IO スレッド、SQL スレッドであり、2 つのログはバイナリ ログ (binlog) とリレー ログ (リレー ログ) です。

1. マスター (メインサーバー) が書き込み操作を実行すると、対応するバイナリ ファイルが生成され、すべての書き込みプロセスがバイナリ ファイルに記録されます。

2. マスターは、各スレーブ (スレーブ サーバー) ノードの IO スレッドにダンプ スレッドを提供し、スレーブ ノードの IO スレッドはマスターからバイナリ ログの内容を要求し、マスターはバイナリ ログをスレーブ ノードに提供します。ダンプ スレッドを介してスレーブ ノードに送信され、スレーブ ノードの IO スレッドによってローカル リプレイ ログ (リレー ログ) に書き込まれます。

3. スレーブ ノード上の SQL スレッドは、リプレイ ログの内容がリアルタイムで更新されているかどうかを監視し、更新されている場合は、ファイル内の内容が SQL ステートメントに解析され、スレーブ ノード上のデータベースに復元されます。マスターノードとスレーブノード間の関係を確保するためのデータ同期。

3. 1 つのマスターと 1 つのスレーブを設定します

1. マスター/スレーブサーバーのファイアウォールを閉じます。

ファイアウォールのステータスを確認します: systemctl status firewalld.service

 ファイアウォールをオフにします: systemctl stop firewalld.service

2. マスタースレーブサーバーSELINUXを終了します。

SELINUX 構成ファイルを入力します。

vim /etc/selinux/config

SELINUX の値を無効に設定します。

 次に、サーバーを再起動します (有効にするには再起動する必要があります)。

reboot

3. メインサーバーの構成

a. マスターノードの log_bin (バイナリログファイル生成パス) とサーバー ID を設定します。

サーバー ID は、MySQL サーバーを一意に識別するために使用されます。マスター/スレーブ アーキテクチャの各ノードには、ID と役割の識別を容易にするために、異なるサーバー ID が必要です。

サーバー ID については、単純な拡張です。マスターとスレーブの両方がバイナリ ログ ファイルを生成でき、スレーブが非同期で書き込む可能性があるため、書き込み操作がバイナリ ログ内で区別される方法を示します。マスターによって同期されますか? それとも自分で行いますか?サーバー ID を使用しないと、データがどこから書き込まれたのかがわかりません。

vim /etc/my.cnf

#加入以下内容到my.cnf中
[mysqld]
server-id=151
log_bin=/data/mysql/logbin/mysql-bin

b. バイナリ ログ ファイルのパスはカスタマイズしたパスであり存在しないため、パスを作成してファイルにアクセス許可を追加する必要があります。そして、MySQL サービスを再起動します。

#注意我这里没有创建mysql-bin,它是用来当二进制日志文件的前缀的,不需要创建
mkdir -pv /data/mysql/logbin

#给文件添加属主属组,-R表示递归
chown -R mysql.mysql /data/mysql/

#重启MySQL服务
systemctl restart mysqld.service

c. バイナリ ログの場所を記録します。

ここでの場所はファイル パスを指しますが、バイナリ ログ ファイルの同期が開始される場所を指します。MySQL で「show master status;」と入力して表示します。

 d. コピー権限を持つアカウントを作成する

#给10.0.0.0/24网段创建一个用户及密码,因为考虑到后面有其他同网段的主机做多从
create user slavenode@'10.0.0.%' identified by '123456';

#给这个用户授予复制权限,*.*表示所有库所有表
grant replication slave on *.* to slavenode@'10.0.0.%';

4. スレーブサーバーの設定

a. 設定ファイルを変更し、mysql サービスを再起動します。

vim /etc/my.cnf


#添加以下内容到my.cnf中
[mysqld]
log_bin=/data/mysql/logbin/mysql-bin
server-id=152
read_only=on
relay_log=relay_log
relay_log_index=relay-log.index

read_only=on: データベースを読み取り専用に設定します。

log_bin へのパスも私が作成したものですが、このパスに従う場合は、自分でパスを作成し、所有者グループを変更して、MySQL サービスを再起動する必要があります。

#注意我这里没有创建mysql-bin,它是用来当二进制日志文件的前缀的,不需要创建
mkdir -pv /data/mysql/logbin

#给文件添加属主属组,-R表示递归
chown -R mysql.mysql /data/mysql/

#重启MySQL服务
systemctl restart mysqld.service

lay_log=relay_log: リレー ログ ファイルのパスを指定します。デフォルトは /var/lib/mysql/ です
。lay_log_index=relay-log.index: リレー ログ インデックス ファイル名

b. レプリケーション権限を持つユーザー アカウントを使用してメイン サーバーに接続し、レプリケーション スレッドを開始します。

スレーブ サーバー MySQL に接続し、show smile status と入力すると、現在空であることがわかります。

 次のステートメントを入力します。

CHANGE MASTER TO MASTER_HOST='10.0.0.151',  #指定master节点
MASTER_USER='slavenode',                    #连接用户
MASTER_PASSWORD='123456',                   #连接密码
MASTER_LOG_FILE='mysql-bin.000001',         #从哪个二进制文件开始复制
MASTER_LOG_POS=157,                         #指定同步开始的位置
MASTER_DELAY = 2;                    #可指定延迟复制实现防止误操作,单位秒,这里可以用作 
                                             延时同步,一般用于备份,默认是10s

次に、show smile status\G を使用します (\G は判読可能な形式で表示されます)。

構成したばかりの情報の一部が表示され、IO スレッドと SQL スレッドが現在閉じていることがわかります。マスター/スレーブ同期の実装はこれら 2 つのスレッドに依存するため、これらを有効にする必要があります。

 c. IOスレッドとSQLスレッドを開始します。

MySQL に接続し、start smile と入力して 2 つのスレッドを開始します

#可以在后面跟线程名,开启具体线程;不跟线程名,则俩个线程都开启
start slave [IO_THREAD|SQL_THREAD];

次に、「show smile status\G」と入力して、スレッドが正常にオープンしたかどうかを確認します。「はい」の場合は、スレッドが正常にオープンしたことを意味します。

注: ここで Slave_IO_Running の値が接続されている場合は、メイン サーバーのファイアウォールがオフになっていない可能性があります。メイン サーバーで systemctl stop firewalld.service と入力してください。次に、スレーブ サーバーで show smile status\G と入力して、値が Yes であるかどうかを確認します。

 d. メインサーバーのダンプスレッドを確認します。

ダンプ スレッドを手動で構成する必要はなく、この時点でマスター/スレーブ構成が実際に完了しています。メインサーバー MySQL に入り、show processlist と入力し、ダンプ スレッドを表示します。

show processlist;

5. マスターとスレーブの同期を確認する

メインサーバーはデータを作成します。

#创建数据库test
create database test;

#进入test
use test;

#创建表
CREATE TABLE student (
id int UNSIGNED AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(20) NOT NULL,
age tinyint UNSIGNED,
height DECIMAL(5,2),
gender ENUM('M','F') default 'M'
)ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4;

#插入数据
insert into student values(1,'tom',10,135,'M');

#查看插入的数据
select * from student;

サーバーからのデータを表示します。

#查看所有数据库,发现test已经同步过来
show databases;

#进入test库
use test;

#查看student表
select * from student;

マスターとスレーブの比較:

4、自由

詳細なプロセスについては説明しませんが、設定プロセスのほとんどは Rocky と同じですが、次の点に注意する必要があります。

1. 装備サービス

apparmor リストされた一連のファイルと権限へのプログラムのアクセスを制限できます。

log_bin=/data/mysql/logbin/mysql-index などの構成ファイルを変更するときに新しいパスを指定して認可した場合、このパスの権限は apparmor によって解放されないため、mysql を再起動します。 エラーを報告する。

解決:

#修改apparmor配置文件
vim /etc/apparmor.d/usr.sbin.mysqld

#加入下面俩行内容,位置随意(注意格式,逗号不要省略)
/data/mysql/logbin/ r,
/data/mysql/logbin/** rwk,

#重启apparmor
systemctl restart apparmor.service

2、caching_sha2_パスワード

MySQL 8.0.4 以降、MySQL のデフォルト認証プラグインはmysql_native_passwordからcaching_sha2_passwordに変更されました 。mysql_native_password の特徴は、暗号化検証を必要としないため、検証速度が非常に速いですが、安全ではありません。

したがって、上記の情報に基づくと、使用している mysql バージョンが 8.0.4 以降の場合、Ubuntu で MySQL マスター/スレーブを構成すると、スレーブ ノードの起動後にエラーが報告される可能性があります。

Last_IO_Error: ソース「[email protected]:3306」への接続エラー。これは試行 1/86400 で、試行間の遅延は 60 秒でした。メッセージ: 認証プラグイン 'caching_sha2_password' がエラーを報告しました: 認証には安全な接続が必要です。

エラー レポートには、その理由も説明されています。「caching_sha2_password」認証プラグインには安全な接続が必要です。これは、現在接続が安全ではないことを意味します。

次に、ID 認証プラグインを mysql_native_password に変更しますか? このアプローチはおそらく可能です。

ただし、これは安全ではないためお勧めできません。

スレーブサーバーで mysql を入力するときにパラメータを 1 つ追加します。

mysql -uroot -p123456 --get-server-public-key

次に、マスターを次のように変更するときにもう 1 行追加します (最初にスレーブをすべてリセットします)。

CHANGE MASTER TO
MASTER_HOST='10.0.0.161',
MASTER_USER='slavebak',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=157,
get_master_public_key=1;

次にスレーブを起動します。

3、最大接続エラー数

max_connect_errors は、許可される失敗した接続試行の最大数を指定するために使用されます。デフォルトは 100 です。これは、次のコマンドで表示できます。

show global variables like '%max_connect_errors%';

2の問題を解決するために何度も、おそらく100回以上試みたため、スレーブの起動後に次のエラーが発生しました。

Last_IO_Error: ソース '[email protected]:3306' への接続エラー。これは試行 1/86400 で、試行間の遅延は 60 秒でした。メッセージ: ホスト '10.0.0.162' は接続エラーが多いためブロックされています。次のコマンドでブロックを解除してください。 「mysqladminlush-hosts」は、
「接続エラーが多すぎるため、ホスト 10.0.0.162 がロックされています。ロックを解除するには、mysqladminlush-hosts コマンドを使用してください」というエラーを変換します。

そこで、両方のデータベースに入力します。

flush hosts;

スレーブを再起動すると、IO スレッドは正常になり、エラーは報告されません。

上記の内容は参考用です。ご不明な点がございましたら、プライベートメッセージまたはコメントをお送りください。

おすすめ

転載: blog.csdn.net/qq_54381110/article/details/131708243