MySQLレプリケーションのさまざまな方法


MySQLレプリケーションは主に書き込み操作をプライマリノードに送信し、読み取り操作をスレーブノードに送信し、各ノードに関連するデータセットがある.サービスから専用のスレッドを起動して、自分をクライアントにして、MySQLプロトコルを通じてMySQLマスターノードにバイナリログファイルの中のイベントの読み取りを要求して、それからマスターノードは自分のバイナリログの中のイベントを検査してそしてスレーブノードに送信して、ノードから受け取った後に先に自分の中継ログの中で保存して、1つのイベントに読み取ってすべて中継の中で保存します
レプリケーションで使用されるスレッド名:
ノードから:
I/O Thread:プライマリノードからバイナリイベントを要求し、中継ログに保存する
SQL Thread:中継ログからバイナリログイベントを読み込み、ローカルで再生を完了する
プライマリノード:
dump Thread:ノードからのI/O Threadごとにdump Threadを起動し、バイナリログイベントを送信する
コピーの機能:
1、データ分布の目的を実現する
2、主に書き込み操作ができる負荷均衡効果
3、バックアップの効果を実現できる(メインサーバーが停止した場合、スタンバイノードがメインノードになる)
4、高可用性とフェイルオーバーを実現できる
5、ノードからMysqlのアップグレードテストができる
MySQLレプリケーションの方式:主従レプリケーション、主主レプリケーション、半同期レプリケーション、フィルタレプリケーション、SSLレプリケーション
一、主従レプリケーションを実現する:
環境の準備
VM 1:Masterノード(プライマリノード)
IP:192.168.1.108
VM 2:Slaveノード(スレーブノード)
IP:192.168.1.109
1、Masterノードの配置
(1)、mariadbサービスのインストール
[root@node0 ~]# yum install mariadb-server -y

(2)プロファイルの編集
[root@node0 ~]# vim /etc/my.cnf   ##mariadb      
[mysqld]
log_bin=mysql-bin   ##         
server-id=1   ##    Server-id
innodb_file_per_table = ON
skip_name_resolve = ON   ##       
[root@node0 ~]# systemctl start mariadb.service  ##  mariadb  
MariaDB [(none)]> show global variables like "server_id";    ##   server-id
server_id  1    
 
MariaDB [(none)]> show global variables like "log_bin";  ##            
log_bin  ON 
 
MariaDB [(none)]> show master status;   ##              
mysql-bin.000002   245           |
 
MariaDB [(none)]> grant replication slave,replication client on *.* to 'repluser'@'192.168.%.%' identified by 'replpass';   ##           
MariaDB [(none)]> flush privileges;

2、Slaveノードの配置
(1)mariadbサービスのインストール
[root@node1 ~]# yum install mariadb-server -y

(2)プロファイルの編集
[root@node1 ~]# vim /etc/my.cnf
[mysqld]
relay-log=relay-log   ##      
server-id=2    ##    Server-id; Server-id     Master   Server-id  
innodb_file_per_table = ON
skip_name_resolve = ON  
[root@node1 ~]# systemctl start mariadb.service
MariaDB [(none)]> show global variables like "relay_log";  ##          
relay_log   relay-log 
 
MariaDB [(none)]> show global variables like "server_id";   ##   server-i
server_id   2

(3)コピー権限を持つユーザーアカウントを使用してプライマリサーバに接続し、コピースレッドを起動する
MariaDB [(none)]> change master to master_host='192.168.1.108',master_user='repluser',master_password='replpass',master_log_file='mysql-bin.000002',master_log_pos=245;
## master_host:      IP  
## master_user、master_password:             
## master_log_file:               ;
## master_log_pos:        position
MariaDB [(none)]> start slave;   ##      
MariaDB [(none)]> show slave status\G;  ##           
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

3、主従サーバーがレプリケーション機能を実現するかどうかをテストする
(1)Masterノードで一度データベースを表示する
MariaDB [(none)]> show databases;
+--------------------+
| Database           
+--------------------+
| information_schema 
| lweim            
| mysql              
| performance_schema 
| test               
+--------------------+

(2)Slaveで一度データベースを表示する
MariaDB [(none)]> show databases;
+--------------------+
| Database           
+--------------------+
| information_schema 
| mysql              
| performance_schema 
| testdb               
+--------------------+

