【MySQL8.4】EC2でMySQLのMaster、Slave構成を構築してみた

MySQLのMaster、Slave構成を構築の勉強するために、
AWSのEC2上にMySQLをインストールし、
Master、Slave構成を構築しました。
レプリケーション実行するまでの手順をこちらで紹介します

## インストール先準備

EC2を2台準備します。
セキュリティグループはログイン用にSSH（22ポート）、MySQLAurora（3306ポート）を許可します。
※今回EC2の準備方法については割愛します。

## MySQL Community Serverインストール

公式サイトから対象OSに対応したRPMをダウンロードしておくこと

[https://dev.mysql.com/downloads/repo/yum](https://dev.mysql.com/downloads/repo/yum/)

### インストール(Master、Slave共通)

```bash
# パッケージアップデート
$ sudo dnf update -y
# MySQLリポジトリインストール
$ sudo dnf localinstall mysql84-community-release-el9-1.noarch.rpm
# MySQL Server インストール
$ sudo dnf install -y mysql-server
```

### 設定ファイル修正（Master側）
`/etc/my.cnf`に以下記載する

```
server-id=1
log_bin=/var/log/mysql/mysql-bin.log
mysql_native_password=on
```
### MySQL起動

```bash
$ systemctl start mysqld
$ systemctl status mysqld
$ systemctl enabled mysqld
$ systemctl is-enabled mysqld
```

### MySQLログイン
rootユーザの初期パスワードはMySQLログ（/var/log/mysqld.log）に記載されているため、
確認する。

2024-08-13T04:12:02.154975Z 6 [Note] [MY-010454] [Server] A temporary **password** is generated for root@localhost: >REhP_(Hy2Ug

```bash
# パスワード確認
$ grep "password" /var/log/mysqld.log | awk -F': ' '{print $2}'
# rootでログイン
$ mysql -u root -p
Enter password: <確認したパスワード>
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 12
Server version: 8.4.2

Copyright (c) 2000, 2024, 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> 
```

### MySQL rootパスワード変更

今回は特に初期パスワードでもいいが、
実際は初期パスワードは変更した方が良いため、
以下でパスワード変更する。

```sql
mysql>  ALTER USER 'root'@'localhost' IDENTIFIED BY '<new password>';
```

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

Slave用インスタンスにレプリケーションするためのユーザを作成する。

```sql
# rep01ユーザ作成
mysql>  CREATE USER 'rep01'@'%' IDENTIFIED BY '<new password>';
# レプリケーション権限付与
mysql>  GRANT REPLICATION SLAVE ON *.* TO 'rep01'@'%';
mysql>  FLUSH PRIVILEGES;

# ユーザ一覧確認
mysql> SELECT User, Host FROM mysql.user;
+------------------+-----------+
| User             | Host      |
+------------------+-----------+
| rep01            | %         |
| mysql.infoschema | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
| root             | localhost |
+------------------+-----------+
5 rows in set (0.00 sec)

# rep01権限確認
mysql> 　
+-----------------------------------------------+
| Grants for rep01@%                            |
+-----------------------------------------------+
| GRANT REPLICATION SLAVE ON *.* TO `rep01`@`%` |
+-----------------------------------------------+
1 row in set (0.01 sec)

# plugin修正
# caching_sha2_passwordの場合はmysql_native_passwordに修正しないと、
# レプリケーション実施時にエラーになる。
mysql> SELECT user,host,plugin FROM mysql.user;
+------------------+-----------+-----------------------+
| user             | host      | plugin                |
+------------------+-----------+-----------------------+
| rep01            | %         | caching_sha2_password |
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session    | localhost | caching_sha2_password |
| mysql.sys        | localhost | caching_sha2_password |
| root             | localhost | caching_sha2_password |
+------------------+-----------+-----------------------+
5 rows in set (0.01 sec)

caching_sha2_passwordの場合は以下に修正
mysql> 　****ALTER USER 'rep01' IDENTIFIED WITH mysql_native_password BY '<password>';

mysql> SELECT user,host,plugin FROM mysql.user;
+------------------+-----------+-----------------------+
| user             | host      | plugin                |
+------------------+-----------+-----------------------+
| rep01            | %         | mysql_native_password |
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session    | localhost | caching_sha2_password |
| mysql.sys        | localhost | caching_sha2_password |
| root             | localhost | caching_sha2_password |
+------------------+-----------+-----------------------+
5 rows in set (0.00 sec)

# ログアウト
exit;
```

### Binary確認
```sql
mysql> SHOW BINARY LOG STATUS;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |      441 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
```

FileとPositionの値を控えておくこと。

## Slave側構築

### 設定ファイル修正

 /etc/my.cnfに以下記載する

```
server-id=2
log_bin=/var/log/mysql/mysql-bin.log
mysql_native_password=on
```

### MySQL再起動

```bash
$ systemctl restart mysqld
```

### レプリケーション設定、実施

```sql
mysql> CHANGE REPLICATION SOURCE TO
    -> SOURCE_HOST='<Master側IPアドレス>',
    -> SOURCE_USER='rep01',
    -> SOURCE_PASSWORD='<rep01パスワード>',
    -> SOURCE_LOG_FILE='mysql-bin.000001',
    -> SOURCE_LOG_POS=158;

mysql> START REPLICA;
```

### レプリケーション状態確認

特にエラーがなく、
 Replica_SQL_Running_State: Replica has read all relay log; waiting for more updates
上記メッセージが出ていれば、
Master側に更新待ち状態のため問題なし

次回はMasterとSlaveの切り替え方法について投稿予定です。