Network Infra 쉽게 이해하기/L4 & L7 Network 쉽게 이해하기

L4 스위치 쉽게 이해하기 #8(Health Check / Connection / Sticky)

네트워크 엔지니어 환영 2021. 1. 1. 22:24
반응형
이번 문서 'L4 스위치 쉽기 이해하기'와 '서버 부하 분산 쉽게 이해하기', 다음에 이어질 문서인 'L4/L7 로드밸런싱 쉽게 이해하기'는 L4/L7 Network Swtich인 'F5 Networks' 장비를 기준으로 설명합니다. Alteon(Radware), Brocade, Cisco, Piolink, Pumkin, Citrix의 관점에서는 다소 다를 수 있습니다.

이번에 이야기할 주제는 Health check(이하 헬스 체크), Connection(이하 커넥션) 그리고 Persistence(이하 Sticky, 스티키)입니다. 지금껏 이야기한 서버의 부하 분산, Source IP NAT, Destiantion IP NAT, Port Translation, SSL Offload 등의 기능은 위 3가지 요소가 제대로 작동하고 있다는 전제 하에 가능한 것입니다. 그만큼 매우 중요한 기능에 해당하며, 실무에서도 빠지지 않고 등장합니다.

위 3 가지 기능을 통해 헬스 체크를 사용하여 서버의 상태를 끊임없이 확인하고 커넥션을 생성하여 논리적인 연결을 만들어 사용자와 서버의 통신을 가능케 하며 스티키를 사용해 사용자가 접속했던 서버를 일정 시간이 지난 이후에도 다시 접속할 수 있도록 합니다. 이제 이 3요소에 대해 자세히 알아볼까 합니다. 

 

Health check(Health monitoring)

헬스 체크란 L4 스위치가 부하 분산의 대상인 서버의 상태를 확인하는 것, 말 그대로 Health를 Check하는 것을 의미합니다. 헬스 체크를 통해 서버가 제 기능을 할 수 있음을 끊임없이 확인하며 사용자에게서 Virtual server를 통해 요청을 받을 경우, 기능 상태가 확인된 서버에게로만 부하분산을 실시합니다. 다시 말하면 헬스 체크에 실패한 서버에겐 요청을 전달하지 않는다는 뜻입니다. 

헬스 체크 설정에는 Interval(이하 인터벌)과 Time out(이하 타임 아웃)이라는 요소가 들어갑니다. L4 스위치는 타임 아웃으로 지정된 시간까지 헬스 체크를 반복적으로 시도합니다. 서버 상태에 문제가 있음을 뜻하는 헬스 체크 실패를 결정하는데 도달하는 시간이 타임 아웃입니다. 그 시간 동안 몇 번이고 헬스 체크를 반복하는 것이 아니고 일정 간격을 두고 헬스 체크를 시도하는데 이를 인터벌이라 합니다. F5 Networks의 기본 타임 아웃은 16초이며, Interval은 5초입니다. 즉 5초에 한 번씩 헬스 체크를 시도하여 총 3번을 시도하고 3번 모두 실패하고 1초가 지나야 헬스 체크 실패로 판단하는 것입니다.

L4 스위치는 헬스 체크를 위해 다양한 방법을 쓰는데 그중 대표적인 방법으로 TCPHTTP가 있으며 그 이외에도 ICMP, UDP 등의 다양한 방법이 존재합니다. 앞선 문서에서 3-way handshake에 대해 수없이 다루었던 것을 기억하실 텐데요. 헬스체크에도 이 방법이 사용됩니다.

먼저 첫 번째 방법인 TCP입니다. L4 스위치는 서버와 3-way handshake를 실시합니다. 보통 80 포트를 지정하지요. SYN / SYN ACK / ACK를 정상적으로 주고받으면 L4 스위치는 서버의 상태가 정상이라고 판단합니다.

<TCP를 이용한 헬스 체크>

여담으로 3-way handshake를 실시하면 논리적인 연결인 커넥션이 생성하게 되는데 커넥션 생성이 아닌 헬스체크가 목적이므로 L4 스위치는 바로 FIN Packet을 날려 커넥션을 제거합니다.

두 번째 방법인 HTTP입니다. 3-way handshake를 실시하는 것은 동일합니다. 하지만 HTTP인 만큼 추가로 HTTP Request(GET)을 전송하며 웹페이지를 요구합니다.

<HTTP를 이용한 헬스 체크>

F5 Networks의 L4 스위치에서는 아무런 설정을 하지 않으면 "GET /", Default HTML Page를 요구합니다. 그리고 서버가 이를 전송하면 헬스 체크에 성공한 것으로 판단합니다. 여담으로 Response string을 설정하여 특정 조건에 부합하는 웹 페이지를 요구할 수도 있습니다.

헬스 체크는 인터벌과 타임 아웃 조절이 중요합니다. 너무 짧으면 서버가 잠시 응답을 못 했음에도 헬스 체크 실패로 판단하여 부하 분산을 방해할 수 있고 너무 길면 서버가 실제로 다운되었음에도 헬스 체크 실패를 감지하는데 오랜 시간이 걸려 서비스 장애를 불러올 수 있습니다. 저는 각 벤더의 장비에 설정된 기본 모니터링 시간을 사용하는 것을 권고하고 싶습니다.

 

