Amazon Aurora DB クラスターを使用しているのですが、フェイルオーバー後に次のエラーが表示されます。
「MySQLサーバーは読み取り専用オプションで実行されているため、この文を実行できません」
このエラーの解決方法を教えてください。
簡単な説明
Amazon Aurora DB クラスターでマルチ AZ フェイルオーバーが発生すると、クラスターエンドポイントは自動的に更新され、ライターとリーダーの新しいロールが反映およびポイントされます。古いライターが再起動されてから、読み取り専用モードに設定され、既存のレプリカがプロモートされてライターになります。
読み取り専用のエラーメッセージが表示される場合は、リーダーのロールを持つ既存のノードを使用して、データ定義言語 (DDL)、データ操作言語 (DML)、またはデータ制御言語 (DCL) 操作を実行しようとしていることを意味します。Aurora MySQL では、次のように innodb_read_only 変数をチェックすることでこれを確認できます。
mysql> show variables where variable_name='innodb_read_only';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| innodb_read_only | ON |
+------------------+-------+
1 row in set (0.01 sec)
解決方法
クラスターライターのエンドポイントを利用する
Aurora クラスター内の DB インスタンスのロールは変更される可能性があるため、クラスターのライターエンドポイントを使用して、常に最新のライターを指していることを確認することをお勧めします。DB インスタンスエンドポイントまたは直接 IP アドレスを使用する場合、フェイルオーバーが発生したことに気付かない可能性があり、同じホストに再接続すると読み取り専用メッセージが表示されます。これにより、意図したとおりに DDL/DML の変更が実行されなくなります。
DNS を過度にキャッシュしない
スマートドライバを使用していない場合は、フェイルオーバーイベントが発生した後、DNS レコードの更新と伝播に依存します。Aurora DNS ゾーンは 5 秒という短い有効期限 (TTL) を用いるため、ネットワークとクライアント設定でこの期限をさらに延長しないことが重要です。DNS キャッシュは、オペレーティングシステム (OS)、ネットワークレイヤー、アプリケーションコンテナなど、アーキテクチャの複数のレイヤーで行われる可能性があります。これらの各レイヤーがどのように設定されているかを理解することが重要です。5 秒の TTL を超える意図しない DNS キャッシュが存在する場合は、フェイルオーバー後に古いライターに再接続する可能性があります。
Java Virtual Machines (JVM) は、無期限にDNSを過度にキャッシュできます。JVM は、ホスト名を IP アドレスに解決すると、指定された期間 (TTL) IP アドレスをキャッシュします。一部の設定では、JVM のデフォルト TTL は、JVM が再起動されるまで DNS エントリーを更新しないように設定されます。これにより、フェイルオーバー後に読み取り専用エラーが発生する可能性があります。この場合、定期的に更新されるように、小さな TTL を手動で設定することが重要です。
スマートドライバを使用する
Amazon Aurora DB クラスターエンドポイントは、DNS レコードの更新を自動的に伝播しますが、処理は即座に行われるわけではありません。これにより、データベースで発生したイベントへの応答が遅れる可能性があり、イベントがアプリケーションによって処理される可能性があります。スマートドライバは、ほぼリアルタイムの INFORMATION_SCHEMA.REPLICA_HOST_STATUS メタデータテーブルを通じて DB クラスターのトポグラフィーを使用します。これにより、接続を適切なロールにルーティングし、既存のレプリカ間で負荷分散を行うのに役立ちます。MariaDB コネクタ/J は、Aurora MySQLをネイティブサポートしているサードパーティーのスマートドライバの例です。
注 : スマートドライバでも、過度のDNSキャッシュの影響を受ける可能性があります。
接続しているインスタンスをテストする
Aurora 接続管理ハンドブックのベストプラクティスで説明されているように、スマートドライバを使用しない場合は、新しい接続を確立した後にログインしているインスタンスをテストし、理解する必要があります。これにより、正しいインスタンスに接続していることを確認できます。@@innodb_read_only 変数を使用して、ライターインスタンスまたは Aurora Reader に接続しているかどうかをテストできます。この例では、ライターに接続していることを意味する値 0 が示されています。
mysql> select @@innodb_read_only;
+--------------------+
| @@innodb_read_only |
+--------------------+
| 0 |
+--------------------+
1 row in set (0.00 sec)
関連情報
Amazon Aurora 接続管理
DNS 名検索用の JVM TTL の設定
DBA 接続管理ハンドブック