開発環境
仮想環境: 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