ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • tcp keepalive nginx keepalive
    카테고리 없음 2016. 6. 9. 17:49
    # TCP keepalive
    + TCP 관련 커널 파라미터에는 keepalive 관련 3개의 값이 있음
    + net.ipv4.tcp_keepalive_time : TCP 세션, keepalive 유지시간 (default : 7200)
    + net.ipv4.tcp_keepalive_probes : keepalive가 끊어졌다고 판단될때 세션 정리하는 동안 보낼 ping-pong 패킷수 ( default : 9 )
    + net.ipv4.tcp_keepalive_intvl : 첫번째 health_check이후 ping-pong 패킷을 보내는데 걸리는 패킷사이 주기 (default : 75 )

    + 두 노드간 TCP 세션이 Idle 한 상태가 된지 7200초 후 살아있는지 체크하는 ping-pong 패킷을 보냄
    + 최대 9번까지 75초 간격으로 패킷을 보내고 세션을 정리.


    #nginx keepalive
    + nginx keepalive는 기본적으로 애플리케이션 레벨의 keepalive.
    + tcp keepliave 를 사용하지 않고, tcp keepalive 처럼 ping-pong으로 체크하지 않음.
    + keepalive time 동안 세션을 그대로 ESTABLISH 상태로 유지
    + nginx에서 tcp keeplive 사용을 위해서는 listen 지시자 옆에 so_keepalive 옵션 추가





    # tcp, nginx keepalive 차이점
    + tcp keepalive 는 keepalive 유지/관리에 대한 작업ㅇ르 커널이 수행
    + tcp keepalive 는 ping-pong 응답이 오는경우 세션 유지
    + nginx  는 keepalive 시간이 만료되면 연결을 끊음.
    + 전자는 계속적으로 세션유지, 후자는 설정시간 이후 세션이 유지되지 않음.

    # 상호영향
    + application 자체 keepalive는 커널의 설정에 영향받지 않음.

    # TCP keepalive 는 언제 필요한가.
    + DSR 방식의 로드 밸런서 하단의 커넥션 풀링 방식으로 서비스 할 때 필요.
    + active mq, rabbit mq 등 TCP 기반의 서비스
    + 아래와같이 2대의 서버에서 TCP기반 통신서비스 제공가정.
    + 커넥션 풀 방식이기때문에  Client는 LB와 계속해서 세션을 열어두고 있음
    + 처음 Client 는 A서버로 데이터를 보냄.
    + LB는 10분이 지났기 때문에 기존 세션에 대한 정보 삭제,
    + 새로운 데이터로 인식해서 B서버로 클라이언트 데이터를 보냄.
    + B서버는 연결된 세션이 없으므로 RST 패킷을 보내어 타임아웃 발생
    + 타임아웃후 다시 SYN을 맺고 B서버로 세션이 맺어짐.





    + 원치않는 타임아웃, A서버는 FIN 패킷을 받지 못해 EST 소켓이 쌓여 garbage 세션이 발생
    + TCP Keepalive를 사용하면 A서버는 지속적으로 클라이언트로 ping-pong 형식의 ACK를 보내고
    + 클라이언트는 계속해서 응답을 보내기 때문에 LB의 세션 테이블에서 지워지지 않고 계속해서 세션 정보 유지

    + 세션 테이블의 주기인 10분보다 tcp_keepalive_time 값이 낮아야함!

    + 웹 서비스가 아닌 TCP 기반의 서비스도 LB를 통해 서비스 할 수 있음.



    #RST  패킷
    + Reset : 제 연결종료
    + 재설정(Reset)을 하는 과정이며 양방향에서 동시에 일어나는 중단 작업.
    + 비 정상적인 세션 연결 끊기에 해당함.
    + 패킷을 보내는 곳이 현재 접속하고 있는 곳과 즉시 연결을 끊고자 할 때 사용.


    [참고]


Designed by Tistory.