У меня возникла необычная проблема с рабочим сервером 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 символов.