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'
錯誤。我可以解決此問題的唯一方法是將以下內容添加回主機文件: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 連接時,由 localhost 創建的匿名使用者帳戶mysql_install_db
將優先ro_ml_core
。結果,ro_ml_core
將被視為匿名使用者。原因是匿名使用者帳戶比帳戶具有更具體的主機列值'ro_ml_core'@'%'
,因此在使用者表排序順序中排在前面。關於排序順序:
伺服器使用排序規則,首先對具有最特定主機值的行進行排序。文字主機名和 IP 地址是最具體的。(文字 IP 地址的特殊性不受它是否具有網路遮罩的影響,因此
192.168.1.13
被192.168.1.0/255.255.255.0
認為是同樣特殊的。)模式'%'
意味著"any host"
並且是最不特殊的。空字元串''
也意味著"any host"
但在 之後排序'%'
。具有相同 Host 值的行首先按最具體的 User 值排序(空白 User 值表示"any user"
最不具體)。
發生這種情況是因為在您的 resolv.conf 中您沒有
search foo.com
當 mysql 正在查找
store-ro
, 時foo.com
不會附加到它。另一種方法是使用 fqdn。用於store-ro.foo.com
連接。手冊頁片段。
resolv.conf(5)
搜尋 主機名查找的搜尋列表。搜尋列表一般由本地域名確定;預設情況下,它只包含本地域名。這可以通過在搜尋關鍵字之後列出所需的域搜尋路徑來更改,其中空格或製表符分隔名稱。解析器查詢中的點數少於 ndots(預設為 1)將依次嘗試使用搜尋路徑的每個組件,直到找到匹配項。對於具有多個子域的環境,請閱讀下面的選項 ndots:n 以避免中間人攻擊和 root-dns-servers 的不必要流量。請注意,如果列出的域的伺服器不是本地的,此過程可能會很慢並且會產生大量網路流量,並且如果其中一個域沒有可用的伺服器,則查詢將超時。