09강
헬스체크
죽은 서버를 빼주는 것은 로드밸런서가 아니라, 그 사실을 아는 로드밸런서다
먼저 보면 좋은 강의: 로드밸런서, 수평 확장과 수직 확장
단계별로 보기
스페이스바로 재생/정지, 좌우 화살표로 단계 이동, R로 처음으로 돌아갑니다.
대기 중1 / 4 단계 — 순찰이 도는 동안
로드밸런서가 주기적으로 세 서버에 "살아 있나요?"를 묻습니다. 전부 대답합니다. 요청은 세 서버에 골고루 나뉩니다. 이 질문이 헬스체크입니다. 야간 순찰과 같습니다.
이 강의를 마치면
- 로드밸런서가 서버의 죽음을 자동으로 아는 것이 아니라 물어봐서 안다는 것을 설명한다.
- 점검 주기와 판정 횟수가 장애 노출 시간을 결정하는 방식을 계산한다.
- 너무 민감한 헬스체크가 왜 더 위험한지 설명한다.
- 살아 있음(liveness)과 일할 수 있음(readiness)의 차이를 구분한다.
로드밸런서는 어떻게 알까
앞 강의에서 "로드밸런서가 죽은 서버를 자동으로 뺀다"고 했습니다. 편리해 보였습니다. 그런데 어떻게 아는 걸까요?
서버가 죽을 때 "저 이제 죽습니다"라고 인사하고 죽으면 좋겠지만, 그런 일은 없습니다. 전원이 나가면 그냥 사라집니다. 아무 말도 없이요.
그래서 로드밸런서는 주기적으로 물어봅니다.
로드밸런서 → 서버 1: "살아 있나요?" → "네"
로드밸런서 → 서버 2: "살아 있나요?" → "네"
로드밸런서 → 서버 3: "살아 있나요?" → (무응답)이 질문이 헬스체크입니다. 야간 순찰과 같습니다. 순찰을 돌아야 사고를 발견합니다. 순찰을 안 돌면 사고가 나도 모릅니다.
사고와 발견 사이에는 시간이 있다
여기가 핵심입니다. 순찰 사이에는 공백이 있습니다.
10분마다 순찰을 돈다면, 사고가 난 직후에 순찰이 지나갔을 경우 발견까지 최대 10분이 걸립니다. 그동안 아무도 모릅니다.
로드밸런서도 똑같습니다. 설정이 이렇다고 합시다.
점검 주기 : 5초에 한 번 물어본다
판정 횟수 : 3번 연속 대답이 없으면 죽은 것으로 본다서버가 죽으면 언제 빠질까요?
0초 서버 사망
5초 1번째 질문 → 무응답 (1회)
10초 2번째 질문 → 무응답 (2회)
15초 3번째 질문 → 무응답 (3회) → 이제 뺀다15초입니다. 서버가 죽은 순간부터 15초 동안, 로드밸런서는 죽은 서버에 계속 요청을 보냅니다. 서버가 세 대라면 그 15초 동안 사용자의 3분의 1이 오류 화면을 봅니다.
이것이 실무에서 가장 자주 오해받는 지점입니다. "로드밸런서를 붙였으니 장애는 사용자에게 안 보인다"가 아닙니다. "장애가 15초 동안만 보인다" 입니다. 그리고 그 15초는 여러분이 설정한 숫자입니다. 우연이 아닙니다.
그러면 숫자를 줄이면 되는 것 아닌가
1초마다 묻고, 1번 실패하면 바로 빼면? 노출 시간이 1초가 됩니다. 완벽해 보입니다.
여기서 함정에 빠집니다.
너무 민감하면 더 위험하다
네트워크는 가끔 딸꾹질을 합니다. 서버가 순간적으로 바빠서 응답이 0.1초 늦을 수도 있습니다. 이건 고장이 아닙니다. 잠깐 그런 겁니다.
그런데 "1번 실패 = 사망"이면 이 딸꾹질에 멀쩡한 서버가 빠집니다. 그리고 이때 진짜 무서운 일이 시작됩니다.
1. 서버 A가 잠깐 느려짐 → 헬스체크 실패 → 빠짐
2. A가 받던 트래픽이 B와 C로 몰림
3. B가 부하를 못 견디고 느려짐 → 헬스체크 실패 → 빠짐
4. 이제 모든 트래픽이 C로 → C도 즉사
5. 전멸아무도 진짜로 고장 나지 않았는데 서비스 전체가 죽었습니다. 헬스체크가 죽였습니다. 이걸 연쇄 실패(cascading failure)라고 합니다. 예민한 경보기가 오히려 화재를 만든 셈입니다.
그래서 균형점을 찾는다
| 너무 느슨하면 | 너무 민감하면 | |
|---|---|---|
| 증상 | 죽은 서버에 오래 보낸다 | 멀쩡한 서버를 뺀다 |
| 결과 | 장애가 길게 노출 | 연쇄 실패로 전멸 |
실무에서 흔히 쓰는 값은 2~5초 주기에 2~3회 연속 실패입니다. 대략 5~15초의 노출을 감수하는 대신 딸꾹질에는 넘어가지 않는 지점입니다.
마법의 숫자는 없습니다. 이건 트레이드오프를 고르는 일이지 정답을 찾는 일이 아닙니다.
무엇을 물어볼 것인가
마지막으로 중요한 구분이 있습니다. "살아 있나요?"에도 두 가지 뜻이 있습니다.
| 묻는 것 | 실패하면 | |
|---|---|---|
| 살아 있음(liveness) | 프로세스가 떠 있나? | 재시작해야 한다 |
| 일할 수 있음(readiness) | 지금 요청을 받을 수 있나? | 트래픽만 빼면 된다 |
이 둘은 다릅니다. 서버가 막 켜져서 아직 준비 중이라면, 살아는 있지만 일은 못 합니다. 이때 요청을 보내면 실패합니다. 재시작해도 소용없습니다. 잠깐 트래픽만 빼주면 됩니다.
반대로 서버가 데이터베이스 연결이 끊겨 아무 일도 못 하는데 프로세스만 떠 있다면, "프로세스 살아 있나요?"에는 "네"라고 대답합니다. 로드밸런서는 계속 요청을 보내고, 사용자는 계속 오류를 봅니다. 헬스체크가 있는데도 장애가 안 걷힙니다.
그래서 헬스체크는 "떠 있나"가 아니라 "일할 수 있나"를 물어야 합니다. 좋은 헬스체크는 서버가 실제로 필요한 것들(데이터베이스 연결 등)을 확인하고 답합니다.
직접 해보세요
아래 과제의 로드밸런서는 헬스체크가 꺼져 있습니다. 서버 한 대가 도중에 죽습니다. 먼저 그대로 실행해서, 로드밸런서가 죽은 서버에 계속 요청을 보내는 것을 확인하세요. 그 다음 헬스체크를 켜고 다시 보세요.
이 강의가 단순화한 것
교육용 모형은 언제나 무언가를 생략합니다. 무엇을 생략했는지 아는 것도 학습의 일부입니다.
전제한 것
- 이 시뮬레이터에서 헬스체크는 250밀리초마다 한 번씩 점검한다. 점검 주기를 0보다 크게 두면 켜지고, 0으로 두면 꺼진다.
- 헬스체크가 꺼져 있어도 로드밸런서는 요청이 실패하는 것을 보고 뒤늦게 알아차릴 수 있다. 다만 트래픽이 적으면 그만큼 느리게 알아차린다.
- 이 강의에서는 살아 있음과 일할 수 있음을 구분해 설정할 수 없다. 개념으로만 설명한다.
- 헬스체크 요청 자체가 서버에 주는 부하는 무시한다.
다루지 않은 것
- 능동 헬스체크와 수동 헬스체크(실패 관찰)의 조합 전략
- 쿠버네티스의 liveness/readiness/startup probe 구분
- 이상치 탐지(outlier detection)와 자동 격리
- 헬스체크 자체가 만드는 부하와 그 폭주
이제 직접 만들어 보세요
읽어서 아는 것과 만들어서 아는 것은 다릅니다. 컴포넌트를 배치하고 트래픽을 흘려서 실제로 동작하는지 확인해 보세요.
이 강의에 물어보기
하루 5번이 강의 본문만 근거로 답합니다. 강의에 없는 내용은 지어내지 않습니다.