从 Amazon EC2 外部连接防火墙超时问题 - Amazon Redshift

从 Amazon EC2 外部连接防火墙超时问题

问题示例

在运行 COPY 命令等较长的查询时,客户端到数据库的连接会挂起或超时。此时,您可能会发现,Amazon Redshift 控制台显示查询已完成,而客户端工具仍然显示正在运行查询。查询结果可能会丢失或不完整,具体取决于连接停止的时间。

可能的解决方案

当您从 Amazon EC2 实例以外的计算机连接到 Amazon Redshift 时,会发生此问题。在此情况下,空闲连接将在处于不活动状态一段时间后被防火墙等中间网络组件终止。当您从 Virtual Private Network(VPN)或本地网络登录时,通常会出现这种行为。

为避免出现此类超时,建议您执行以下更改:

  • 提高用于处理 TCP/IP 超时的客户端系统值。在用来连接集群的计算机上进行这些更改。根据您的客户端和网络调整超时期限。有关更多信息,请参阅 更改 TCP/IP 超时设置

  • (可选)在 DSN 级别设置 Keepalive 行为。有关更多信息,请参阅 更改 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 级别设置 Keepalive 行为。在 odbc.ini 文件中添加或修改以下参数即可实现:

KeepAlivesCount

连接被视为断开前可能丢失的 TCP keepalive 包的数量。

KeepAlivesIdle

驱动程序发送 TCP Keepalive 包前处于不活动状态的秒数。

KeepAlivesInterval

两次传输 TCP keepalive 间隔的秒数。

在 Windows 上,您可以通过在 HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI\your_DSN 中添加或更改密钥来修改注册表中的这些参数。在 Linux 和 macOS 上,您可以直接在 odbc.ini 文件中添加或修改目标 DSN 条目中的这些参数。有关在 Linux 和 macOS 计算机上修改 odbc.ini 文件的更多信息,请参阅使用 ODBC 驱动程序管理器在 Linux 和 macOS X 操作系统上配置驱动程序

如果这些参数不存在,或者其值为 0,则系统将使用为 TCP/IP 指定的 Keepalive 参数来确定 DSN Keepalive 行为。在 Windows 上,您可以在注册表中的 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\ 中查找 TCP/IP 参数。在 Linux 和 macOS 上,可以在 sysctl.conf 文件中查找 TCP/IP 参数。