本文介紹在各種情況下如何自助解決串連不上RDS的問題。
在搭建業務情境調試的過程中,經常會出現無法串連RDS執行個體的情況,很多時候都是由於網路類型不統一、白名單未放對應IP等導致的。以下為最常見的原因和解決辦法。
網路類型不同
ECS執行個體採用Virtual Private Cloud,RDS執行個體採用傳統網路
解決辦法一(推薦):將RDS執行個體從傳統網路切換為VPC,具體操作請參見切換網路類型。
說明切換後,兩者必須處於同一個VPC,才能內網互連。
解決辦法二:重新購買傳統網路的ECS執行個體(ECS執行個體不支援從VPC遷移到傳統網路)。但是VPC比傳統網路更安全,建議您使用VPC。
解決辦法三:ECS執行個體使用RDS執行個體的公網串連地址串連RDS執行個體,即通過公網串連RDS執行個體。這種方式的效能、安全性、穩定性較差。
ECS執行個體採用傳統網路,RDS執行個體採用Virtual Private Cloud
解決辦法一(推薦):將ECS執行個體從傳統網路遷移到VPC。
說明切換後,兩者必須處於同一個VPC,才能內網互連。
解決辦法二:將RDS執行個體從VPC切換為傳統網路。但是VPC比傳統網路更安全,建議您使用VPC。
解決辦法三:使用ClassicLinkClassicLink功能,使傳統網路的ECS執行個體可以和VPC中的雲資源通過內網互連。
解決辦法四:ECS執行個體使用RDS執行個體的公網串連地址串連RDS執行個體,即通過公網串連RDS執行個體。這種方式的效能、安全性、穩定性較差。
Virtual Private Cloud不同
Virtual Private Cloud是基於阿里雲構建的一個隔離的網路環境,專用網路之間邏輯上徹底隔離,所以當ECS和RDS執行個體的網路類型都是專用網路時,還需要保證所屬的專用網路也相同,才能實現內網互連。
解決辦法一(推薦):更換執行個體VPC,使RDS與ECS執行個體處於同一VPC。
具體操作:您可以更換RDS執行個體的Virtual Private Cloud或者更換ECS執行個體的VPC。
解決辦法三:通過公網互連。這種方式的效能、安全性、穩定性較差。
地區不同
本地機房串連 RDS
本地機房或 IDC 需要通過內網串連 RDS 執行個體時,先將本網接入阿里雲 VPC:
VPN 閘道:建立 VPN 閘道並建立 IPsec VPN 網站到網站串連,將本網與 VPC 打通。
Smart Access Gateway:在本地機房部署 SAG 裝置,將本網接入 VPC。
Express Connect(專線):通過物理專線將本地機房接入阿里雲 VPC。
接入 VPC 後,使用 RDS 執行個體的內網地址串連。如需跨地區串連,通過雲企業網(CEN)實現跨地區 VPC 互連,CEN 轉寄路由器支援載入 VPN 閘道 IPsec 串連和 SAG 網路執行個體。
IP白名單設定有誤
由於白名單設定中只有預設地址127.0.0.1。該地址表示不允許任何裝置訪問RDS執行個體。因此需在白名單中添加對端的IP地址,具體操作請參見設定IP白名單。
白名單設定成了0.0.0.0,正確格式為0.0.0.0/0。
重要0.0.0.0/0表示允許任何裝置訪問RDS執行個體,請謹慎使用。
如果開啟了高安全白名單,需進行如下檢查:
如果使用的是專用網路的內網串連地址,請確保ECS內網IP地址添加到了專用網路的分組。
如果使用的是傳統網路的內網串連地址,請確保ECS內網IP地址添加到了傳統網路的分組。
如果通過公網串連,請確保裝置公網IP地址添加到了傳統網路的分組(專用網路的分組不適用於公網)。
您在白名單中添加的裝置公網IP地址可能並非裝置真正的出口IP地址。原因如下:
公網IP地址不固定,可能會變動。
IP地址查詢工具或網站查詢的公網IP地址不準確。
網域名稱解析失敗或錯誤
網域名稱伺服器出現故障或修改過網卡配置,可能會導致網域名稱解析失敗或錯誤。此時可以通過ping和 telnet測試到RDS的連通性,命令如下。
macOS 系統可使用 nc 命令測試連接埠連通性,命令格式為 nc -vz <RDS地址> <連接埠>。
ping <網域名稱>
telnet <網域名稱> <連接埠號碼>
樣本
# 正常樣本
[root@xxx ~]# ping rm-xxx.mysql.rds.aliyuncs.com
PING rm-xxx.mysql.rds.aliyuncs.com (192.168.0.176) 56(84) bytes of data.
64 bytes from 192.168.0.176 (192.168.0.176): icmp_seq=1 ttl=64 time=0.151 ms
64 bytes from 192.168.0.176 (192.168.0.176): icmp_seq=2 ttl=64 time=0.141 ms
64 bytes from 192.168.0.176 (192.168.0.176): icmp_seq=3 ttl=64 time=0.107 ms
64 bytes from 192.168.0.176 (192.168.0.176): icmp_seq=4 ttl=64 time=0.108 ms
# 失敗樣本
[root@izbpxxx ~]# ping rm-bp1xxx.mysql.rds.aliyuncs.com
ping: rm-bp1xxx.mysql.rds.aliyuncs.com: Name or service not known
[root@izbpxxx ~]#
# 串連正常
[root@xxx ~]# telnet rm-xxx.mysql.rds.aliyuncs.com 3306
Trying 192.168.0.176...
Connected to rm-xxx.mysql.rds.aliyuncs.com.
Escape character is '^]'.
N
5.6.16-logtEkkVNd-0!)\}\4/,/GXfu<mysql_native_password
# 串連失敗(網域名稱解析失敗)
[root@izbpxxx ~]# telnet rm-bp1xxx.mysql.rds.aliyuncs.com 3306
telnet: rm-bp1xxx.mysql.rds.aliyuncs.com: Name or service not known
rm-bp1xxx.mysql.rds.aliyuncs.com: Host name lookup failure
[root@izbpxxx ~]#如果失敗的話,可以通過修改網卡設定檔來解決問題,具體步驟如下:
修改對應的網卡設定檔。
vi /etc/sysconfig/network-scripts/<網卡設定檔名>說明<網卡設定檔名>:ECS伺服器使用的網卡,可以通過
ifconfig查看尾碼名,預設為ifcfg-eth0。在設定檔末尾加入如下配置。
DNS1=100.100.XX.XX DNS2=100.100.XX.XX說明如果已經有DNS1和DNS2配置,請將IP地址修改為如上所示。
DEVICE=eth0 BOOTPROTO=dhcp ONBOOT=yes DNS1=100.100.2.136 DNS2=100.100.2.138使用如下命令重啟Network服務。
sudo systemctl restart network使用如下命令查看是否修改成功。
cat /etc/resolv.conf[root@xxx ~]# cat /etc/resolv.conf options timeout:2 attempts:3 rotate single-request-reopen : generated_by /usr/sbin/dhclient-script nameserver 100.100.2.136 nameserver 100.100.2.138 [root@xxx ~]#
執行個體重啟、恢複或 DNS 變更後網域名稱暫時無法解析
問題現象:RDS 執行個體重啟、恢複或 DNS 變更後,用戶端可能提示“無法識別外網地址”或網域名稱解析失敗。此時,直接 Ping 或 Telnet 執行個體 IP 位址可能正常,但使用公網地址串連資料庫仍然失敗。
問題原因:公網地址變更後,DNS 解析需要一段時間生效,通常可能持續幾分鐘到幾十分鐘。本地 DNS 緩衝尚未更新,或全球 DNS 傳播延遲時,用戶端會暫時解析不到最新地址。
解決方案:按以下順序排查:
等待一段時間後重新使用公網地址串連,避免在 DNS 記錄尚未生效時反覆修改應用串連配置。
為隔離 DNS 解析問題,可在 Navicat 等資料庫用戶端中臨時使用執行個體 IP 位址直接連接資料庫進行測試。IP 位址可以連通而公網地址無法串連時,說明應繼續排查 DNS 解析和緩衝,而不是資料庫連接埠。
重新整理發起串連的用戶端或服務端 DNS 配置。執行本節的網卡配置修改步驟後,再重新解析公網地址並測試連接。
上述排查適用於 DNS 解析延遲、執行個體重啟後無法串連、提示無法識別外網地址、使用 IP 位址串連以及 DNS 緩衝未更新等情境。
連接埠連通性測試
網域名稱解析正常時,可通過telnet命令測試RDS執行個體連接埠是否可達。
telnet <RDS串連地址> <連接埠號碼>例如,測試RDS MySQL執行個體的預設連接埠3306:
telnet rm-xxxx.mysql.rds.aliyuncs.com 3306輸出
Connected to和Escape character is,表示網路層連接埠可達。連線逾時(
Connection timed out),表示網路不通或被防火牆攔截。檢查以下配置:RDS白名單是否包含用戶端IP地址。
安全性群組規則是否放通對應連接埠。
用戶端與RDS執行個體是否在同一VPC內(內網地址僅VPC內可達)。
串連被拒絕(
Connection refused),表示連接埠未監聽。確認RDS執行個體運行狀態和連接埠配置。
ping和telnet均正常但應用仍報連線逾時時,問題在應用程式層而非網路層。使用tcpdump抓包分析TCP三向交握和四次揮手過程,定位逾時根因。
tcpdump -i eth0 host <RDS串連地址> -w rds_capture.pcap分析抓包結果:SYN無回複表示網路不可達或被攔截,三向交握完成後無資料互動表示應用程式層異常。
執行個體狀態一直處於“建立網路連接”中
通過控制台進入工作清單,可對執行個體的當前任務重試,或修改切換時間。詳情請參見工作中樞。
串連建立後發送FIN包無響應導致讀逾時
通過VPN或專線等中間網路訪問RDS MySQL執行個體時,串連可以正常建立和使用,但用戶端發送FIN包後服務端無響應,最終導致串連讀逾時(read timeout)。
排查步驟:
在RDS控制台執行個體詳情頁,單擊左側導覽列的參數設定,檢查
wait_timeout和interactive_timeout參數值。RDS MySQL中wait_timeout預設值為86400秒,如果該參數被設定過短,空閑串連會被服務端提前關閉。檢查VPN或專線等中間網路鏈路是否存在丟包或高延遲。使用
telnet <RDS串連地址> <連接埠號碼>測試RDS執行個體連接埠連通性,確認網路層可達。在用戶端和服務端同時使用
tcpdump或Wireshark抓包,分析TCP FIN/RST包的互動時序,定位斷連發生在網路傳輸層還是資料庫應用程式層。
通過日誌排查連線逾時
連線逾時問題可以通過查看RDS執行個體的錯誤記錄檔和慢日誌來定位原因。
登入RDS管理主控台,在實例列表頁面找到目標執行個體,進入執行個體的管理頁面。在左側導覽列選擇日誌管理 > 錯誤記錄檔。
查看錯誤記錄檔中是否存在串連拒絕(如
Host is blocked)或連線逾時(如connect timeout、Aborted connection)等記錄,定位串連失敗的具體原因。選擇慢日誌明細,檢查是否有長時間啟動並執行慢查詢阻塞了新串連。
檢查執行個體的
wait_timeout和interactive_timeout參數配置,判斷是否因空閑連線逾時被自動斷開。
為什麼 Ping 和 Telnet 測試 RDS 連接埠連通性正常,但應用程式仍無法串連?
Ping 成功僅表示主機能夠響應 ICMP 請求,Telnet 成功表示目標資料庫連接埠可達。應用程式仍無法串連時,請按以下順序排查圖形化用戶端、命令列串連、應用配置和帳號。
排除圖形化資料庫用戶端的顯示異常或配置問題。使用 MySQL 命令列工具執行以下命令進行底層串連測試:
mysql -h <地址> -P <連接埠> -u <帳號> -p將
<地址>、<連接埠>和<帳號>替換為實際串連資訊,輸入密碼後觀察是否能夠登入。命令列串連成功時,網路連通性和當前帳號許可權通常正常。命令列能夠串連而應用程式仍失敗時,重點檢查 Java 或其他應用代碼中的資料庫驅動版本、連接字串格式、地址、連接埠、資料庫名稱和帳號密碼是否與命令列測試一致。
檢查應用使用的資料庫帳號。不要使用以
dms開頭的系統帳號進行Business Connectivity測試;請改用用於業務訪問的高許可權帳號或普通帳號,並確認該帳號具有目標資料庫所需的存取權限。
如果命令列測試也失敗,請回到本文的網路、白名單、連接埠連通性和帳號許可權相關排查項繼續定位。