本文介紹在各種情況下如何自助解決串連不上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。
解決辦法三:使用ClassicLink功能,使傳統網路的ECS執行個體可以和VPC中的雲資源通過內網互連。
解決辦法四:ECS執行個體使用RDS執行個體的公網串連地址串連RDS執行個體,即通過公網串連RDS執行個體。這種方式的效能、安全性、穩定性較差。
Virtual Private Cloud不同
Virtual Private Cloud是基於阿里雲構建的一個隔離的網路環境,專用網路之間邏輯上徹底隔離,所以當ECS和RDS執行個體的網路類型都是專用網路時,還需要保證所屬的專用網路也相同,才能實現內網互連。
解決辦法一(推薦):更換執行個體VPC,使RDS與ECS執行個體處於同一VPC。
具體操作:您可以更換RDS執行個體的Virtual Private Cloud或者更換ECS執行個體的VPC。
解決辦法二:在兩個VPC之間建立雲企業網。
解決辦法三:通過公網互連。這種方式的效能、安全性、穩定性較差。
地區不同
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的連通性,命令如下。
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 ~]#
連接埠連通性測試
網域名稱解析正常時,可通過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參數配置,判斷是否因空閑連線逾時被自動斷開。