Amazon EC2 외부에서 연결 - 방화벽 시간 제한 문제 - Amazon Redshift

Amazon EC2 외부에서 연결 - 방화벽 시간 제한 문제

문제 예

COPY 명령 같은 긴 쿼리를 실행할 때는 데이터베이스에 대한 클라이언트 연결이 멈추거나 제한 시간에 걸릴 수 있습니다. 이런 경우 Amazon Redshift 콘솔에서 쿼리의 완료 여부를 관찰할 수 있지만 클라이언트 도구에는 쿼리가 여전히 실행 중인 것으로 표시됩니다. 쿼리 결과는 연결 중단 시점에 따라 누락되거나 불완전할 수도 있습니다.

가능한 해결책

이 문제는 Amazon EC2 인스턴스가 아닌 다른 컴퓨터에서 Amazon Redshift에 연결할 때 발생합니다. 이 경우 유휴 연결은 일정 시간 동안 사용하지 않으면 방화벽과 같은 중간 네트워크 구성 요소에 의해 종료됩니다. 이 동작은 가상 사설 네트워크(VPN) 또는 로컬 네트워크에서 로그온할 때 일반적입니다.

제한 시간 문제를 방지하려면 다음과 같이 변경하는 것이 좋습니다.

  • TCP/IP 제한 시간을 처리하는 클라이언트 시스템 값을 높이세요. 단, 이러한 시스템 값은 클러스터에 연결할 때 사용하는 컴퓨터에서 변경해야 합니다. 또한 제한 시간은 클라이언트와 네트워크를 고려하여 조정해야 합니다. 자세한 내용은 TCP/IP 제한 시간 설정 변경 섹션을 참조하세요.

  • 그 밖의 옵션으로 keepalive 동작을 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 - 클라이언트가 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 제한 시간 설정 변경

원하는 경우 keepalive 동작을 DSN 수준으로 설정할 수 있습니다. 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에서는 레지스트리의 TCP/IP 파라미터를 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\에서 확인할 수 있습니다. 그리고 Linux 및 macOS에서는 TCP/IP 파라미터를 sysctl.conf 파일에서 찾아볼 수 있습니다.