MaxScale блокирует прямое подключение к базе данных
У меня есть 2 узла mariadb кластера с одним балансировщиком нагрузки maxscale.
maxscale блокирует соединение, если я хочу подключиться напрямую к базе данных: например, так:
mysql -h 35.300.208.100 -u finn -p
работает, и если я тогда делаю USE test
я могу сделать все с базой данных "тест". так что права правильные.
но если сделать mysql -h 35.300.208.100 -u finn -p test
я получаю ошибку:
ERROR 1045 (28000): Access denied for user 'finn'@'188.68.43.150' (using password: YES) to database 'test'
Так что, если я делаю то же самое на узлах с localhost, все работает нормально.
1 ответ
Большую часть времени вы получите ERROR 1045 (28000): Access denied
когда гранты в базе данных не содержат совпадающих грантов как для IP-адреса клиента, так и для MaxScale IP.
Обычный способ решения этой проблемы:
- казнить
SHOW GRANTS
в базе данных с клиентского сервера - казнить
SHOW GRANTS
в базе данных с сервера MaxScale - Сравните выходные данные двух запросов и убедитесь, что они идентичны
Этого обычно достаточно, чтобы обнаружить любые проблемы с грантами в базе данных.
Другим способом устранения ошибок такого рода является выполнение запроса, который MaxScale использует для загрузки пользователей базы данных. Точный SQL для этих запросов можно найти в вики MaxScale на GitHub. Для MaxScale 2.1 и новее это будет:
SELECT u.user, u.host, d.db, u.select_priv, u.password
FROM mysql.user AS u LEFT JOIN mysql.db AS d
ON (u.user = d.user AND u.host = d.host)
UNION
SELECT u.user, u.host, t.db, u.select_priv, u.password
FROM mysql.user AS u LEFT JOIN mysql.tables_priv AS t
ON (u.user = t.user AND u.host = t.host);
Это должно вернуть набор результатов, содержащий данные аутентификации, которые использует MaxScale. Вот пример того, что запрос может вернуть:
+---------------+-----------+------+-------------+-------------------------------------------+
| user | host | db | select_priv | password |
+---------------+-----------+------+-------------+-------------------------------------------+
| root | localhost | NULL | Y | |
| maxuser | 127.0.0.1 | NULL | Y | *5EDBD32E469DAE0CE10E6999C3899DEFCB9F12E0 |
| root | % | NULL | Y | |
| maxuser | % | NULL | Y | *5EDBD32E469DAE0CE10E6999C3899DEFCB9F12E0 |
| skysql | 127.0.0.1 | NULL | Y | *85058F5DEAD82AE3507664C2C11BDA7B1827B80D |
| skysql | % | NULL | Y | *85058F5DEAD82AE3507664C2C11BDA7B1827B80D |
| test | % | NULL | Y | *94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29 |
| stackru | % | test | N | *5635C63172887A7D7C0828876228A5E4DC523969 |
| stackru | % | NULL | N | *5635C63172887A7D7C0828876228A5E4DC523969 |
+---------------+-----------+------+-------------+-------------------------------------------+
select_priv
сообщает, разрешено ли пользователю подключаться к любой базе данных по умолчанию. Если установлено N
, то значение в db
столбец является единственной базой данных, которую клиент может использовать. Как видно из результата примера, 'stackru'@'%'
Пользователь может подключаться без базы данных по умолчанию или с test
база данных по умолчанию.