(3)Masterノード上に「MaGeRepo」というデータベースを作成し、Slaveノード上で表示する
MariaDB [(none)]> create database MaGeRepo;  ##          “MaGeRepo”
Query OK, 1 row affected (0.00 sec)
MariaDB [(none)]> show databases;   ##          
+--------------------+
| Database           
+--------------------+
| information_schema 
| MaGeRepo                         
| mysql              
| performance_schema 
| testdb               
+--------------------

プライマリ・スレーブ・レプリケーション・アーキテクチャで注意すべき問題:
1.Masterノード上のパラメータ
sync_binlog=ON
sync_master_info=ON
     InnoDB    ,        
innodb_flush_log_at_tx_commit = ON   ##    
innodb_support_xa = ON   ##   innodb       

 
2、Slaveノード上のパラメータ
skip_slave_start = OFF  ##          
sync_relay_log = ON   
sync_relay_log_info = ON

二、主主な複製を実現する
環境の準備
VM 1:Masterノード(プライマリノード)
IP:192.168.1.108
VM 2:Masterノード(プライマリノード)
IP:192.168.1.109
1、仮想マシンの配備1
(1)mariadbサービスのインストール
[root@node0 ~]# yum install mariadb-server -y

(2)プロファイルの編集
[root@node0 ~]# vim /etc/my.cnf
log_bin=mysql-bin
relay-log=relay-log   ##      
server-id=1
innodb_file_per_table = ON
[root@node0 ~]# systemctl start mariadb.service
MariaDB [(none)]> show global variables like "%log%";
relay_log  relay-log 
log_bin   ON    
 
MariaDB [(none)]> show master status;
mysql-bin.000003    245             
 
MariaDB [(none)]> grant replication slave,replication client on *.* to 'repluser'@'192.168.%.%' identified by 'replpass';

2、仮想マシンの配備2
(1)mariadbサービスのインストール
[root@node1 ~]# yum install mariadb-server -y

(2)プロファイルの編集
[root@node1 ~]# vim /etc/my.cnf
[mysqld]
relay-log=relay-log
log_bin=mysql-bin  ##         
server-id=2
innodb_file_per_table = ON
skip_name_resolve = ON
[root@node1 ~]# systemctl start mariadb.service
MariaDB [(none)]> show master status;
mysql-bin.000003   245                                
 
MariaDB [(none)]> grant replication slave,replication client on *.* to 'repluser'@'192.168.%.%' identified by 'replpass';   ##             

3、両ノードは双方で作成したユーザーを使用して相手のサーバーに接続し、レプリケーションスレッドを起動する
(1)仮想マシン1を仮想マシン2に接続する
MariaDB [(none)]> change master to master_host='192.168.1.109',master_user='repluser',master_password='replpass',master_log_file='mysql-bin.000003',master_log_pos=245;
MariaDB [(none)]> flush privileges;
MariaDB [(none)]> start slave;

(2)仮想マシン2を仮想マシン1に接続する
MariaDB [(none)]> change master to master_host='192.168.1.108',master_user='repluser',master_password='replpass',master_log_file='mysql-bin.000003',master_log_pos=245;
MariaDB [(none)]> flush privileges;
MariaDB [(none)]> start slave;

4、マスターコピーモデルのテスト
(1)仮想マシン1と仮想マシン2を別々に表示するデータベース
MariaDB [(none)]> show databases;  ##     1    
+--------------------
| Database           
+--------------------+
| information_schema 
| mysql              
| performance_schema 
| test              
+--------------------+
MariaDB [(none)]> show databases;  ##     2    
+--------------------+ 
| Database           
+--------------------+
| information_schema 
| mysql              
| performance_schema 
| testdb              
+--------------------+

(2)仮想マシン1に「LweimRepo」データベースを追加し、仮想マシン2に「WzxRepo」データベースを追加する
MariaDB [(none)]> create database LweimRepo;   ##   1
Query OK, 1 row affected (0.00 sec)
 
MariaDB [(none)]> flush privileges;
MariaDB [(none)]> create database WzxRepo;    ##   2
Query OK, 1 row affected (0.00 sec)
 
MariaDB [(none)]> flush privileges;

