【问题标题】:GCP ProxySQL and BasicDataSource connection poolGCP ProxySQL 和 BasicDataSource 连接池
【发布时间】:2019-05-21 10:19:41
【问题描述】:

我对 java BasicDataSource 连接池有疑问。

我的 ProxySql 已在我的所有 DataProc 计算引擎上正确配置,如果我尝试使用 sqlclient 连接到我的 CloudSql 实例,它可以正常工作。 当我尝试从我的连接池连接到我的 CloudSql 时,使用此连接字符串配置:pooljdbc:mysql://127.0.0.1/my_db?serverTimezone=UTC,我收到此错误:

Cannot create PoolableConnectionFactory (Access denied for user 'myuser'@'localhost' (using password: YES))
org.apache.commons.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory (Access denied for user 'myuser'@'localhost' (using password: YES))
    at org.apache.commons.dbcp.BasicDataSource.createPoolableConnectionFactory(BasicDataSource.java:1549)

而且是正确的,因为 proxySQL tcp 连接在 127.0.0.1 上,而不是在 localhost(unix 套接字)上。

我不明白为什么 BasicDataSource 尝试连接 localhost 而不是 127.0.0.1,因为我在连接字符串中配置了。

非常感谢任何帮助。

【问题讨论】:

    标签: google-cloud-platform connection-pooling sqldatasource google-cloud-dataproc cloud-sql-proxy


    【解决方案1】:

    字符串'myuser'@'localhost' 指的是您的登录身份,而不是服务器连接字符串;例如,如果您从名为 foo-instance 的机器尝试连接,即使您使用指定远程 IP 地址的连接字符串,您的登录名也会是 'myuser'@'foo-instance'。虽然使用 sqlclient 的直接连接将根据指定的服务器主机名以不同的方式解析源主机名,但这是一个不应该依赖的怪癖。特别是,在您的情况下,ProxySQL 服务将代表您执行操作,因此源主机名将来自 ProxySQL 实例,而不是来自您的连接字符串。

    您可能希望分享有关 ProxySQL 配置的更多详细信息,但如果您使用默认值,则您的 PROXYSQL_HOSTNAME 将设置为 localhost;您可以尝试确保您的 PROXYSQL_HOSTNAME 设置为 127.0.0.1

    有趣的是,根据粗略的测试,创建由127.0.0.1 标识的用户授权似乎对登录主机更具限制性,而为localhost 创建授权允许127.0.0.1localhost 用于连接主机名:

    MariaDB [(none)]> create user 'dhuo'@'127.0.0.1' identified by 'dhuopass';
    ...
    $ mysql -h localhost -pdhuopass
    ERROR 1045 (28000): Access denied for user 'dhuo'@'localhost' (using password: YES)
    $ mysql -h 127.0.0.1 -pdhuopass
    Welcome to the MariaDB monitor.  Commands end with ; or \g.
    ...
    MariaDB [(none)]> drop user dhuo@127.0.0.1
    MariaDB [(none)]> create user 'dhuo'@'localhost' identified by 'dhuopass';
    ...
    $ mysql -h localhost -pdhuopass
    Welcome to the MariaDB monitor.  Commands end with ; or \g.
    $ mysql -h 127.0.0.1 -pdhuopass
    Welcome to the MariaDB monitor.  Commands end with ; or \g.
    

    通常最好将您的用户授权配置为来自localhost 而不是127.0.0.1,以便最有可能支持任一入站主机名。

    【讨论】:

    • 感谢 Dennis 的回答,我尝试将 PROXYSQL_HOSTNAME 设置为 localhost 的 env 变量,但没有任何改变。将 PROXYSQL_HOSTNAME 设置为环境变量是否正确?如果不是,在哪里可以找到安装在每台 dataproc 机器上的 CloudProxySQL 的此设置?
    • 您使用的是哪个 ProxySQL? Dataproc 不会在其任何初始化操作或基础映像中安装 ProxySQL,您使用的是这个吗? github.com/sysown/proxysql/wiki/ProxySQL-Configuration 通常人们不应该需要 ProxySQL,但我假设你有特定的理由使用它
    • 我正在使用这个:github.com/GoogleCloudPlatform/dataproc-initialization-actions/… 在我的每台 dataproc 集群机器上的初始化脚本。我正在使用代理连接到具有公共 IP 的 GCP CloudSql。我的dataproc集群是在我需要的时候创建然后销毁的,所以我不知道DataProc机器的ip地址,也不能在CloudSql实例上手动配置。
    • 哦,我明白了,所以您没有使用 ProxySQL,您使用的是 CloudSQL 代理。您是如何在代码中设置连接池的,为什么需要连接到 127.0.0.1 而不是 localhost?
    • 嗨丹尼斯,我用这个脚本安装了代理:github.com/klaus82/gcp_scripts/blob/master/… 我需要的是从我的 Dataproc Compute 引擎连接到 CloudSql,在 127.0.0.1 或 localhost 上没关系。我尝试使用 localhost 在 CloudSql 上创建一个用户(如您所建议的那样),但没有用。
    猜你喜欢
    • 2018-09-08
    • 2019-01-25
    • 2021-09-11
    • 2012-01-15
    • 1970-01-01
    • 2017-07-29
    • 1970-01-01
    • 2014-10-31
    • 2011-01-26
    相关资源
    最近更新 更多