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, все работает нормально.

Это мой maxscale.cnf

1 ответ

Решение

Большую часть времени вы получите ERROR 1045 (28000): Access denied когда гранты в базе данных не содержат совпадающих грантов как для IP-адреса клиента, так и для MaxScale IP.

Обычный способ решения этой проблемы:

  1. казнить SHOW GRANTS в базе данных с клиентского сервера
  2. казнить SHOW GRANTS в базе данных с сервера MaxScale
  3. Сравните выходные данные двух запросов и убедитесь, что они идентичны

Этого обычно достаточно, чтобы обнаружить любые проблемы с грантами в базе данных.

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

Другие вопросы по тегам