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

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

问题示例:

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

可能的解决方案

这种情况会在您从计算机(而非 Amazon EC2 实例)连接到 Amazon Redshift 时出现,并且空闲连接会在处于不活动状态一段时间后被防火墙等中间网络组件终止。当您从虚拟专用网络 (VPN) 或本地网络登录时,通常会出现这种行为。

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

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

  • (可选)在 DSN 级别设置 keepalive 行为。请参阅更改 DSN 超时设置

更改 TCP/IP 超时设置

要更改 TCP/IP 超时设置,请根据您用来连接群集的操作系统配置超时设置。

  • Linux – 如果您的客户端在 Linux 上运行,请以根用户身份运行以下命令来更改当前会话的超时设置:

    Copy
    /sbin/sysctl -w net.ipv4.tcp_keepalive_time=200 net.ipv4.tcp_keepalive_intvl=200 net.ipv4.tcp_keepalive_probes=5

    要保存设置,请使用以下值创建或修改文件 /etc/sysctl.conf,然后重新启动您的系统。

    Copy
    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 上运行,请运行以下命令来更改当前会话的超时设置:

    Copy
    sudo sysctl net.inet.tcp.keepintvl=20000 sudo sysctl net.inet.tcp.keepidle=20000 sudo sysctl net.inet.tcp.keepinit=20000 sudo sysctl net.inet.tcp.always_keepalive=1

    要保存设置,请使用以下值创建或修改文件 /etc/sysctl.conf

    Copy
    net.inet.tcp.keepidle=20000 net.inet.tcp.keepintvl=20000 net.inet.tcp.keepinit=20000 net.inet.tcp.always_keepalive=1

    重新启动计算机,然后运行以下命令来验证值是否已设置。

    Copy
    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 和 Mac OS 上,您可以直接在 odbc.ini 文件中添加或修改目标 DSN 条目中的这些参数。有关在 Linux 和 Mac OS 计算机上修改 odbc.ini 文件的更多信息,请参阅在 Linux 和 Mac OS X 操作系统上配置 ODBC 驱动程序

如果这些参数不存在,或者值为 0,系统将使用为 TCP/IP 指定的 keepalive 参数来确定 DSN keepalive 行为。在 Windows 上,TCP/IP 参数位于 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\ 内的注册表中。在 Linux 和 Mac 操作系统上,TCP/IP 参数位于 sysctl.conf 文件中。