MySQL5.7を触ってみました②

　先日、mysql5.7を触って始めて、インストール方法を投稿しました。その後、5.7からリリースされたマルチソースレプリケーションをちょっと触ってみました。本日、設定方法について、紹介したいと思います。

# マルチソースレプリケーションとは

　マルチソース（Multi-source）レプリケーション　**＝**　マルチマスター（multi-master）レプリケーション　ではありません。それぞれの構成は[こちらの記事](https://www.percona.com/blog/2013/10/02/mysql-5-7-multi-source-replication/)を見ると、一目瞭然だと思います。

　マルチマスターレプリケーションは、サークル上にリレー的なネットワークを組み込むことになり、循環型のレプリケーションです。一方、マルチソースレプリケーションは、今までのレプリケーションの1つのスレーブは1つのマスターしか持てない仕組みと違い、**1つのスレーブは複数のマスターを持つことができる仕組みです**。

# 構成

　Master01：test-db01（192.168.56.13）
　Master02：test-db02（192.168.56.14）
　Slave：test-db03（192.168.56.15）

　では、マルチソースレプリケーションを設定します。

# マルチソースレプリケーション設定

　初期設定は今までと同じです。そして、二台のマスターの設定が同じです。

### **my.cnfの設定**

- **Master01、Master02:**

 ```bash
 [root@test-db01 ~]# diff /etc/my.cnf.org /etc/my.cnf
 27a28,30
 > 
 > server-id=1
 > log-bin=mysql-bin
 
 [root@test-db01 ~]# /etc/init.d/mysqld restart
 Stopping mysqld:                                           [  OK  ]
 Starting mysqld:                                           [  OK  ]
 ```

 ```bash
 [root@test-db02 ~]# diff /etc/my.cnf.org /etc/my.cnf
 27a28,30
 > 
 > server-id=1
 > log-bin=mysql-bin
 
 [root@test-db02 ~]# /etc/init.d/mysqld restart
 Stopping mysqld:                                           [  OK  ]
 Starting mysqld:                                           [  OK  ]
 ```

- **Slave：**

 ```bash
 [root@test-db03 ~]# diff /etc/my.cnf.org /etc/my.cnf
 27a28,33
 > 
 > server-id=3
 > log-bin=mysql-bin
 > 
 > # マルチソースレプリケーションを行うために、スレーブをクラッシュセーフにする
 > master-info-repository=TABLE
 > relay-log-info-repository=TABLE
 
 [root@test-db03 ~]# /etc/init.d/mysqld restart
 Stopping mysqld:                                           [  OK  ]
 Starting mysqld:                                           [  OK  ]
 ```

### **レプリケーションユーザー作成**

 Master01 と Master02 が同じ設定です。

```mysql
mysql> GRANT REPLICATION SLAVE ON *.* TO repl@'%' IDENTIFIED BY 'ReplPass00!';
Query OK, 0 rows affected, 1 warning (0.01 sec)
```

## **マスター・ステータス確認**

**Master01：**

```mysql
mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |      437 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
```

**Master02：**

```mysql
mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |      437 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
```

### **スレーブ側でCHANGE MASTER**

**Slave：**

```mysql
mysql> CHANGE MASTER TO MASTER_HOST='192.168.56.13', MASTER_USER='repl', MASTER_PASSWORD='ReplPass00!', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=437 FOR CHANNEL 'master01';
Query OK, 0 rows affected, 2 warnings (0.05 sec)

mysql> CHANGE MASTER TO MASTER_HOST='192.168.56.14', MASTER_USER='repl', MASTER_PASSWORD='ReplPass00!', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=437 FOR CHANNEL 'master02';
Query OK, 0 rows affected, 2 warnings (0.04 sec)
```

　CHANGE MASTER のコマンドは普通のレプリケーションを構築する時と同じようですが、最後に**「FOR CHANNEL」**につけています。これはどのチャネル（マスター）のスレーブになるかを指定する引数です。
　そして、「FOR CHANNEL」の前には**カンマ入れてはいけません**。ご注意してください。

### **スレーブを起動**

**Slave：**

```mysql
mysql> START SLAVE FOR CHANNEL 'master01';
Query OK, 0 rows affected (0.01 sec)

mysql> START SLAVE FOR CHANNEL 'master02';
Query OK, 0 rows affected (0.01 sec)
```

### **レプリケーションステータス確認**

**Slave：**

```mysql
mysql> SHOW SLAVE STATUS FOR CHANNEL 'master01'\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.56.13
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 437
               Relay_Log_File: test-db03-relay-bin-master01.000002
                Relay_Log_Pos: 320
        Relay_Master_Log_File: mysql-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: 437
              Relay_Log_Space: 540
              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: 1
                  Master_UUID: 133e604f-a3bd-11e5-858e-080027079e3d
             Master_Info_File: mysql.slave_master_info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 
            Executed_Gtid_Set: 
                Auto_Position: 0
         Replicate_Rewrite_DB: 
                 Channel_Name: master01
           Master_TLS_Version: 
1 row in set (0.00 sec)

mysql> SHOW SLAVE STATUS FOR CHANNEL 'master02'\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.56.14
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 437
               Relay_Log_File: test-db03-relay-bin-master02.000002
                Relay_Log_Pos: 320
        Relay_Master_Log_File: mysql-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: 437
              Relay_Log_Space: 540
              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: 1
                  Master_UUID: a1ef5091-a3c2-11e5-8b14-080027079e3d
             Master_Info_File: mysql.slave_master_info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 
            Executed_Gtid_Set: 
                Auto_Position: 0
         Replicate_Rewrite_DB: 
                 Channel_Name: master02
           Master_TLS_Version: 
1 row in set (0.00 sec)
```

　次は、データベースを作成して、レプリケーションを検証します。

### **各マスターでデータベースを作成**

**Master01：**

```mysql
mysql> create database master01_db01;
Query OK, 1 row affected (0.01 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| master01_db01      |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)
```

**Master02：**

```mysql
mysql> create database master02_db01;
Query OK, 1 row affected (0.02 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| master02_db01      |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.01 sec)
```

**Slave：**

```mysql
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| master01_db01      |        ← Master01のDB
| master02_db01      |        ← Master02のDB
| mysql              |
| performance_schema |
| sys                |
+--------------------+
6 rows in set (0.00 sec)
```

　スレーブ側が各マスターから同期を取れたことを確認できました。
　では、最低限のマルチソースレプリケーションの構築が完了しました。

# マルチソースレプリケーションのデメリット

- サーバーの台数を減らします。
- 異なるDBサーバーのデータベースのテーブルをJOIN可能です。

　今度、mysql5.7の処理速度をどのぐらいアップしたかを検証したいと思います。
　では、今回はこれで。