2017年11月29日水曜日

Aurora でMaria DB のJDBC Driver を選択した時にでるエラーの対処

まず、RDS の構成は以下の図のようになっています。

この構成のDB に、以下のMySQL 用のJDBC Driver を指定してアクセスしていたのですが、Maria DB のJDBC Driver に変更し、Maria DB のJDBC Driver でしかできないFailover の機能を利用することにしました。

MySQL
jdbc:mysql://aurora-cluster.abc.ap-northeast-1.rds.amazonaws.com:3306/db
Maria DB
jdbc:mysql:aurora://aurora-cluster.abc.ap-northeast-1.rds.amazonaws.com:3306/db

コーディングは、DBCP を利用していたので、以下のようにDriver を選択して、上記のURL にアクセスするだけです。
org.apache.commons.dbcp2.BasicDataSource.setDriverClassName( "org.mariadb.jdbc.Driver" );
この変更をしたら、以下のエラーが発生しました。
java.sql.SQLException: Cannot create PoolableConnectionFactory (Communications link failure with primary. No active connection found for master. )
at org.apache.commons.dbcp2.BasicDataSource.createPoolableConnectionFactory(BasicDataSource.java:2294)
at org.apache.commons.dbcp2.BasicDataSource.createDataSource(BasicDataSource.java:2039)
at org.apache.commons.dbcp2.BasicDataSource.getConnection(BasicDataSource.java:1533)
どうやらmaster のdatabase が見つからないようです。
以下のサイトを参照。
https://dev.classmethod.jp/cloud/faster-failover-by-aurora-jdbc-driver/
どうやら、アクセス先が間違っているようなので、以下のようClusterEndopoint の次に、カンマを入れて、ReaderEndpoint を指定したら、接続できました。
jdbc:mysql:aurora://aurora-cluster.abc.ap-northeast-1.rds.amazonaws.com:3306,jdbc:mysql:aurora://aurora-cluster.ro-abc.ap-northeast-1.rds.amazonaws.com:3306/db
ちなみに、レプリカを立てない構成で上記のようにread only のDB を指定すると、先にでてきたエラーのmaster がreplica になってエラーがでます。
java.sql.SQLException: Cannot create PoolableConnectionFactory (Communications link failure with primary. No active connection found for replica. )
あと、微妙にハマったのは、MySQL のユーザを新規で生成した後、権限を付与しないためにエラーが発生していた。
新規でユーザ生成時は、GRANT コマンドまで実施すること。

Sample
CREATE USER 'user'@'%' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON database.table to 'user'@'%' IDENTIFIED BY 'password';
権限チェックしたい場合は以下のコマンドで。
SHOW GRANTS FOR 'user'@'%';