Amazon Redshift
管理指南 (API Version 2012-12-01)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

查询显示为挂起,有时无法连接到群集

问题示例

您在完成查询时遇到问题,即在 SQL 客户端工具中,查询显示为正在进行,但实则处于挂起状态。有时,查询无法显示在群集中,如系统表或 Amazon Redshift console中。

可能的解决方案

当两个网络协议 (IP) 主机在网络路径中的最大传输单位 (MTU) 大小不同时,可能会导致数据包丢失,进而引发此问题。MTU 大小用于确定可通过网络连接在单个以太网帧中传输的数据包的最大大小(以字节为单位)。在 AWS 中,一些 Amazon EC2 实例类型支持 1500 MTU(以太网 v2 帧),其他实例类型支持 9001 MTU(TCP/IP 巨型帧)。

为避免因 MTU 大小不同可能导致的各种问题,建议您执行以下操作之一:

  • 如果您的群集使用 EC2-VPC 平台,请为 Amazon VPC 安全组配置可返回 Destination Unreachable 的入站自定义 Internet 控制消息协议 (ICMP) 规则,以指示原始主机在网络路径中使用最低 MTU 大小。有关此方法的详细信息,请参阅配置安全组以允许 ICMP“Destination Unreachable”

  • 如果您的群集使用 EC2-Classic 平台,或者您无法允许 ICMP 入站规则,请禁用 TCP/IP 巨型帧以便使用以太网 v2 帧。有关此方法的详细信息,请参阅配置实例的 MTU

配置安全组以允许 ICMP“Destination Unreachable”

当两个主机在网络中的 MTU 大小存在差异时,请先确保您的网络设置不会阻止路径 MTU 发现 (PMTUD)。PMTUD 使接收主机能够使用以下 ICMP 消息响应原始主机:Destination Unreachable: fragmentation needed and DF set (ICMP Type 3, Code 4)。此消息将指示原始主机在网络路径中使用最低 MTU 大小重新发送请求。若无此协商,当请求过大,导致接收主机无法接收时,数据包可能会丢失。有关此 ICMP 消息的更多信息,请转至 Internet Engineering Task Force (IETF) 网站上的 RFC792

如果您没有为 Amazon VPC 安全组明确配置此 ICMP 入站规则,PMTUD 则将被阻止。在 AWS 中,安全组是虚拟防火墙,用于为到实例的入站和出站流量指定规则。对于使用 EC2-VPC 平台的群集,Amazon Redshift 将使用 VPC 安全组来允许或拒绝到群集的流量。默认情况下,安全组处于锁定状态,会拒绝所有入站流量。

有关如何向 VPC 安全组添加规则的更多信息,请参阅管理群集的 VPC 安全组。有关此规则所需的特定 PMTUD 配置的更多信息,请参阅Amazon EC2 用户指南(适用于 Linux 实例) 中的路径 MTU 发现

配置实例的 MTU

如果您的群集使用 EC2-Classic 平台,或者您无法根据需要允许针对入站流量的自定义 ICMP 规则,建议您在从其连接到 Amazon Redshift 群集的 Amazon EC2 实例的网络接口 (NIC) 上将 MTU 调整为 1500。此调整将禁用 TCP/IP 巨型帧,以确保连接始终使用同一数据包大小。但请注意,此选项将从整体上降低实例的最大网络吞吐量,而不仅仅是到 Amazon Redshift 的连接。有关更多信息,请参阅以下流程。

在 Microsoft Windows 操作系统上设置 MTU

如果客户端在 Microsoft Windows 操作系统上运行,则可使用 netsh 命令查看和设置以太网适配器的 MTU 值。

  1. 运行以下命令可确定当前 MTU 值:

    Copy
    netsh interface ipv4 show subinterfaces
  2. 在输出中查看 Ethernet 适配器的 MTU 值。

  3. 如果值不是 1500,则运行以下命令设置它:

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

    设置好此值后,重启您的计算机以使更改生效。

在 Linux 操作系统上设置 MTU

如果客户端在 Linux 操作系统上运行,则可使用 ip 命令查看和设置 MTU 值。

  1. 运行以下命令可确定当前 MTU 值:

    Copy
    $ ip link show eth0
  2. 查看输出中 mtu 后面的值。

  3. 如果值不是 1500,则运行以下命令设置它:

    Copy
    $ sudo ip link set dev eth0 mtu 1500

在 Mac 操作系统上设置 MTU