從 Amazon EC2 外部進行連線 (防火牆逾時問題) - Amazon Redshift

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

從 Amazon EC2 外部進行連線 (防火牆逾時問題)

問題範例

執行長時間查詢 (例如 COPY 命令) 時,對資料庫的用戶端連線似乎懸置或逾時。在此情況下,您可能會發現 Amazon Redshift 主控台顯示查詢已完成,但用戶端工具本身仍似乎在執行查詢。取決於連線停止的時間,查詢的結果可能遺漏或不完整。

可能的解決方案

從 Amazon EC2 執行個體以外的機器連線到 Amazon Redshift 時,便會發生此問題。在此情況下,閒置連線會在閒置一段時間後,遭到中繼網路元件 (例如防火牆) 終止。當您從虛擬私有網路 (VPN) 或本機網路登入時,這是很典型的行為。

為了避免這些逾時,建議採取下列變更:

  • 提高與 TCP/IP 逾時有關的用戶端系統值。請在您用來連接至叢集的電腦上進行這些變更。應該依您的用戶端和網路來調整逾時期間。如需詳細資訊,請參閱 變更 TCP/IP 逾時設定

  • (選用) 在 DSN 層級上設定保持連線行為。如需詳細資訊,請參閱 變更 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 上執行,請在 HKEY_LOCAL_ 機器\ 系統\ 服務\ Tcpip\ 參數下編輯下列登錄設定的值:CurrentControlSet

    • 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 層級上設定保持連線行為 (若選擇這麼做)。在作法上是在 odbc.ini 檔案中新增或修改下列參數:

KeepAlivesCount

在認為連線已中斷之前可遺失的 TCP 保持連線封包數。

KeepAlivesIdle

驅動程式傳送 TCP 保持連線封包之前的閒置秒數。

KeepAlivesInterval

每一次 TCP 保持連線重新傳輸之間的秒數。

在 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 的保持連線參數,以決定 DSN 保持連線行為。在 Windows 上,您可以在 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\ 的登錄中找到 TCP/IP 參數。在 Linux 和 macOS 上,您可以在 sysctl.conf 檔案中找到 TCP/IP 參數。