本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
針對 Amazon Redshift 中的連線問題進行疑難排解
如果從 SQL 用戶端工具連接至叢集時有問題,您可以檢查幾個項目來縮小問題的範圍。如果您使用 SSL 或伺服器憑證,對連線問題進行故障排除時,請先移除此複雜度。然後在找到解決方案之後加回來。如需詳細資訊,請參閱設定連線的安全選項。
重要
Amazon Redshift 已變更 SSL 憑證的管理方式。如果您無法使用 SSL 來連接,您可能需要更新目前的信任根 CA 憑證。如需詳細資訊,請參閱將 SSL 連線轉換為使用 ACM 憑證。
下一節提供連線問題的一些範例錯誤訊息及可能的解決方案。因為不同的 SQL 用戶端工具會提供不同的錯誤訊息,所以這不是完整的清單,但很適合作為問題疑難排解時的起點。
從 Amazon EC2 外部連線並遇到防火牆逾時問題
執行長時間查詢 (例如 COPY 命令) 時,對資料庫的用戶端連線似乎懸置或逾時。在此情況下,您可能會發現 Amazon Redshift 主控台顯示查詢已完成,但用戶端工具本身仍似乎在執行查詢。取決於連線停止的時間,查詢的結果可能遺漏或不完整。
可能的解決方案
從 Amazon EC2 執行個體以外的機器連線到 Amazon Redshift 時,便會發生此問題。在此情況下,閒置連線會在閒置一段時間後,遭到中繼網路元件 (例如防火牆) 終止。當您從虛擬私有網路 (VPN) 或本機網路登入時,這是很典型的行為。
為了避免這些逾時,建議採取下列變更:
-
提高與 TCP/IP 逾時有關的用戶端系統值。請在您用來連接至叢集的電腦上進行這些變更。應該依您的用戶端和網路來調整逾時期間。如需詳細資訊,請參閱變更 TCP/IP 逾時設定。
-
(選用) 在 DSN 層級上設定保持連線行為。如需詳細資訊,請參閱變更 DSN 逾時設定。
變更 TCP/IP 逾時設定
若要變更 TCP/IP 逾時設定,請根據您用於連接至叢集的作業系統來設定逾時設定。
-
Linux — 如果用戶端在 Linux 上執行,請以根使用者身分執行下列命令,以變更目前工作階段的逾時設定:
/sbin/sysctl -w net.ipv4.tcp_keepalive_time=200 net.ipv4.tcp_keepalive_intvl=200 net.ipv4.tcp_keepalive_probes=5
若要保留設定,請使用下列值建立或修改
/etc/sysctl.conf
檔案,然後重新啟動系統。net.ipv4.tcp_keepalive_time=200 net.ipv4.tcp_keepalive_intvl=200 net.ipv4.tcp_keepalive_probes=5
-
Windows — 如果用戶端在 Windows 上執行,請在 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\ 下編輯下列登錄設定的值:
-
KeepAliveTime:30000
-
KeepAliveInterval:1000
-
TcpMaxDataRetransmissions:10
這些設定使用 DWORD 資料類型。如果這些設定不存在於登錄路徑下,您可以建立設定並指定這些建議值。如需編輯 Windows 登錄的相關資訊,請參閱 Windows 文件。
設定這些值之後,請重新啟動電腦以讓變更生效。
-
-
Mac — 如果用戶端在 Mac 上執行,請執行下列命令,以變更目前工作階段的逾時設定:
sudo sysctl net.inet.tcp.keepintvl=200000 sudo sysctl net.inet.tcp.keepidle=200000 sudo sysctl net.inet.tcp.keepinit=200000 sudo sysctl net.inet.tcp.always_keepalive=1
若要保留設定,請使用下列值建立或修改
/etc/sysctl.conf
檔案:net.inet.tcp.keepidle=200000 net.inet.tcp.keepintvl=200000 net.inet.tcp.keepinit=200000 net.inet.tcp.always_keepalive=1
重新啟動電腦,然後執行下列命令,以驗證是否已設定這些值。
sysctl net.inet.tcp.keepidle sysctl net.inet.tcp.keepintvl sysctl net.inet.tcp.keepinit sysctl net.inet.tcp.always_keepalive
變更 DSN 逾時設定
您可以在 DSN 層級上設定保持連線行為 (若選擇這麼做)。在作法上是在 odbc.ini 檔案中新增或修改下列參數:
- KeepAlivesCount
-
在認為連線已中斷之前可遺失的 TCP 保持連線封包數。
- KeepAlivesIdle
-
驅動程式傳送 TCP 保持連線封包之前的閒置秒數。
- KeepAlivesInterval
-
每一次 TCP 保持連線重新傳輸之間的秒數。
如果這些參數不存在,或值為 0,系統會使用指定給 TCP/IP 的保持連線參數,以決定 DSN 保持連線行為。在 Windows 上,您可以在 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\
的登錄中找到 TCP/IP 參數。在 Linux 和 macOS 上,您可以在 sysctl.conf 檔案中找到 TCP/IP 參數。
連線遭拒或失敗
如果連線遭拒或失敗,您可能會收到類似下列其中一項的錯誤。
-
「無法對
<endpoint>
建立連線。」 -
「無法連接至伺服器:連線逾時。伺服器在主機
'<endpoint>'
上執行且在連接埠'<port>'
上接受 TCP/IP 連線嗎?」 -
「連線遭拒。請檢查主機名稱和連接埠正確,且 postmaster 接受 TCP/IP 連線。」
可能的解決方案
一般來說,收到錯誤訊息指出無法建立連線時,表示存取叢集的許可有問題,或到達叢集的網路流量有問題。
若要從叢集所在網路外部的用戶端工具連線至叢集,請在叢集的安全群組中新增傳入規則。規則組態取決於 Amazon Redshift 叢集是否建立於虛擬私有雲端 (VPC):
-
如果您在以 Amazon VPC 為基礎的虛擬私有雲端 (VPC) 中建立了 Amazon Redshift 叢集,請在 Amazon VPC 中於 VPC 安全群組內新增會指定用戶端 CIDR/IP 地址的傳入規則。如需為叢集設定 VPC 安全群組以及可公開存取選項的相關資訊,請參閱 VPC 中的 Redshift 資源。
-
如果在 VPC 外部建立了 Amazon Redshift 叢集,請在 Amazon Redshift 中將用戶端 CIDR/IP 地址新增至叢集安全群組。如需設定叢集安全群組的相關資訊,請參閱 Amazon Redshift 安全群組。
如果您嘗試從在 Amazon EC2 執行個體上執行的用戶端工具連線至叢集,您也會新增傳入規則。在此情況下,請在叢集安全群組中新增規則。此規則必須指定與用戶端工具的 Amazon EC2 執行個體相關聯的 Amazon EC2 安全群組。
在某些情況下,您的用戶端與伺服器之間可能有一層,例如防火牆。在這些情況下,請確定防火牆透過您為叢集設定的連接埠接受傳入連線。
用戶端和驅動程式不相容
如果您的用戶端和驅動程式不相容,您可能會收到錯誤,指出「指定的 DSN 包含驅動程式和應用程式之間的架構不相符」。
可能的解決方案
當您嘗試連接並得到有關架構不符的錯誤時,這表示用戶端工具和驅動程式不相容。原因是它們的系統架構不相符。例如,假設您有 32 位元用戶端工具,但卻安裝 64 位元版本的驅動程式,就可能發生此錯誤。有時,64 位元用戶端工具可以使用 32 位元驅動程式,但 32 位元應用程式不能搭配 64 位元驅動程式一起使用。請確定驅動程式和用戶端工具使用相同版本的系統架構。
查詢似乎沒有回應且有時無法觸達叢集
您遇到查詢完成方面的問題,查詢似乎正在執行,但在 SQL 用戶端工具中無回應。有時,查詢無法出現在叢集,例如系統資料表或 Amazon Redshift 主控台。
可能的解決方案
由於封包捨棄,可能發生此問題。在兩個網際網路通訊協定 (IP) 主機之間的網路路徑中,最大傳輸單位 (MTU) 出現差異。MTU 大小決定網路連線上的一個乙太網路訊框中可傳輸的封包大小上限 (位元組)。在 中 AWS,某些 Amazon EC2 執行個體類型支援 1500 的 MTU (乙太網路 v2 影格),而其他執行個體類型則支援 9001 的 MTU (TCP/IP 巨型影格)。
為了避免因為 MTU 大小不同而發生問題,建議採取下列其中一個動作:
-
如果叢集使用 EC2-VPC 平台,請以傳回
Destination Unreachable
的傳入自訂「網際網路控制訊息通訊協定 (ICMP)」規則來設定 Amazon VPC 安全群組。此規則會藉以指示原始主機沿著網路路徑使用最低的 MTU 大小。如需此方法的詳細資訊,請參閱將安全群組設為允許 ICMP「無法觸達目標」。 -
如果叢集使用 EC2-Classic 平台,或您無法允許 ICMP 傳入規則,請停用 TCP/IP 巨型訊框,以便使用乙太網路 v2 訊框。如需此方法的詳細資訊,請參閱設定執行個體的 MTU。
將安全群組設為允許 ICMP「無法觸達目標」
在兩個主機之間的網路中,當 MTU 大小出現差異時,首先請確定網路設定並未禁止路徑 MTU 探索 (PMTUD)。PMTUD 可讓接收端主機向原始主機回應下列 ICMP 訊息:Destination Unreachable: fragmentation
needed and DF set (ICMP Type 3, Code 4)
。此訊息指示原始主機沿著網路路徑,使用最低的 MTU 大小來重新傳送請求。如果不這樣協議,可能會因為請求太大,使得接收端主機無法接受,而發生封包捨棄。如需此 ICMP 訊息的相關資訊,請前往網際網路工程任務組 (IETF) 網站上的 RFC792
如果您沒有明確為 Amazon VPC 安全群組設定此 ICMP 傳入規則,則會封鎖 PMTUD。在 中 AWS,安全群組是虛擬防火牆,可指定執行個體的傳入和傳出流量規則。如需 Amazon Redshift 叢集安全群組的相關資訊,請參閱 Amazon Redshift 安全群組。對於使用 EC2-VPC 平台的叢集,Amazon Redshift 會使用 VPC 安全群組來允許或拒絕流量進入叢集。根據預設,安全群組會鎖定並拒絕所有傳入流量。如需有關如何設定 EC2-Classic 或 EC2-VPC 執行個體傳入和傳出規則的資訊,請參閱《Amazon EC2 使用者指南》中的 EC2-Classic 和 VPC 執行個體之間的差異。
如需如何將規則新增至 VPC 安全群組的相關資訊,請參閱VPC security groups (VPC 安全群組)。如需此規則中所需特定 PMTUD 設定的詳細資訊,請參閱《Amazon EC2 使用者指南》中的路徑 MTU 探索。 Amazon EC2
設定執行個體的 MTU
在某些情況下,您的叢集可能會使用 EC2-Classic 平台,或您無法允許傳入流量的自訂 ICMP 規則。在這些情況下,我們建議您將連線到 Amazon Redshift 叢集之 EC2 執行個體的網路界面 (NIC) 上的 MTU 調整為 1500。此調整會停用 TCP/IP 巨型訊框,以確保連線始終使用相同的封包大小。不過,此選項會完全地降低執行個體的最大網路輸送量,而不只是 Amazon Redshift 的連線而已。如需詳細資訊,請參閱下列程序。
在 Microsoft Windows 作業系統上設定 MTU
如果用戶端在 Microsoft Windows 作業系統中執行,您可以使用 netsh
命令來檢閱並設定乙太網路卡的 MTU 值。
-
執行下列命令來判斷目前的 MTU 值:
netsh interface ipv4 show subinterfaces
-
在輸出中檢閱
MTU
界面卡的Ethernet
值。 -
如果值不是
1500
,請執行下列命令來設定此值:netsh interface ipv4 set subinterface "Ethernet" mtu=1500 store=persistent
設定此值之後,請重新啟動電腦以讓變更生效。
在 Linux 作業系統上設定 MTU
如果用戶端在 Linux 作業系統中執行,您可以使用 ip
命令來檢閱並設定 MTU 值。
-
執行下列命令來判斷目前的 MTU 值:
$ ip link show eth0
-
在輸出中檢閱
mtu
後面的值。 -
如果值不是
1500
,請執行下列命令來設定此值:$ sudo ip link set dev eth0 mtu 1500
在 Mac 作業系統上設定 MTU
-
遵循 MacOS 支援網站上有關
How to change the MTU for troubleshooting purposes
的指示進行操作。如需詳細資訊,請搜尋支援網站。
設定 JDBC 擷取大小參數
依預設,JDBC 驅動程式會一次收集查詢的所有結果。因此,嘗試透過 JDBC 連線擷取大型結果集時,您可能會遇到用戶端記憶體不足錯誤。若要讓您的用戶端批次擷取 (而非以單一的全有或全無擷取) 結果集,請在您的用戶端應用程式設定 JDBC 擷取大小參數。
注意
ODBC 不支援擷取大小。
為求最佳效能,請將擷取大小設定為不會導致記憶體不足錯誤的最高值。較低的擷取大小值會造成更多伺服器來回行程,進而延長執行時間。伺服器會預留資源,包括 WLM 查詢位置和關聯的記憶體,直到用戶端擷取整個結果集或查詢取消為止。適當地調校擷取大小時,那些資源會更快速釋出,使得它們可供其他查詢使用。
注意
如果您需要擷取大型資料集,我們建議您使用 UNLOAD 陳述式將資料傳輸到 Amazon S3。使用 UNLOAD 時,運算節點會平行運作,以加速資料的傳輸。
如需設定 JDBC 擷取大小參數的相關資訊,請前往 PostgreSQL 文件中的根據游標取得結果