目次
MySQL マスター/スレーブ レプリケーション
概要
マスター/スレーブ レプリケーションとは、マスター データベースのデータをバイナリ ログ (binlog) を介してスレーブ ライブラリ サーバーに転送し、これらのログをスレーブ ライブラリで再実行することで、スレーブ ライブラリとマスター ライブラリのデータが同期が保たれます。
原理
建てる
サーバーを2台用意する
マスター:192.168.40.137
スレイバー:192.168.40.138
1. ファイアウォールをオフにする
[root@mysql-master ~]# systemctl stop firewalld
[root@mysql-master ~]# systemctl disable firewalld
[root@mysql-slaver ~]# systemctl stop firewalld
[root@mysql-slaver ~]# systemctl disable firewalld
2.mysqlをインストールする
両方のサーバーに mysql をインストールし、ps を使用してインストールが成功したかどうかを確認します。
[root@mysql-master ~]# ps aux|grep mysqld
[root@mysql-slaver ~]# ps aux|grep mysqld
3. 主なライブラリ構成
メインライブラリ設定ファイル /etc/my.cnf を変更します。
# mysql服务器id,保证整个集群环境中唯一
server-id=1
# 是否只读,1代表只读,0代表读写
read-only=0
MySQLサーバーを再起動します
[root@mysql-master ~]# systemctl restart mysqld
MySQL にログインし、リモート接続アカウントを作成し、マスター/スレーブ レプリケーション権限を付与します。
# 创建root用户,并设置密码,该用户可以在任意主机连接mysql服务
mysql> create user 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
# 为'root'@'%'用户分配主从复制权限
mysql> grant replication slave on *.* to 'root'@'%';
バイナリ座標を表示する
mysql> show master status;
+---------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------+----------+--------------+------------------+-------------------+
| binlog.000004 | 377 | | | |
+---------------+----------+--------------+------------------+-------------------+
4. ライブラリからの設定
スレーブ構成ファイル /etc/my.cnf を変更します。
# mysql服务器id,保证整个集群环境中唯一
server-id=2
# 是否只读,1代表只读,0代表读写
read-only=1
MySQLサーバーを再起動します
[root@mysql-master ~]# systemctl restart mysqld
MySQL にログインし、メインのデータベース構成を設定します。
mysql> change replication source to source_host="192.168.40.137",source_user="root",source_password='123456',source_log_fike='binlog.000004',source_log_pos=377;
同期を有効にする
mysql> start replica;
マスター/スレーブ レプリケーション ステータスの表示
mysql> show replica status\G;
5. テスト
データベースを作成し、テーブルを作成して、表示するデータを挿入します。
mysql> CREATE DATABASE MyDatabase;
Query OK, 1 row affected (0.01 sec)
mysql> USE MyDatabase;
Database changed
mysql> CREATE TABLE MyTable (
-> id INT NOT NULL AUTO_INCREMENT,
-> name VARCHAR(50) NOT NULL,
-> age INT NOT NULL,
-> PRIMARY KEY (id)
-> );
Query OK, 0 rows affected (0.03 sec)
mysql> INSERT INTO MyTable (name, age) VALUES
-> ('张三', 20),
-> ('李四', 25),
-> ('王五', 30);
Query OK, 3 rows affected (0.05 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql>INSERT INTO MyTable (name, age) VALUES
-> ('张三', 20),
-> ('李四', 25),
-> ('王五', 30);
Query OK, 3 rows affected (0.01 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> update MyTable set age=20;
Query OK, 2 rows affected (0.01 sec)
Rows matched: 6 Changed: 2 Warnings: 0
MyCat は読み取りと書き込みの分離を実装します
読み取りと書き込みの分離とは、異なるデータベース サーバーに対応するためにデータベース上の読み取り操作と書き込み操作を分離することを意味します。メイン データベースは書き込み操作を提供し、スレーブ データベースは読み取り操作を提供するため、単一データベースの負荷を効果的に軽減できます。
1 つのマスターと 1 つのスレーブ環境の準備
以前のマスタとスレーブのマスタ・スレーブレプリケーション環境が正常であるか確認し、同様に以下のような影響が発生していれば正常です。
構成
MyCat は、schema.xml ファイルの datahost タグの Balance 属性によって、バックエンド データベースの読み取りと書き込みの分離と負荷分散を制御します。
バランス値
1. schema.xml ファイルを変更し、論理ライブラリと読み取り/書き込みホスト IP を指定します。
<!-- 新建一个逻辑库 dataNode为dn4-->
<schema name="DB_RW" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn4" >
</schema>
<dataNode name="dn4" dataHost="dhost4" database="db1" />
<!--新建一个主机dhost4 负载均衡策略为1-->
<dataHost name="dhost4" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- 写操作对应的主机-->
<writeHost host="hostM1" url="jdbc:mysql://192.168.40.137:3306?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8" user="root" password="123456">
<!-- 读操作对应的主机-->
<readHost host="hostS1" url="jdbc:mysql://192.168.40.138:3306?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8" user="root" password="123456">
</readHost>
</writeHost>
</dataHost>
2. データベースにアクセスするためのユーザー権限をserver.xmlファイルに追加します。
3.MyCatを再起動します
[root@mysql-master mycat]# bin/mycat restart
テストビュー
マスター/スレーブ レプリケーションが設定されているため、スレーブ データベースのデータの変更はマスター データベースには影響しません。そのため、スレーブ データベースのデータを変更し、マスター データベースにクエリを実行して、クエリされたデータがスレーブ データベースからのものであるか、またはマスター データベースからのものであるかを確認します。マスターデータベース。
スレーブ データベースがデータを変更し、取得されるのはスレーブ データベースのデータであり、読み取りと書き込みの分離が実現されていることがわかります。
デュアルマスター・デュアルスレーブの導入と環境準備
1 はじめに
ホスト Master1 はすべての書き込みリクエストを処理するために使用され、そのスレーブ マシン Slave1 と別のホスト Master2 およびそのスレーブ マシン Slave2 がすべての読み取りリクエストを担当します。Master1 ホストがダウンすると、Master2 ホストがリクエストの書き込みを担当し、Master1 と Master2 は相互にバックアップ マシンとして機能します。
2. 環境の準備
サーバ | ソフトウェアをインストールする | 説明する |
---|---|---|
192.168.40.137 | JDK、MyCat、MySQL | MyCat中間サーバー |
192.168.40.138 | MySQL | マスター1 |
192.168.40.139 | MySQL | スレーブ1 |
192.168.40.170 | MySQL | マスター2 |
192.168.40.171 | MySQL | スレーブ2 |
すべてのファイアウォールをオフにする
systemctl stop firewalld
systemctl disable firewalld
構成
1. 主なデータベース構成 (Master1)
構成ファイル /etc/my.cnf を変更します。
# 主库配置
# mysql服务器id,保证整个集群环境中唯一
server-id=1
# 指定同步的数据库
binlog-do-db=db01
binlog-do-db=db02
binlog-do-db=db03
# 在作为从数据库的时候,有写入操作也要更新二进制文件
log-slave-updates
サービスを再起動する
systemctl restart mysqld
2. メインライブラリ構成(Master2)
構成ファイル /etc/my.cnf を変更します。
# 主库配置
# mysql服务器id,保证整个集群环境中唯一
server-id=3
# 指定同步的数据库
binlog-do-db=db01
binlog-do-db=db02
binlog-do-db=db03
# 在作为从数据库的时候,有写入操作也要更新二进制文件
log-slave-updates
サービスを再起動する
systemctl restart mysqld
3. マスター/スレーブ レプリケーション用のアカウントを作成する
Master1 と Master2 の両方が実行されます
# 创建root用户,并设置密码,该用户可以在任意主机连接mysql服务
mysql> create user 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
# 为'root'@'%'用户分配主从复制权限
mysql> grant replication slave on *.* to 'root'@'%';
2 つの主要なライブラリのバイナリ座標を表示する
mysql> show master status;
マスター1
mysql> show master status;
+---------------+----------+----------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------+----------+----------------+------------------+-------------------+
| binlog.000004 | 659 | db01,db02,db03 | | |
+---------------+----------+----------------+------------------+-------------------+
1 row in set (0.00 sec)
マスター2
mysql> show master status;
+---------------+----------+----------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------+----------+----------------+------------------+-------------------+
| binlog.000002 | 659 | db01,db02,db03 | | |
+---------------+----------+----------------+------------------+-------------------+
1 row in set (0.00 sec)
4. スレーブ構成 (Slave1)
スレーブ構成ファイル /etc/my.cnf を変更します。
# mysql服务器id,保证整个集群环境中唯一
server-id=2
MySQLサーバーを再起動します
systemctl restart mysqld
5. スレーブ構成 (Slave2)
スレーブ構成ファイル /etc/my.cnf を変更します。
# mysql服务器id,保证整个集群环境中唯一
server-id=4
MySQLサーバーを再起動します
systemctl restart mysqld
6. 2 つのスレーブ ライブラリをメイン ライブラリに関連付けるように設定します。
Slave1で実行
mysql> change master to master_host="192.168.40.138",master_user="root",master_password='123456',master_log_file='binlog.000004',master_log_pos=659;
Query OK, 0 rows affected, 8 warnings (0.04 sec)
在庫の開始
mysql> start slave;
Query OK, 0 rows affected, 1 warning (0.03 sec)
マスター/スレーブ レプリケーション ステータスの表示
mysql> show slave status\G;
Slave2で実行
mysql> change master to master_host="192.168.40.170",master_user="root",master_password='123456',master_log_file='binlog.000002',master_log_pos=659;
Query OK, 0 rows affected, 8 warnings (0.04 sec)
在庫の開始
mysql> start slave;
Query OK, 0 rows affected, 1 warning (0.03 sec)
マスター/スレーブ レプリケーション ステータスの表示
mysql> show slave status\G;
7. 2 つのマスター データベース間の相互レプリケーション
Master1 が Master2 をコピーし、Master1で実行
mysql> change master to master_host="192.168.40.170",master_user="root",master_password='123456',master_log_file='binlog.000002',master_log_pos=659;
Query OK, 0 rows affected, 8 warnings (0.04 sec)
スレーブ ライブラリを起動してマスターとスレーブのレプリケーション ステータスを表示します。
mysql> start slave;
Query OK, 0 rows affected, 1 warning (0.02 sec)
mysql> show slave status\G;
Master2 は Master1 をコピーし、Master2で実行
mysql> change master to master_host="192.168.40.138",master_user="root",master_password='123456',master_log_file='binlog.000004',master_log_pos=659;
Query OK, 0 rows affected, 8 warnings (0.01 sec)
スレーブ ライブラリを起動してマスターとスレーブのレプリケーション ステータスを表示します。
mysql> start slave;
Query OK, 0 rows affected, 1 warning (0.02 sec)
mysql> show slave status\G;
8. テスト
DB01 データベースを作成します。
CREATE DATABASE db01;
DB01 データベースを選択します。
USE db01;
3 つのフィールドを含む名前のテーブルを作成しますmytable
。
CREATE TABLE mytable (
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
age INT NOT NULL,
address VARCHAR(100) NOT NULL,
PRIMARY KEY (id)
);
mytable
5 つの中国語データをテーブルに挿入します。
INSERT INTO mytable (name, age, address) VALUES
('张三', 20, '北京'),
('李四', 25, '上海'),
('王五', 30, '广州'),
('赵六', 35, '深圳'),
('钱七', 40, '成都');
簡単なテストの後、デュアルマスター機能とデュアルスレーブ機能を実現できます。
デュアルマスターとデュアルスレーブの読み書き分離構成
MyCat コンソール データベースの読み取りと書き込みの分離と負荷分散は、schema.xml ファイルの dataHost タグの Balance 属性によって制御され、自動切り替えは writeType および switchType によって完了します。
MyCat の schema.xml ファイルを変更する
<!--因为只设置了db01这个库,以它为例-->
<dataNode name="dn4" dataHost="dhost4" database="db01" />
<!--新建一个主机dhost4 负载均衡策略为1-->
<dataHost name="dhost4" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- 写操作对应的主机 Master1 - Slave1-->
<writeHost host="Master1" url="jdbc:mysql://192.168.40.138:3306?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8" user="root" password="123456">
<!-- 读操作对应的主机-->
<readHost host="Slave1" url="jdbc:mysql://192.168.40.139:3306?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8" user="root" password="123456">
</readHost>
</writeHost>
<!-- Master2 - Slave2 -->
<writeHost host="Master2" url="jdbc:mysql://192.168.40.170:3306?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8" user="root" password="123456">
<!-- 读操作对应的主机-->
<readHost host="Slave2" url="jdbc:mysql://192.168.40.171:3306?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8" user="root" password="123456">
</readHost>
</writeHost>
</dataHost>
MyCatを再起動します
[root@mycat mycat]# bin/mycat restart
ログインして表示
[root@mycat mycat]# mysql -h 192.168.40.137 -P 8066 -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.6.29-mycat-1.6.7.3-release-20210913163959 MyCat Server (OpenCloudDB)
Copyright (c) 2000, 2023, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;
+----------+
| DATABASE |
+----------+
| DB01 |
| DB_RW |
+----------+
2 rows in set (0.00 sec)
mysql> use DB_RW;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show tables;
+----------------+
| Tables_in_db01 |
+----------------+
| mytable |
+----------------+
1 row in set (0.02 sec)
テストビュー
このテストは、データを挿入するか、Master1 をハングアップさせてから、Master2 を起動して高可用性を実現できるかどうかを確認できます。テストは比較的単純であるため、写真は掲載されません。
軽微なネットワーク問題の解決策
NetworkManager によるネットワーク設定の引き継ぎをキャンセルします。
nmcli n off
ネットワーク設定を引き継ぐように NetworkManager を構成します。
nmcli n on