GCP ProxySQL и пул соединений BasicDataSource - PullRequest
3 голосов
/ 21 мая 2019

У меня проблема с пулом соединений Java BasicDataSource.

Мой ProxySql правильно настроен на всех моих вычислительных машинах DataProc, если я пытаюсь подключиться к своему экземпляру CloudSql с помощью sqlclient, он работает правильно. Когда я пытаюсь подключиться к своему 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)

И это правильно, потому что tcp-соединение proxySQL установлено на 127.0.0.1, а не на localhost (сокет unix).

Я не понимаю, почему BasicDataSource пытается подключиться к localhost, а не к 127.0.0.1, как я настроил в строке подключения.

Любая помощь очень ценится.

1 Ответ

0 голосов
/ 23 мая 2019

Строка '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.1, так и localhost для имен хостов соединения:

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, чтобы иметь наилучшую возможность поддержки любого входящего имени хоста.

...