(3)2つのノードのデータベースの再表示
MariaDB [(none)]> show databases;   ##     1
+--------------------+
| Database           
+--------------------+
| information_schema 
| LweimRepo          
| WzxRepo            
| mysql              
| performance_schema 
| test               
+--------------------+
MariaDB [(none)]> show databases;   ##     2
+--------------------+
| Database           
+--------------------+
| information_schema 
| LweimRepo          
| WzxRepo            
| mysql              
| performance_schema 
| testdb              
+--------------------+

三、半同期レプリケーションを実現する:masterノードに複数のslaveノードがある場合、1つのslaveノードのレプリケーションが完了した後、masterノードに応答し、その後、masterノードはクライアントに応答する.
環境の準備
VM 1:Masterノード(プライマリノード)
IP:192.168.1.108
VM 2:Slaveノード(スレーブノード)
IP:192.168.1.109
1、マスターノードにプラグイン「semisync_master.so」をインストールする
MariaDB [(none)]> install plugin rpl_semi_sync_master soname 'semisync_master.so';
MariaDB [(none)]> show global variables like "%semi%";
+------------------------------------+-------+
| Variable_name            Value 
+------------------------------------+-------+
| rpl_semi_sync_master_enabled     OFF     ##             ,      ON
| rpl_semi_sync_master_timeout     10000    ##  slave     ,     ,   10s
| rpl_semi_sync_master_trace_level   32       ##    32,     ,     
| rpl_semi_sync_master_wait_no_slave   ON       ##   slave       
+------------------------------------+-------+
MariaDB [(none)]> set global rpl_semi_sync_master_enabled=1;  ##“rpl_semi_sync_master_enabled”   “ON”

2、Slaveノードに「semisync_slave.so」をインストールする
MariaDB [(none)]> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
MariaDB [(none)]> set global rpl_semi_sync_slave_enabled=1;  ##        slave  
MariaDB [(none)]> show global variables like "%semi%";
+---------------------------------+-------+
| Variable_name           Value 
+---------------------------------+-------+
| rpl_semi_sync_slave_enabled    ON     ##          slav  
| rpl_semi_sync_slave_trace_level   32    
+---------------------------------+-------+

3、主従レプリケーションの実現
4、マスターノードでslaveノードを追加するかどうかを確認する
MariaDB [(none)]> show global status like "%semi%";
+--------------------------------------------+-------+
| Variable_name                Value 
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients         1      ##    Slave     
| Rpl_semi_sync_master_net_avg_wait_time    0     
| Rpl_semi_sync_master_net_wait_time       0     
| Rpl_semi_sync_master_net_waits         0     
| Rpl_semi_sync_master_no_times          1    
| Rpl_semi_sync_master_no_tx          2     
| Rpl_semi_sync_master_status           ON   
| Rpl_semi_sync_master_timefunc_failures    0     
| Rpl_semi_sync_master_tx_avg_wait_time      0     
| Rpl_semi_sync_master_tx_wait_time        0     
| Rpl_semi_sync_master_tx_waits         0     
| Rpl_semi_sync_master_wait_pos_backtraverse   0     
| Rpl_semi_sync_master_wait_sessions      0      
| Rpl_semi_sync_master_yes_tx           0     
+--------------------------------------------+---
----

5.Masterノードにデータベース「GunDuZi」を作成し、Slaveノードで表示する
MariaDB [(none)]> create database GunDuZi;
MariaDB [(none)]> show global status like "%semi%";
+--------------------------------------------+-------+
| Variable_name                Value 
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients         1     
| Rpl_semi_sync_master_net_avg_wait_time    8147  
| Rpl_semi_sync_master_net_wait_time      8147  
| Rpl_semi_sync_master_net_waits        1     
| Rpl_semi_sync_master_no_times         1     
| Rpl_semi_sync_master_no_tx          2     
| Rpl_semi_sync_master_status          ON    
| Rpl_semi_sync_master_timefunc_failures    0     
| Rpl_semi_sync_master_tx_avg_wait_time    9388  
| Rpl_semi_sync_master_tx_wait_time      9388  
| Rpl_semi_sync_master_tx_waits          1     
| Rpl_semi_sync_master_wait_pos_backtraverse   0     
| Rpl_semi_sync_master_wait_sessions       0     
| Rpl_semi_sync_master_yes_tx           1     
+--------------------------------------------+-------
MariaDB [(none)]> show databases;
+--------------------+
| Database           
+--------------------+
| information_schema 
| GunDuZi            
| mysql              
| performance_schema 
| test               
+--------------------+
##  :        ,       

