查詢似乎沒有回應且有時無法觸達叢集 - Amazon Redshift

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

查詢似乎沒有回應且有時無法觸達叢集

問題範例

您遇到查詢完成方面的問題,查詢似乎正在執行,但在 SQL 用戶端工具中無回應。有時,查詢無法出現在叢集,例如系統資料表或 Amazon Redshift 主控台。

可能的解決方案

由於封包捨棄,可能發生此問題。在兩個網際網路通訊協定 (IP) 主機之間的網路路徑中,最大傳輸單位 (MTU) 出現差異。MTU 大小決定網路連線上的一個乙太網路訊框中可傳輸的封包大小上限 (位元組)。在中 AWS,某些 Amazon EC2 執行個體類型支援 1500 的 MTU (乙太網路 v2 框架),而其他執行個體類型則支援 MTU 9001 (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 安全群組。如需有關此規則所需之特定 PMTUD 設定的詳細資訊,請參閱 Amazon EC2 使用者指南中的路徑 MTU 探索

設定執行個體的 MTU

在某些情況下,您的叢集可能會使用 EC2-Classic 平台,或您無法允許傳入流量的自訂 ICMP 規則。在這些情況下,我們建議您將連線到 Amazon Redshift 叢集之 EC2 執行個體的網路界面 (NIC) 上的 MTU 調整為 1500。此調整會停用 TCP/IP 巨型訊框,以確保連線始終使用相同的封包大小。不過,此選項會完全地降低執行個體的最大網路輸送量,而不只是 Amazon Redshift 的連線而已。如需詳細資訊,請參閱下列程序。

在 Microsoft Windows 作業系統上設定 MTU

如果用戶端在 Microsoft Windows 作業系統中執行,您可以使用 netsh 命令來檢閱並設定乙太網路卡的 MTU 值。

  1. 執行下列命令來判斷目前的 MTU 值:

    netsh interface ipv4 show subinterfaces
  2. 在輸出中檢閱 MTU 界面卡的 Ethernet 值。

  3. 如果值不是 1500,請執行下列命令來設定此值:

    netsh interface ipv4 set subinterface "Ethernet" mtu=1500 store=persistent

    設定此值之後,請重新啟動電腦以讓變更生效。

在 Linux 作業系統上設定 MTU

如果用戶端在 Linux 作業系統中執行,您可以使用 ip 命令來檢閱並設定 MTU 值。

  1. 執行下列命令來判斷目前的 MTU 值:

    $ ip link show eth0
  2. 在輸出中檢閱 mtu 後面的值。

  3. 如果值不是 1500,請執行下列命令來設定此值:

    $ sudo ip link set dev eth0 mtu 1500
在 Mac 作業系統上設定 MTU
  • 遵循 MacOS 支援網站上有關 How to change the MTU for troubleshooting purposes 的指示進行操作。如需詳細資訊,請搜尋支援網站