Connection & Connection timeout

Connection(이하 커넥션)은 L4 스위치를 통해 사용자와 서버가 맺는 논리적인 연결을 의미합니다. L4 스위치를 통해 부하분산을 실시했을 경우에는 L4 스위치 또한 논리적인 연결에 동참하여 커넥션을 생성합니다. 그리고 커넥션 테이블을 생성하여 커넥션들을 관리합니다. 네트워크 상에 커넥션이 있는 것이 아니라 사용자의 컴퓨터, L4 스위치, 서버가 각각 커넥션을 가지고 있음을 기억하는 것입니다. 이 커넥션이 없으면 사용자와 L4 스위치, 서버는 데이터를 주고받을 수 없으며 커넥션을 생성하기 위해 3-way handshake를 실시해야 합니다. (TCP의 경우 말이죠!) 

<커넥션의 정의>

L4 스위치는 부하 분산 장비임과 동시에 커넥션을 관리하는 장비입니다. 사용자가 필요로 하는 경우 커넥션을 생성해야 하지만 사용되지 않는 커넥션을 제거하여 서버의 부하를 줄여주어야 합니다. 그렇기에 L4 스위치에는 각각의 커넥션에 대해 타임 아웃이 존재하며 해당 커넥션이 사용되지 않는다고 판단되면 Count down(이하 카운트 다운)을 시작합니다. 카운트 다운의 끝에 도달하여 커넥션을 제거하는 시점을 Connection time out(이하 커넥션 타임아웃)이라고 합니다. 

<Connection time out 이후의 모습>

위의 그림에서 L4 스위치는 커넥션 타임아웃에 도달한 상태로 커넥션이 제거되었기 때문에 사용자가 다시 서버에 접속하기 위해서는 다시 L4 스위치를 통해 3-way handshake를 실시해야 합니다. L4 스위치의 커넥션이 사라져 서버와 통신할 수 없으니 커넥션을 재생성하는 것입니다. 위와 같은 상황이 발생하는 이유는 L4 스위치의 커넥션 타임아웃과 Client / Server의 커넥션 타임아웃이 다르기 때문입니다. Client / Server의 커넥션 타임 아웃이 L4 스위치보다 더 길면 위와 같은 상황이 발생할 수 있습니다.

F5 Networks에서 TCP Connection의 Default connection time out은 300초입니다. 커넥션 타임 아웃 또한 서비스 환경에 따라 적절히 조절하는 것이 좋으나 Default time out인 300초를 추천하고 싶습니다. 

 

Persistence(Sticky)

Persistence 혹은 Sticky는 사용자가 한 번 접속하여 커넥션을 맺었던 서버를 기억하는 또 다른 커넥션으로 위 2가지 요소와는 다르게 선택 사항에 해당하는 커넥션입니다. 사용자가 서비스 사용을 위해 서버에 접속하면 커넥션이 생성함과 동시에 Sticky session(이하 스티키 세션)을 생성하게 되는데요. 사용자가 더 이상 통신을 하지 않아 커넥션 타임 아웃이 지나 커넥션이 사라져도 L4 스위치는 스티키 세션을 유지하여 사용자가 접속했던 서버를 기억합니다. 그리고 사용자가 다시 접속을 시도하면 과거 이력이 있던 서버로 부하 분산하여 커넥션을 맺도록 합니다. 이 스티키 세션은 왜 필요한 것일까요?  

스티키 세션이 없다고 가정해봅시다! 아래 그림에서 사용자는 서버 1을 통해 요청을 처리하고 있는 중입니다. 아직 완료되지는 않았습니다. 그러다가 잠시 사용자가 자리를 비웠고 커넥션에 트래픽이 흐르지 않자 L4 스위치는 커넥션을 제거합니다. 

<데이터를 주고 받던 사용자와 서버 1>

그리고 사용자가 자리에 돌아와 다시 서버 1을 통해 다시 요청을 마무리하고자 합니다. 하지만 L4 스위치에는 커넥션이 없기 때문에 사용자는 다시 L4 스위치에 접속해 부하 분산을 실시하여 서버에 접속해야 합니다. 그런데 L4 스위치가 서버 1이 아닌 서버 2로 부하 분산하게 됩니다.(서버 부하 분산 방법은 라운드로빈으로 가정하며, 서버 1로 부하 분산하는 경우도 있습니다.)

<뜬금 없는 요청에 황당한 서버 2>

서버 2는 뜬금 없는 요청에 당황스럽기만 합니다. 사용자와 서버 1이 처리하던 것에 대한 정보가 없을 테니 제대로 처리할 수 없을 테지요. 스티키를 설정하게 되면 L4 스위치가 일정 기간 동안 스티키 세션을 생성하여 과거 사용자가 서버 1에 연결했던 이력을 기억하고 사용자가 다시 접속하면 과거 접속했던 서버로 부하 분산을 실시합니다. F5 Networks의 Default stick time out은 300초입니다. 

여기까지가 L4 스위치의 중요한 3요소에 대한 설명이었습니다. 다음 문서에서는 L4 스위치의 네트워크 구성에 대해 알아보도록 하겠습니다.