4

私のアプリケーションは、2 つのMySQL 5.6 (実際にはAmazon Aurora ) インスタンスのフェイルオーバー クラスターに接続します。アクティブ ノードは常に書き込みアクセス可能ですが、パッシブ ノードはモードで実行されています (これは、すべてのスレーブ ノードがデフォルトで書き込みアクセス可能である正規のMySQLread_onlyフェールオーバー クラスターとは異なります)。Amazon RDSは、常にアクティブなMySQLノードの IP アドレスを指すシンボリック DNS 名を提供します。

フェールオーバー プロセス中に、以前のマスターはread_onlyモードで再起動されますが、以前のパッシブ ノードは書き込みアクセス可能になり、マスターに昇格します。また、DNS レコードが変更され、クラスターの DNS 名が新しいマスター ノードを指すようになりました。

Java 側で DNS キャッシングを完全に無効にしても (sun.net.inetaddr.ttlまたはを介し​​てnetworkaddress.cache.ttl)、OS 固有の DNS キャッシングは引き続き有効であるため、データベースのフェイルオーバー後に DBCP プールが読み取り専用のMySQLインスタンスへの接続でいっぱいになることになります。これらの接続は ですvalid。つまり、フェイルオーバーの完了、DNS キャッシュの有効期限が切れる前に取得されています。さらに、そのような接続にはreadOnlyフラグが設定されていないため、DML を実行するまで読み取り専用インスタンスと通信しているかどうかを判断できませんER_OPTION_PREVENTS_STATEMENTsetReadOnly(false)フラグを呼び出して設定することで明示的に読み取り/書き込みモードに接続してもreadOnlyPropagatesToServer、ドライバーが送信するだけです。SET SESSION TRANSACTION READ WRITEこれにより、例外がスローされることはありません。

アプリケーション ロジックにできるだけ影響を与えずに、この問題を解決したいと考えています。これは、読み取り専用インスタンスへの接続を無効/閉じられた接続として扱う (つまり、プールから削除する) 方法があれば実現できます。

追加のロジックが関連付けられているような検証クエリを使用できますか? SHOW GLOBAL VARIABLES LIKE 'read_only'検証クエリが返すスカラー値に基づいて、接続に関してプールの動作に影響を与えることは可能ですか?

4

1 に答える 1

4

次の検証クエリを使用できます。

select case when @@read_only = 0 then 1 else (select table_name from information_schema.tables) end as `1`

データベースが読み取り専用モードで実行されている場合、クエリは失敗します。

ERROR 1242 (21000): Subquery returns more than 1 row

Amazon Auroraはクラスター内のリーダー エンドポイントではinnodb_read_onlyなく設定するため、検証クエリは次のように書き換えることができます。read_only

select case when @@read_only + @@innodb_read_only = 0 then 1 else (select table_name from information_schema.tables) end as `1`

この答えに触発されました。

于 2016-09-19T00:01:07.497 に答える