四、フィルタコピーを実現する:ノードからデータベースのコピーまたはデータベースで指定されたテーブルのコピーを指定する
環境の準備
VM 1:Masterノード(プライマリノード)
IP:192.168.1.108
VM 2:Slaveノード(スレーブノード)
IP:192.168.1.109
1、主従レプリケーションの実現
2、Slaveノードがコピーするデータベースを「wtcdb」と指定する
MariaDB [wxpp]> set global replicate_do_db=wtcdb;
MariaDB [wxpp]> show global variables like "replicate%";
+----------------------------------+-----------+
| Variable_name           Value     
+----------------------------------+-----------+
| replicate_annotate_row_events    OFF       
| replicate_do_db           wtcdb   ##           
| replicate_do_table   ##           
| replicate_events_marked_for_skip  replicate 
| replicate_ignore_db     ##      (       )
| replicate_ignore_table   ##    (     )
| replicate_wild_do_table   ##                  
| replicate_wild_ignore_table              
+----------------------------------+-----------+

3、Slaveノード上のデータベースを表示する
MariaDB [(none)]> show databases;
+--------------------+
| Database           
+--------------------+
| information_schema 
| mysql              
| performance_schema 
| test               
| wxpp               
+--------------------+

4、Masterノードに「lweimdb」、「wzxdb」、「wtcdb」の3つのデータベースを作成する
MariaDB [(none)]> create database lweimdb;
Query OK, 1 row affected (0.01 sec)
 
MariaDB [(none)]> create database wzxdb;
Query OK, 1 row affected (0.00 sec)
 
MariaDB [(none)]> create database wtcdb;
Query OK, 1 row affected (0.00 sec)
 
MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.00 sec)
 
MariaDB [(none)]> show databases;
+--------------------+
| Database           
+--------------------+
| information_schema 
| lweimdb            
| mysql              
| performance_schema 
| test               
| wtcdb              
| wxpp               
| wzxdb              
+--------------------+

5、Slaveノード上のデータベースをもう一度確認し、「wtcdb」データベースのみをコピーしたかどうか
MariaDB [(none)]> show databases;
+--------------------+
| Database           
+--------------------+
| information_schema 
| mysql             
| performance_schema 
| test               
| wtcdb              
| wxpp               
+--------------------+

五、SSLコピーを実現する
環境の準備
VM 1:Masterノード(プライマリノード)
IP:192.168.1.108
VM 2:Slaveノード(スレーブノード)
IP:192.168.1.109
VM 3:CA機構(マスタースレーブノード証明書に署名)
IP:192.168.1.110
1、仮想マシンの配備3
(1)CA証明書鍵の作成
[root@localhost CA]# (umask 077;openssl genrsa -out ./private/cakey.pem 1024)

(2)CAに自己署名させる
[root@localhost CA]# openssl req -new -x509 -key ./private/cakey.pem -out cacert.pem -days 365
[root@localhost CA]# touch serial index.txt  ##        
[root@localhost CA]# echo 01 > serial   ##       

2、Masterノードは証明書を作成し、CA機関に署名させる
[root@node0 ssl]# (umask 077; openssl genrsa -out master.key 1024)  ##Master      
[root@node0 ssl]# openssl req -new -key master.key -out master.csr -days 365  ##         
[root@localhost CA]# openssl ca -in /tmp/master.csr -out master.crt -days 365 ## CA    
[root@node0 ssl]# chmod 600 *   ##     600
[root@node0 ssl]# chown mysql.mysql -R ssl/*   ##         mysql
[root@node0 ssl]# ll
total 12
-rw------- 1 mysql mysql 1046 Jun  9 20:49 cacert.pem
-rw------- 1 mysql mysql 3202 Jun  9 20:43 master.crt
-rw------- 1 mysql mysql  887 Jun  9 20:35 master.key

