RDB:リードレプリカ
MySQL、PostgreSQLに組み込まれたレプリケーション機能によるリードレプリカを作成できます。冗長化とは別の機能です。
これにより、読み出しの負荷が高く1台のDBサーバーでは限界に達してしまうような場合でも、柔軟にスケールアウトできます。
1度、リードレプリカを作成してしまえば、リードレプリカ元のDBサーバーのデータベースを更新すると、リードレプリカにも反映が行われます。
レプリケーション方式は、MySQLは非同期レプリケーション、PostgreSQLはストリーミングレプリケーション(非同期レプリケーション)となります。
利用シーン
以下の場合が、リードレプリカの利用に適しています。
読み出しの負荷が非常に高い場合 | 1台のDBサーバーではさばき切れない負荷を複数台に分散できます。 |
リードレプリカ元のマスターDBサーバーが利用できない場合 | 読み出しの処理だけをリードレプリカに向けられます。 リードレプリカ元のマスターDBサーバーに対してDBスナップショットを行っているときや計画メンテナンスを行っているときに有効です。 マスターDBサーバーが利用できない状態のため、リードレプリカの持つデータは古い可能性があることに注意してください。 |
業務レポートや解析に利用するデータの収集 | 本番環境の重要なDBサーバーでデータ取得用のクエリを実行しなくてすみます。 |
リードレプリカの状態
リードレプリカのステータスはコントロールパネルまたは DescribeDBInstances APIで確認することができます。ステータスは下記の2種類です。
コントロールパネルでの表示 | API | 説明 |
---|---|---|
レプリケーション中 | replicating | レプリケーションは正常動作しています。 |
エラー | error | レプリケーションにエラーが発生しました。コントロールパネルのDBサーバー詳細タブまたはイベント一覧ページで、エラーの内容を確認してください。 |
MySQLエンジンの場合
レプリケーションでエラーの状態が続くと、下記のような不具合につながりますので早急にエラーから回復させてください。
- binlogにエラーメッセージが大量に書き込まれてサイズが大きくなり、ストレージを圧迫する
- 大量に存在するbinlogを処理しなければならないため、クラッシュリカバリーの時間が長くなる
レプリケーション遅延が頻発する場合は、下記を実施することでレプリケーションの速度が改善する場合があります。
- 一度リードレプリカを削除し再作成する
- リードレプリカのDBサーバータイプをよりスペックの良いものに変更する
レプリケーション遅延量の確認方法
レプリケーションの遅延具合は、下記手順で確認してください。
mysqlにログインしてコマンドを実行し、以下項目を確認する。
Seconds_Behind_Master
MySQL 8.0以降の場合
SHOW REPLICA STATUS \G
MySQL 5.6、5.7の場合
SHOW SLAVE STATUS \G
モニタリングのレプリケーション遅延時間
PostgreSQLエンジンの場合
レプリケーションでエラーの状態が続くと、下記のような不具合につながりますので早急にエラーから回復させてください。
- 大量に存在するWALファイルを処理しなければならないため、クラッシュリカバリーの時間が長くなる
マスターDBサーバーへのデータ更新が大量に行われると、レプリケーションが追いつかなくなり、エラーとなってしまう場合があります。
このような場合、マスターDBサーバーのwal_keep_segmentsの値(デフォルト値:100)を増やし、WALファイルの保持数を増やすと改善できます。
DBエンジンバージョンが13以降の場合は、マスターDBサーバーのwal_keep_sizeの値 (デフォルト値:1600) を増やし、WALファイルの保持サイズを増やすことで改善できます。
レプリケーション遅延量の確認方法
正確なレプリケーションの遅延時間を取得することはできませんが、リードレプリカ側で下記コマンドを実行すると、最後の更新日時を確認できます。
ただし、マスターDBサーバー側で更新がなかった場合には日時は更新されません。
SELECT pg_last_xact_replay_timestamp();
リードレプリカの作成
- 1台のDB サーバーに対して、最大5台のリードレプリカを作成できます。
リードレプリカの作成上限数を変更したい場合は、下記フォームより申請してください。
各種変更申請フォーム
- 作成の際にはレプリケーションのマスターとなるDBサーバーの名前を指定してください。
- リードレプリカはマスターに指定したDBサーバーと同じゾーンに作成されます。
- 最新のDBスナップショットからリードオンリーのDBサーバーが作成されます。
- モニタリング機能で監視できます。
- リードレプリカへのデータ更新は、DBエンジンのレプリケーション機能の制約により、遅延する場合があります。
- 効果的なレプリケーションを行うために、リードレプリカはマスターと同じDBサーバータイプ・ディスク容量を設定してください。
- リードレプリカ元のDBサーバーとは別の新しいIPアドレスが発行されます。
- リードレプリカは、コントロールパネルでは、DB種別に「リードレプリカ(リードレプリカ元のDBサーバーの名前)」と表示されます。
- リードレプリカを作成する処理では、組み込み先となるマスターDBサーバー及びスレーブDBサーバーの性能に影響は発生しません。
ただし、リードレプリカの台数の増加に伴いマスターDBサーバーへのレプリケーション負荷が増加します。
MySQLエンジンの場合
- 作成されたリードレプリカは、読み出し専用(書き込み不可)の状態となっており、DBパラメーターグループで、read_onlyが1に設定されます。
- リードレプリカ元のDBサーバーのバイナリログのサイズによっては、リードレプリカの作成に時間のかかる場合があります。
PostgreSQLエンジンの場合
- リードレプリカ元のDBサーバーのWALファイルのサイズによっては、リードレプリカの作成に時間のかかる場合があります。
リードレプリカの削除
- リードレプリカは通常の DB サーバーと同じ操作で削除できます。
- リードレプリカのマスターとなっているDBサーバーは削除できません。すべてのリードレプリカを削除してからマスターDBサーバーを削除してください。
リードレプリカへの更新
- リードレプリカは読み出し専用(書き込み不可)のため、更新可能にできません。
- データの更新はリードレプリカ元のDBサーバーで行ってください。
冗長化機能との関係
- 冗長化機能のオン・オフに関わらず、DBサーバーからリードレプリカを作成できます。
- 冗長化機能によって継続性・可用性を高められますが、冗長化機能(データ優先)で作成された待機系サーバーはリードレプリカ(MySQL)のように読み出しクエリを受け付けられません。
- 冗長化機能(データ優先)がオンのDBサーバーにリードレプリカを作成している状況で、フェイルオーバーで主系から待機系への切り替わりが発生すると、リードレプリカはレプリケーション先を待機系の DB サーバーに切り替えます。
MySQLエンジン使用中の障害時にbinlogのイベントがフラッシュされていなかった場合
レプリケーション先の切り替えがうまくいかない場合があります。そのような場合には、一度リードレプリカを削除した上で再作成してください。
MySQL 5.6の場合 | ニフクラ RDBにて、DBパラメーターをsync-binlog=1、innodb_support_xa=1に設定しており、お客様はこの値を変更できません。 |
MySQL 5.7の場合 | ニフクラ RDBにて、DBパラメーターをsync-binlog=1、innodb_support_xa=1に設定しており、お客様はこの値を変更できません。 |
MySQL 8.0の場合 | ニフクラ RDBにて、DBパラメーターをsync-binlog=1、innodb_support_xa=1に設定しており、お客様はinnodb_support_xaの値を変更できません。 |
自動バックアップ機能との関係
- リードレプリカを作成するには、自動バックアップが有効であり、初回の自動バックアップが作成されている必要があります。
- 既存のDBサーバーに対してリードレプリカを作成するには、あらかじめ自動バックアップ機能を有効にし、初回の自動バックアップが終わるまで待つ必要があります。
- 自動バックアップが有効なDBサーバーを作成した場合にも同様に、初回の自動バックアップが作成されてから、リードレプリカを作成してください。
- リードレプリカのマスターとなっているDBサーバーの自動バックアップ機能は無効にできません。リードレプリカを削除した上で自動バックアップ機能を無効にしてください。
※有効な自動バックアップが作成されていない場合、自動バックアップを取得してからリードレプリカ作成を行います。
PostgreSQLエンジンでリードレプリカを利用する際の注意事項
PostgreSQLエンジンでリードレプリカを利用するには、下記に注意してください。
リードレプリカ作成時の制限
- マスターとする予定のDBサーバーより、DBサーバータイプのスペックが低いリードレプリカは作成できません。
- マスターのサーバータイプを変更中の場合は、変更前と変更後でスペックが高い方のサーバータイプがマスターとなるDBのスペックとなります。
DBサーバー設定変更時の制限
- リードレプリカのDBパラメーターグループは変更できません。
- リードレプリカのDBサーバー設定変更で、DBサーバータイプをマスターよりスペックの低いものにはできません。
- リードレプリカのマスターとなっているDBサーバーのDBパラメーターグループの変更は行えません。
- リードレプリカのマスターとなっているDBサーバーのDBサーバータイプを、リードレプリカよりスペックの高いものへ変更できません。
DBパラメーターグループ編集時の制限
- リードレプリカおよびそのマスターとなっているDBサーバーに適用された、DBパラメーターグループの「max_connections/max_prepared_transactions/max_locks_per_transaction」は値を変更できません。
DBパラメーターグループリセット時の制限
- リードレプリカおよびそのマスターとなっているDBサーバーに適用された、DBパラメーターグループはリセットできません。