查询似乎挂起,有时无法连接到集群 - Amazon Redshift

查询似乎挂起,有时无法连接到集群

问题示例

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

可能的解决方案

此问题可能是由于数据包丢失导致的。在此情况下,两个 Internet 协议 (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 实例设置入站和出站规则的信息,请参阅适用于 Linux 实例的 Amazon EC2 用户指南中的 EC2-Classic 与 VPC 中的实例间的差异

有关如何向 VPC 安全组添加规则的更多信息,请参阅管理集群的 VPC 安全组。有关此规则中需要的特定 PMTUD 设置的更多信息,请参阅《适用于 Linux 实例的 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 的说明。有关详细信息,请搜索 支持网站。