-
Notifications
You must be signed in to change notification settings - Fork 72
Description
Describe the bug
We are using this driver together with MariaDB driver to connect to an AWS Aurora MySQL 5.7 cluster using readWriteSplitting with an internal HikariCP connection pool. It works fine if the cluster is not deployed with blue/green deployment, but if it was deployed using blue/green deployment then connections to the reader fail due to unknown host. The host name that the driver tries to connect to contains "green" or "blue", but no such host name can be resolved.
Note that the actual blue/green deployment took place a long time ago, and no switch is performed related to the time of this issue.
Expected Behavior
We expect the readWriteSplitting plugin to use hostnames for the reader replicas that can actually be resolved, so that the internal connection pools for read-only connections are populated.
What plugins are used? What other connection properties were set?
Plugins: readWriteSplitting,failover,efm
Current Behavior
The driver seems to use data from the @@aurora_server_id to generate fqdn to connect to, but since the instances seem to retain server-ids from the blue/green deployment the fqdn is not valid and it fails to connect.
2023-10-11 09:05:04.643 INFO 1 --- [ dbThreadPool-1] com.zaxxer.hikari.HikariDataSource : hikari-db-readonly-pool - Starting...
2023-10-11 09:05:05.742 ERROR 1 --- [ dbThreadPool-1] com.zaxxer.hikari.pool.HikariPool : hikari-db-readonly-pool - Exception during pool initialization.
java.sql.SQLNonTransientConnectionException: Socket fail to connect to host:address=(host=production-main-1-green-zymnmc.cxl<redacted>.rds.amazonaws.com)(port=3306)(type=primary). production-main-1-green-zymnmc.cxl<redacted>.rds.amazonaws.com
at org.mariadb.jdbc.client.impl.ConnectionHelper.connectSocket(ConnectionHelper.java:137)
at org.mariadb.jdbc.client.impl.StandardClient.<init>(StandardClient.java:99)
at org.mariadb.jdbc.Driver.connect(Driver.java:70)
at org.mariadb.jdbc.Driver.connect(Driver.java:101)
at org.mariadb.jdbc.Driver.connect(Driver.java:27)
at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138)
at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:364)
at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:206)
at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:476)
at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561)
at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:115)
at com.zaxxer.hikari.HikariDataSource.<init>(HikariDataSource.java:81)
at software.amazon.jdbc.HikariPooledConnectionProvider.createHikariDataSource(HikariPooledConnectionProvider.java:329)
at software.amazon.jdbc.HikariPooledConnectionProvider.lambda$connect$3(HikariPooledConnectionProvider.java:198)
at software.amazon.jdbc.util.SlidingExpirationCache.lambda$computeIfAbsent$0(SlidingExpirationCache.java:81)
at java.base/java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1708)
at software.amazon.jdbc.util.SlidingExpirationCache.computeIfAbsent(SlidingExpirationCache.java:78)
at software.amazon.jdbc.HikariPooledConnectionProvider.connect(HikariPooledConnectionProvider.java:196)
at software.amazon.jdbc.plugin.DefaultConnectionPlugin.connectInternal(DefaultConnectionPlugin.java:155)
at software.amazon.jdbc.plugin.DefaultConnectionPlugin.connect(DefaultConnectionPlugin.java:148)
at software.amazon.jdbc.ConnectionPluginManager.lambda$connect$4(ConnectionPluginManager.java:281)
at software.amazon.jdbc.ConnectionPluginManager.lambda$makePluginChainFunc$0(ConnectionPluginManager.java:182)
at software.amazon.jdbc.ConnectionPluginManager.lambda$null$1(ConnectionPluginManager.java:186)
at software.amazon.jdbc.plugin.efm.HostMonitoringConnectionPlugin.connectInternal(HostMonitoringConnectionPlugin.java:279)
at software.amazon.jdbc.plugin.efm.HostMonitoringConnectionPlugin.connect(HostMonitoringConnectionPlugin.java:274)
at software.amazon.jdbc.ConnectionPluginManager.lambda$connect$4(ConnectionPluginManager.java:281)
at software.amazon.jdbc.ConnectionPluginManager.lambda$makePluginChainFunc$2(ConnectionPluginManager.java:186)
at software.amazon.jdbc.ConnectionPluginManager.lambda$null$1(ConnectionPluginManager.java:186)
at software.amazon.jdbc.plugin.staledns.AuroraStaleDnsHelper.getVerifiedConnection(AuroraStaleDnsHelper.java:62)
at software.amazon.jdbc.plugin.failover.FailoverConnectionPlugin.connectInternal(FailoverConnectionPlugin.java:727)
at software.amazon.jdbc.plugin.failover.FailoverConnectionPlugin.connect(FailoverConnectionPlugin.java:720)
at software.amazon.jdbc.ConnectionPluginManager.lambda$connect$4(ConnectionPluginManager.java:281)
at software.amazon.jdbc.ConnectionPluginManager.lambda$makePluginChainFunc$2(ConnectionPluginManager.java:186)
at software.amazon.jdbc.ConnectionPluginManager.lambda$null$1(ConnectionPluginManager.java:186)
at software.amazon.jdbc.plugin.readwritesplitting.ReadWriteSplittingPlugin.connectInternal(ReadWriteSplittingPlugin.java:146)
at software.amazon.jdbc.plugin.readwritesplitting.ReadWriteSplittingPlugin.connect(ReadWriteSplittingPlugin.java:141)
at software.amazon.jdbc.ConnectionPluginManager.lambda$connect$4(ConnectionPluginManager.java:281)
at software.amazon.jdbc.ConnectionPluginManager.lambda$makePluginChainFunc$2(ConnectionPluginManager.java:186)
at software.amazon.jdbc.ConnectionPluginManager.executeWithSubscribedPlugins(ConnectionPluginManager.java:164)
at software.amazon.jdbc.ConnectionPluginManager.connect(ConnectionPluginManager.java:278)
at software.amazon.jdbc.PluginServiceImpl.connect(PluginServiceImpl.java:438)
at software.amazon.jdbc.plugin.readwritesplitting.ReadWriteSplittingPlugin.getNewReaderConnection(ReadWriteSplittingPlugin.java:516)
at software.amazon.jdbc.plugin.readwritesplitting.ReadWriteSplittingPlugin.initializeReaderConnection(ReadWriteSplittingPlugin.java:486)
at software.amazon.jdbc.plugin.readwritesplitting.ReadWriteSplittingPlugin.switchToReaderConnection(ReadWriteSplittingPlugin.java:449)
at software.amazon.jdbc.plugin.readwritesplitting.ReadWriteSplittingPlugin.switchConnectionIfRequired(ReadWriteSplittingPlugin.java:326)
at software.amazon.jdbc.plugin.readwritesplitting.ReadWriteSplittingPlugin.execute(ReadWriteSplittingPlugin.java:226)
at software.amazon.jdbc.ConnectionPluginManager.lambda$execute$3(ConnectionPluginManager.java:243)
at software.amazon.jdbc.ConnectionPluginManager.lambda$makePluginChainFunc$2(ConnectionPluginManager.java:186)
at software.amazon.jdbc.ConnectionPluginManager.executeWithSubscribedPlugins(ConnectionPluginManager.java:164)
at software.amazon.jdbc.ConnectionPluginManager.execute(ConnectionPluginManager.java:240)
at software.amazon.jdbc.util.WrapperUtils.executeWithPlugins(WrapperUtils.java:219)
at software.amazon.jdbc.util.WrapperUtils.runWithPlugins(WrapperUtils.java:161)
at software.amazon.jdbc.wrapper.ConnectionWrapper.setReadOnly(ConnectionWrapper.java:338)
at com.zaxxer.hikari.pool.ProxyConnection.setReadOnly(ProxyConnection.java:423)
at com.zaxxer.hikari.pool.HikariProxyConnection.setReadOnly(HikariProxyConnection.java)
at org.springframework.jdbc.datasource.DataSourceUtils.prepareConnectionForTransaction(DataSourceUtils.java:190)
at org.springframework.orm.jpa.vendor.HibernateJpaDialect.beginTransaction(HibernateJpaDialect.java:153)
at org.springframework.orm.jpa.JpaTransactionManager.doBegin(JpaTransactionManager.java:421)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.startTransaction(AbstractPlatformTransactionManager.java:400)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:373)
at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:595)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:382)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:707)
<redacted>
at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1768)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
at java.base/java.lang.Thread.run(Thread.java:833)
Caused by: java.net.UnknownHostException: production-main-1-green-zymnmc.cxl<redacted>.rds.amazonaws.com
at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:572)
at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327)
at java.base/java.net.Socket.connect(Socket.java:633)
at org.mariadb.jdbc.client.impl.ConnectionHelper.connectSocket(ConnectionHelper.java:131)
... 71 common frames omitted
Reproduction Steps
Connect to AWS Aurora MySQL cluster that has been deployed with blue/green deployment with at least one reader replica using the plugins above.
Possible Solution
Maybe stripping out any -blue-xxxx and -green-xxxx from the hostname, at least as a retry if it fails? Or are they needed during the switch-over in case a new blue/green deployment?
Additional Information/Context
Cluster:
writer endpoint: production-main.cluster-cxl.rds.amazonaws.com
reader endpoint: production-main.cluster-ro-cxl.rds.amazonaws.com
Writer instance:
DB identifier: production-main-0
Engine: 5.7.mysql_aurora.2.11.2
Endpoint: production-main-0.cxl.rds.amazonaws.com
@@aurora_server_id: production-main-0-green-rcffig
Reader instance:
DB identifier: production-main-1
Engine: 5.7.mysql_aurora.2.11.2
Endpoint: production-main-1.cxl.rds.amazonaws.com
@@aurora_server_id: production-main-1-green-zymnmc
The AWS Advanced JDBC Driver version used
2.2.4
JDK version used
Amazon Corretto 17.0.8.1
Operating System and version
Linux