AWS RDSにて、
MySQL5.7をマスター、MariaDB10.6をリードレプリカとしてレプリケーションを組んでみました。
目的
AWS RDSにおける、MySQL5.7からMariaDB10.6への無停止切り替えが可能か検証するため
概要
手法として、まず通常のMySQL5.7レプリケーションを構築し、
リードレプリカのレプリケーションを停止させマスターのポジションを確認しておき、
レプリケーションを停止させた状態のスナップショットを取得し、
それを元にRDSのスナップショットの移行機能でMariaDBを作成。
作成したMariaDBからマスターのMySQL5.7へレプリケーションを開始させる。
という流れです。
手順
- MySQL5.7の標準的なレプリケーションを構築
- リードレプリカにおけるレプリケーションを停止
- マスターのポジション情報を確認
- リードレプリカのスナップショットを取得
- スナップショットの移行を実施(※ターゲットDBにてMariaDBを選択)
- 新たに作成したMariaDBにて、レプリケーションを開始
- レプリケーションの必要がなくなったリードレプリカを削除
詳細
MySQL5.7の標準的なレプリケーションを構築
以下の手順でリードレプリカを作成する
AWSコンソール > RDS > 任意のMySQL5.7サーバのラジオボタンを選択 > アクション > リードレプリカの作成
リードレプリカにおけるレプリケーションを停止
作成したリードレプリカにてレプリケーションを停止する
CALL mysql.rds_stop_replication;
マスターのポジション情報を確認
リードレプリカからマスターの情報を参照し、確認しておく
mysql> show slave status \G;
*************************** 1. row ***************************
Slave_IO_State:
Master_Host: 172.X.X.X
Master_User: rdsrepladmin
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin-changelog.000032
Read_Master_Log_Pos: 154
〜(略)〜
リードレプリカのスナップショットを取得
AWSコンソール > RDS > 作成したリードレプリカのラジオボタンを選択 > アクション > スナップショットの取得
スナップショットの移行を実施
AWSコンソール > RDS > 作成したリードレプリカのラジオボタンを選択 > アクション > スナップショットの移行 >
データベースエンジンの名前にてmariadbを選択
※その後は各環境に合わせた設定を行い、作成する
※リードレプリカのレプリケーションは、作業中終始停止したままの方が良いかと思われる(※max_binlog_sizeの設定によってはMaster_Log_Fileがローテートされていってしまい、後ほどレプリケーションの開始ができなくなるため)
新たに作成したMariaDBにて、レプリケーションを開始
CALL mysql.rds_set_external_master(
'<hostname>',
<port>,
'<username>',
'<password>',
'<Master_Log_Fileの値>',
<Read_Master_Log_Posの値>,
0
);
CALL mysql.rds_start_replication;
mysql> show slave status \G;
〜(略)〜
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Slave_IO_Running、Slave_SQL_RunningがYesであることを確認
レプリケーションの必要がなくなったリードレプリカを削除
AWSコンソール > RDS > 作成したリードレプリカのラジオボタンを選択 > アクション > 削除
完了です
考察
AWS公認の手法ではないが、
この手法でMySQL5.7におけるMariaDB10.6のリードレプリカを作成できることがわかった。
この手法をうまく使えば、MySQL5.7からMariaDB10.6への無停止切り替えが可能となるかもしれない。