Ubuntu上でMySQL8.0のレプリケーション設定

## 開発環境

仮想環境: AWSのEC2インスタンス
OS: Ubuntu 22.04 LTS
ミドルウェア: MySQL 8.0

## マスター側の設定

スーパーユーザーの権限でコマンドを実行するため、以下のコマンドを実行
```
sudo su
```
サーバのパッケージインデックスを更新
```
apt update
```
mysql-serverパッケージをインストール
```
apt install mysql-server -y
```
/var/lib/mysql配下のpemファイルを確認
```
ll /var/lib/mysql/*.pem

-rw------- 1 mysql mysql 1705 Nov 15 01:26 /var/lib/mysql/ca-key.pem
-rw-r--r-- 1 mysql mysql 1112 Nov 15 01:26 /var/lib/mysql/ca.pem
-rw-r--r-- 1 mysql mysql 1112 Nov 15 01:26 /var/lib/mysql/client-cert.pem   ←クライアント証明書
-rw------- 1 mysql mysql 1705 Nov 15 01:26 /var/lib/mysql/client-key.pem
-rw------- 1 mysql mysql 1705 Nov 15 01:26 /var/lib/mysql/private_key.pem
-rw-r--r-- 1 mysql mysql  452 Nov 15 01:26 /var/lib/mysql/public_key.pem
-rw-r--r-- 1 mysql mysql 1112 Nov 15 01:26 /var/lib/mysql/server-cert.pem   ←サーバ証明書
-rw------- 1 mysql mysql 1705 Nov 15 01:26 /var/lib/mysql/server-key.pem    ←サーバの鍵ファイル　 
```
mysqld.cnfを開く
```
vi /etc/mysql/mysql.conf.d/mysqld.cnf
```
[mysqld]ブロックに以下を記述
```
[mysqld]

#bind-address            = 127.0.0.1
bind-address            = *

server-id=1
log-bin

ssl-ca = /var/lib/mysql/client-cert.pem      #クライアント証明書
ssl-cert = /var/lib/mysql/server-cert.pem    #サーバ証明書
ssl-key = /var/lib/mysql/server-key.pem      #サーバの鍵ファイル
```
MySQLを起動
```
systemctl start mysql
```
MySQLにログイン
```
mysql
```
SSL対応の確認 →have_openssl と have_ssl が YES になっていれば完了
```
mysql> show variables like '%ssl%'; 

 have_openssl    | YES                            
 have_ssl        | YES
```
以下のコマンドでレプリカ用のユーザを作成
```
mysql> CREATE USER 'repl'@'replica_host' IDENTIFIED BY 'password';
```
全ての権限を付与
```
mysql> GRANT ALL ON *.* TO 'repl'@'replica_host' WITH GRANT OPTION;
```
変更を反映
```
FLUSH PRIVILEGES;
```
マスターサーバのバイナリログファイルに関するステータス情報を確認
→File と Position はレプリカ側の設定で使用する
```
mysql> show master status\G

*************************** 1. row ***************************
             File: primary-bin.000005
         Position: 157
     Binlog_Do_DB:
 Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.00 sec)
```
## レプリカ側の設定

マスター側と同じ手順でMySQLをインストール
```
sudo su
```
```
apt update
```
```
apt install mysql-server -y
```
mysqld.cnfを開く
```
vi /etc/mysql/mysql.conf.d/mysqld.cnf
```
[mysqld]ブロックに以下を記述
```
[mysqld]

#bind-address           = 127.0.0.1
bind-address            = *

server-id=2   #マスタサーバと被らないように注意
log-bin
read_only   

ssl-ca = /var/lib/mysql/client-cert.pem      #クライアント証明書
ssl-cert = /var/lib/mysql/server-cert.pem    #サーバ証明書
ssl-key = /var/lib/mysql/server-key.pem      #サーバの鍵ファイル
```
MySQLを起動
```
systemctl start mysql
```
MySQLにログイン
```
mysql
```
SSL対応の確認 
```
mysql> show variables like '%ssl%'; 

 have_openssl    | YES                            
 have_ssl        | YES
 ```
マスターサーバの情報を記述
```
 mysql> CHANGE MASTER TO
-> MASTER_HOST='マスター側のIPまたはドメイン名',
-> MASTER_PORT=3306,
-> MASTER_USER='repl',
-> MASTER_PASSWORD='password',
-> MASTER_LOG_FILE='show master status\Gコマンドの実行結果(File)',
-> MASTER_LOG_POS=show master status\Gコマンドの実行結果(Position),
-> MASTER_SSL = 1;
```
レプリケーションスレッドを起動
```
mysql> START REPLICA;
```
ソースとレプリカとの間にエラーがないかを確認
→Replica_IO_Running と Replica_SQL_Running が Yes になっていれば完了
```
mysql> SHOW REPLICA STATUS\G

 Replica_IO_Running: Yes
 Replica_SQL_Running: Yes
 ```
読み取り専用として作動させる際には、以下のコマンドを実行
 ```
mysql> FLUSH TABLES WITH READ LOCK;
```
※読み取り専用のロックを解除したいときは、以下のコマンドを実行
```
mysql> UNLOCK TABLES;
```
## 参考文献

MySQL 8.0 ではGRANT、IDENTIFIED BYでユーザーを作成するとエラー
https://urashita.com/archives/35970

MySQL8.0で新たに追加されているレプリケーション接続オプション
https://blog.s-style.co.jp/2020/03/5861/

17.3.1 暗号化接続を使用するためのレプリケーションの設定
https://dev.mysql.com/doc/refman/8.0/ja/replication-solutions-encrypted-connections.html

6.3.1 暗号化接続を使用するための MySQL の構成
https://docs.oracle.com/cd/E17952_01/mysql-8.0-ja/using-encrypted-connections.html

MySQL 8.0 : SSL/TLS の設定
https://www.server-world.info/query?os=Ubuntu_20.04&p=mysql8&f=2

17.4.1.3 ソースまたはレプリカを読取り専用にすることによるバックアップ
https://dev.mysql.com/doc/refman/8.0/ja/replication-solutions-backups-read-only.html