mysql マスター/スレーブ レプリケーション、読み取り/書き込み分離、デュアル マスター デュアル スレーブ レプリケーション、読み取り/書き込み分離

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&amp;serverTimezone=Asia/Shanghai&amp;characterEncoding=utf8" user="root" password="123456">
                 <!-- 读操作对应的主机-->
                        <readHost host="hostS1" url="jdbc:mysql://192.168.40.138:3306?useSSL=false&amp;serverTimezone=Asia/Shanghai&amp;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)
);

mytable5 つの中国語データをテーブルに挿入します

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&amp;serverTimezone=Asia/Shanghai&amp;characterEncoding=utf8" user="root" password="123456">
                 <!-- 读操作对应的主机-->
                        <readHost host="Slave1" url="jdbc:mysql://192.168.40.139:3306?useSSL=false&amp;serverTimezone=Asia/Shanghai&amp;characterEncoding=utf8" user="root" password="123456">
                        </readHost>
                </writeHost>
                <!-- Master2 - Slave2 -->
                <writeHost host="Master2" url="jdbc:mysql://192.168.40.170:3306?useSSL=false&amp;serverTimezone=Asia/Shanghai&amp;characterEncoding=utf8" user="root" password="123456">
                 <!-- 读操作对应的主机-->
                        <readHost host="Slave2" url="jdbc:mysql://192.168.40.171:3306?useSSL=false&amp;serverTimezone=Asia/Shanghai&amp;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

おすすめ

転載: blog.csdn.net/qq_52589631/article/details/131138964