本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
針對 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\SYSTEMCurrentControlSet\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 上,您可以在 的登錄檔中找到 TCP/IP 參數HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\
。在 Linux 和 macOS 上,您可以在 sysctl.conf 檔案中找到 TCP/IP 參數。
連線遭拒或失敗
如果連線遭拒或失敗,您可能會收到類似下列其中一項的錯誤。
-
"無法建立與 的連線
<endpoint>
." -
「無法連接至伺服器:連線逾時。伺服器是否在主機上執行
'<endpoint>'
和接受連接埠上的 TCP/IP 連線'<port>'
?" -
「連線遭拒。檢查主機名稱和連接埠是否正確,以及 Postmaster 是否接受 TCP/IP 連線。"
可能的解決方案
一般來說,收到錯誤訊息指出無法建立連線時,表示存取叢集的許可有問題,或到達叢集的網路流量有問題。
若要從叢集所在網路外部的用戶端工具連線至叢集,請在叢集的安全群組中新增傳入規則。規則組態取決於是否在虛擬私有雲端 () 中建立 Amazon Redshift 叢集VPC:
-
如果您根據 Amazon 在虛擬私有雲端 (VPC) 中建立 Amazon Redshift 叢集VPC,請將傳入規則新增至 Amazon 中指定用戶端CIDR/IP 地址VPC的安全群組VPC。如需為叢集和公開存取選項設定VPC安全群組的詳細資訊,請參閱 中的 Redshift 資源 VPC。
-
如果您在 外部建立 Amazon Redshift 叢集VPC,請將用戶端 CIDR/IP 地址新增至 Amazon Redshift 中的叢集安全群組。如需設定叢集安全群組的相關資訊,請參閱 Amazon Redshift 安全群組。
如果您嘗試從在 Amazon EC2執行個體上執行的用戶端工具連線至叢集,您也可以新增傳入規則。在此情況下,請在叢集安全群組中新增規則。規則必須指定與用戶端工具的 Amazon EC2執行個體相關聯的 Amazon EC2安全群組。
在某些情況下,您的用戶端與伺服器之間可能有一層,例如防火牆。在這些情況下,請確定防火牆透過您為叢集設定的連接埠接受傳入連線。
用戶端和驅動程式不相容
如果您的用戶端和驅動程式不相容,您可能會收到錯誤,指出「指定的 DSN包含驅動程式與應用程式之間的架構不相符」。
可能的解決方案
當您嘗試連接並得到有關架構不符的錯誤時,這表示用戶端工具和驅動程式不相容。原因是它們的系統架構不相符。例如,假設您有 32 位元用戶端工具,但卻安裝 64 位元版本的驅動程式,就可能發生此錯誤。有時,64 位元用戶端工具可以使用 32 位元驅動程式,但 32 位元應用程式不能搭配 64 位元驅動程式一起使用。請確定驅動程式和用戶端工具使用相同版本的系統架構。
查詢似乎沒有回應且有時無法觸達叢集
您在完成查詢時遇到問題,查詢似乎正在執行,但掛在SQL用戶端工具中。有時,查詢無法出現在叢集,例如系統資料表或 Amazon Redshift 主控台。
可能的解決方案
由於封包捨棄,可能發生此問題。在此情況下,兩個網際網路通訊協定 (IPMTU) 主機之間的網路路徑中傳輸單位 () 大小上限不同。MTU 大小決定可透過網路連線在一個乙太網路框架中傳輸的封包大小上限,以位元組為單位。在 中 AWS,某些 Amazon EC2執行個體類型支援 1500 MTU 的 (乙太網路 v2 框架),而其他執行個體類型則支援 9001 MTU的 (TCP/IP 巨型框架)。
為了避免因MTU大小差異而發生的問題,我們建議您執行下列其中一項操作:
-
如果您的叢集使用 EC2-VPC 平台,請使用傳回 的傳入自訂網際網路控制訊息通訊協定 (ICMP) 規則來設定 Amazon VPC安全群組
Destination Unreachable
。因此,規則會指示原始主機沿網路路徑使用最小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此訊息的詳細資訊,請前往網際網路工程任務小組 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 安全群組。如需此規則中所需特定PMTUD設定的詳細資訊,請參閱 Amazon 使用者指南中的路徑MTU探索。 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連線擷取大型結果集時,您可能會遇到用戶端 out-of-memory錯誤。若要讓用戶端以批次擷取結果集,而不是在單一 all-or-nothing擷取中擷取結果集,請在用戶端應用程式中設定JDBC擷取大小參數。
注意
不支援擷取大小ODBC。
為求最佳效能,請將擷取大小設定為不會導致記憶體不足錯誤的最高值。較低的擷取大小值會造成更多伺服器來回行程,進而延長執行時間。伺服器會保留資源,包括WLM查詢插槽和相關聯的記憶體,直到用戶端擷取整個結果集或取消查詢為止。適當地調校擷取大小時,那些資源會更快速釋出,使得它們可供其他查詢使用。
注意
如果您需要擷取大型資料集,我們建議您使用 UNLOAD陳述式將資料傳輸至 Amazon S3。當您使用 時UNLOAD,運算節點會平行運作,以加快資料傳輸。
如需設定JDBC擷取大小參數的詳細資訊,請前往 PostgreSQL 文件中的根據游標取得結果