Назад | Перейти на главную страницу

MySQL - Проблема с именем хоста

У меня возникла необычная проблема с рабочим сервером mysql. В настоящее время у меня есть только два производственных сервера, поэтому у меня были все записи имени хоста сервера в /etc/hosts файлы на каждом сервере. Несколько дней назад я настроил зону DNS в надежде, что смогу удалить ручные записи в /etc/hosts файл.

Из-за того, что у меня только два производственных сервера, я настраиваю свой DNS так, чтобы у каждого сервера было настоящее имя хоста, которое также может быть псевдонимом, чтобы я мог контролировать соединения, просто обновляя записи DNS. Например, server1 размещает httpd и mysql, поэтому в моей зоне DNS у меня есть server1 с записью A 4.4.4.2 и store-ro с псевдонимом server1. Очевидно 4.4.4.2 - это не мой настоящий ip, только демонстрационный.

После некоторой настройки я могу подключиться к локальному экземпляру mysql через командную строку, но мое приложение продолжает бросать Unknown MySQL server host 'store-ro' ошибки. Единственный способ исправить эту проблему - это добавить в файл hosts следующее:

127.0.0.1 store-ro
# or
4.4.4.2 store-ro

(Не уверен, что это имеет значение, но мое приложение использует Zend_Db для подключения к базе данных.)

Таким образом, приложение может подключиться к серверу, если я введу IP-адрес обратной связи или фактический IP-адрес, но не будет работать, если будет удален из файла hosts, поэтому я подумал, что, возможно, это проблема DNS, но похоже, что сервер может разрешить имя хоста хорошо:

$ -> nslookup store-ro

Server:   72.14.179.5
Address:  72.14.179.5#53

Non-authoritative answer:
store-ro.example.com    canonical name = server1.example.com.
Name:   server1.example.com
Address: 4.2.2.2

У меня включен SELinux, и беглый взгляд на соответствующие настройки соединения httpd кажется верным:

$ -> getsebool -a | ack httpd

httpd_can_network_connect_db --> on
httpd_can_network_connect --> on

Плюс нет записей в /var/log/audit/audit.log.

Мое имя хоста установлено правильно:

$ -> hostname

server1

Пользовательские разрешения MySQL:

mysql> select host, user from user;
+-----------+-------------+
| host      | user        |
+-----------+-------------+
| %         | ro_user_1   |
| %         | ro_user_2   |

И /etc/resolve.conf:

search example.com
nameserver 72.14.179.5
nameserver 72.14.188.5

И /etc/hosts:

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

4.4.4.2 server1 server1.example.com # This shouldn't be necessary with DNS setup?

Единственное, о чем я могу думать, это то, что псевдоним cname может вызывать проблему, но я сомневаюсь в этом. Любая помощь приветствуется.

--Обновить--

Забыл добавить фактическую ошибку: SQLSTATE[HY000] [2005] Unknown MySQL server host 'store-ro'

По запросу это полная строка из таблицы mysql:

mysql> select * from user where user like '%core%'\G
*************************** 1. row ***************************
Host: %
User: ro_ml_core
Password: *2B5FEA45B69826783FD6F8601A9AFB1CFE916D52
Select_priv: N
Insert_priv: N
Update_priv: N
Delete_priv: N
Create_priv: N
Drop_priv: N
Reload_priv: N
Shutdown_priv: N
Process_priv: N
File_priv: N
Grant_priv: N
References_priv: N
Index_priv: N
Alter_priv: N
Show_db_priv: N
Super_priv: N
Create_tmp_table_priv: N
Lock_tables_priv: N
Execute_priv: N
Repl_slave_priv: N
Repl_client_priv: N
Create_view_priv: N
Show_view_priv: N
Create_routine_priv: N
Alter_routine_priv: N
Create_user_priv: N
Event_priv: N
Trigger_priv: N
Create_tablespace_priv: N
ssl_type:
ssl_cipher:
x509_issuer:
x509_subject:
max_questions: 0
max_updates: 0
max_connections: 0
max_user_connections: 0
plugin:
authentication_string: NULL
mysql> select User,Host from user where user like '%core%';
+------------+-----------+
| User       | Host      |
+------------+-----------+
| ro_ml_core | %         |
| ro_ml_core | localhost |
+------------+-----------+
2 rows in set (0.00 sec)

Необходимо наличие обоих (% и localhost) аккаунты для ro_ml_core чтобы иметь возможность подключаться из любого места как ro_ml_core. Без учетной записи localhost учетная запись анонимного пользователя для localhost, созданная mysql_install_db будет иметь приоритет, когда ro_ml_core подключается с локального хоста. В следствии, ro_ml_core будет рассматриваться как анонимный пользователь. Причина этого в том, что учетная запись анонимного пользователя имеет более конкретное значение столбца Host, чем 'ro_ml_core'@'%' account и, таким образом, идет раньше в порядке сортировки пользовательской таблицы.

О порядке сортировки:

Сервер использует правила сортировки, которые сначала упорядочивают строки с наиболее конкретными значениями Host. Буквальные имена хостов и IP-адреса являются наиболее точными. (Специфика буквального IP-адреса не зависит от того, есть ли у него сетевая маска, поэтому 192.168.1.13 и 192.168.1.0/255.255.255.0 считаются одинаково специфичными.) '%' средства "any host" и наименее конкретен. Пустая строка '' также значит "any host" но сортирует после '%'. Строки с одинаковым значением Host упорядочиваются в первую очередь с наиболее конкретными значениями User (пустое значение User означает "any user" и наименее конкретен).

Итак, я наконец смог подключиться к серверу mysql через приложение. После реализации предложения Суку я перезапустил службу mysql, но все еще не работал. Итак, я решил, что перезапущу службу httpd, и приложение снова смогло подключиться. Кажется, что если я удалю запись в / etc / hosts и не перезапущу службу httpd, у нее возникнут проблемы с подключением, но если я удалю запись и перезапускаю, она работает. Даже добавление записи в / etc / hosts не работало, пока я не перезапустил httpd.

Это происходит потому, что в вашем resolv.conf у вас нет

search foo.com

Когда mysql выполняет поиск store-ro, foo.com не добавляется к нему. Другой способ сделать это - использовать fqdn. Использовать store-ro.foo.com для подключения.

Фрагмент справочной страницы. resolv.conf(5)


поиск Список поиска для поиска имени хоста. Список поиска обычно определяется по локальному доменному имени; по умолчанию он содержит только локальное доменное имя. Это можно изменить, указав желаемый путь поиска домена после ключевого слова поиска с пробелами или табуляцией, разделяющими имена. Запросы преобразователя, содержащие менее ndots точек (по умолчанию 1), будут выполняться по очереди с использованием каждого компонента пути поиска до тех пор, пока не будет найдено совпадение. Для сред с несколькими поддоменами ознакомьтесь с опциями ndots: n ниже, чтобы избежать атак типа «злоумышленник в середине» и ненужного трафика для корневых DNS-серверов. Обратите внимание, что этот процесс может быть медленным и будет генерировать большой сетевой трафик, если серверы для перечисленных доменов не являются локальными, и что запросы будут истекать, если для одного из доменов нет доступных серверов. Список поиска в настоящее время ограничен шестью доменами общей длиной 256 символов.