我目前正在使用bitnami的helm charts(此处(,并尝试在GCP中使用Cloud SQL实例。无论我构建什么连接字符串,我都会在连接到数据库时遇到各种连接错误。这会导致初始pod启动失败,并且永远不会完全初始化。
spring-cloud-dataflow
似乎没有与spring-cloud-gcp
捆绑在一起,因此无法通过实例名称进行配置,因此我认为我们需要使用私有IP地址,该地址每次都会失败。
对于下面的测试,创建了一个CloudSQLMySQL实例,并创建了CloudSQLPostgresql实例。
MySQL实例的图表配置1:(为简洁起见,省略了用户名和密码(
mariadb.enabled=false
externalDatabase.dataflow.url=jdbc:mysql://<privateip>/dataflow?useSSL=false
externalDatabase.dataflow.username=root
externalDatabase.driver=org.mariadb.jdbc.Driver
结果(使用端口0或端口3306(:
java.sql.SQLNonTransientConnectionException: Could not connect to address=(host=<private IP>)(port=0)(type=master) : Could not connect to <private IP>:0 : unexpected end of stream, read 0 bytes from 4 (socket was closed by server)
Caused by: java.io.EOFException: unexpected end of stream, read 0 bytes from 4 (socket was closed by server)
图表配置2(postgresql实例(:
mariadb.enabled=false
externalDatabase.dataflow.url=jdbc:postgresql://<Private IP>:5432/
externalDatabase.dataflow.username=postgres
externalDatabase.driver=org.postgresql.Driver
结果:
org.postgresql.util.PSQLException: The connection attempt failed.
Caused by: java.net.SocketException: Connection reset
我已经验证了我可以通过Squirrel SQL(用于postgresql(和MySQL工作台通过jdbc访问数据库。
除非spring-cloud-dataflow
与spring-cloud-gcp
一起发货,否则这永远不会起作用吗?
您需要使用Cloud SQL Proxy或Cloud SQL Java连接器。
这里有几个答案可以说明如何做到这一点:
- 从数据流作业连接到云SQL
- 使用代理(通过os.system(将DataFlow作业连接到云MySQL是否安全
此外,如果您的云SQL实例仅为私有IP,则需要确保您的数据流部署与云SQL实例位于同一专有网络中。对于公共IP实例,单独使用Java连接器或代理应该是可以的。