3.マスターノードのプロファイルを構成し、コピー権限を持つユーザーを作成する
[root@node0 ~]# vim /etc/my.cnf
ssl     ##  sll  
ssl_ca=/var/lib/mysql/ssl/cacert.pem    ##  CA      
ssl_cert=/var/lib/mysql/ssl/master.crt  ##  Master       
ssl_key=/var/lib/mysql/ssl/master.key   ##  Master       
[root@node0 ~]# systemctl start mariadb.service
MariaDB [(none)]> show global variables like "%ssl%";  ##      ssl
+---------------+-------------------------------+
| Variable_name | Value                         
+---------------+-------------------------------+
| have_openssl  | YES                           
| have_ssl      | YES                           
| ssl_ca        | /var/lib/mysql/ssl/cacert.pem 
| ssl_capath                                  
| ssl_cert      | /var/lib/mysql/ssl/master.crt 
| ssl_cipher                                  
| ssl_key       | /var/lib/mysql/ssl/master.key 
+---------------+-------------------------------+
MariaDB [(none)]> grant replication slave,replication client on *.* to 'repluser'@'192.168.%.%' identified by 'replpass' require ssl;

4、Masterノードの証明書をSlaveに送信し、そのプロファイルを修正し、Masterノードに接続し、コピースレッドを起動する
[root@node0 ~]# scp ssl/* [email protected]:/var/lib/mysql/   ##             “mysql”
[email protected]'s password: 
cacert.pem      100% 1046     1.0KB/s   00:00    
master.crt      100% 3206     3.1KB/s   00:00     
master.key      100%  887      0.9KB/s   00:00    
[root@node1 ~]# vim /etc/my.cnf   
ssl    
ssl_ca=/var/lib/mysql/cacert.pem   
ssl_cert=/var/lib/mysql/master.crt
ssl_key=/var/lib/mysql/master.key
[root@node1 ~]# systemctl start mariadb.service
MariaDB [(none)]> show global variables like '%ssl%';    ##     SSL       
+---------------+---------------------------+
| Variable_name  | Value                     
+---------------+---------------------------+
| have_openssl   | YES                       
| have_ssl       | YES                       
| ssl_ca         | /var/lib/mysql/cacert.pem 
| ssl_capath     |                           
| ssl_cert       | /var/lib/mysql/master.crt 
| ssl_cipher     |                          
| ssl_key        | /var/lib/mysql/master.key 
+---------------+---------------------------+
MariaDB [(none)]> change master to master_host='192.168.1.108',master_user='repluser',master_password='replpass',master_log_file='mysql-bin.000003',master_log_pos=245,master_ssl=1,master_ssl_ca='/var/lib/mysql/cacert.pem',master_ssl_cert='/var/lib/mysql/master.crt',master_ssl_key='/var/lib/mysql/master.key';
## master_ssl:  ssl  
## master_ssl_ca:  CA    
## master_ssl_cert:  Master      
## master_ssl_key:  Master      
MariaDB [(none)]> start slave;  ##      
MariaDB [(none)]> show slave status\G; ##          
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Master_SSL_Allowed: Yes   ##        “YES”
Master_SSL_CA_File: /var/lib/mysql/cacert.pem
Master_SSL_Cert: /var/lib/mysql/master.crt
Master_SSL_Key: /var/lib/mysql/master.key

5.MasterノードとSlaveノードのそれぞれのデータベースを表示する
MariaDB [(none)]> show databases;  ##  Master  
+--------------------+
| Database           
+--------------------+
| information_schema 
| mysql              
| performance_schema 
| ssl                
| test               
+--------------------+
MariaDB [(none)]> show databases;   ##  Slave  
+--------------------+
| Database           
+--------------------+
| information_schema 
| mysql              
| performance_schema 
| test               
+--------------------+

6、Masterノードで「LweimRepo」、「HjRepo」、「WzxRepo」を作成し、その後Slaveノードで確認する
MariaDB [(none)]> create database LweimRepo;
Query OK, 1 row affected (0.00 sec)
 
MariaDB [(none)]> create database HjRepo;
Query OK, 1 row affected (0.00 sec)
 
MariaDB [(none)]> create database WzxRepo;
Query OK, 1 row affected (0.04 sec)
MariaDB [(none)]> show databases;   ## Slave     
+--------------------+
| Database           
+--------------------+
| information_schema 
| HjRepo             
| LweimRepo          
| WzxRepo            
| mysql              
| performance_schema 
| test               
+--------------------+

問題のまとめ:
1、SlaveノードがMasterノードに接続されている場合、必ずMasterノードが現在使用しているバイナリログとposを指定する
2.SSLレプリケーションを使用する場合は、鍵、証明書ファイルの権限、およびマスターグループであることを確認する
3、証明書を生成する場合、3台の仮想マシンの国、省、会社名は同じでなければならない.