본문으로 바로가기

09

헬스체크

죽은 서버를 빼주는 것은 로드밸런서가 아니라, 그 사실을 아는 로드밸런서다

먼저 보면 좋은 강의: 로드밸런서, 수평 확장과 수직 확장

단계별로 보기

스페이스바로 재생/정지, 좌우 화살표로 단계 이동, R로 처음으로 돌아갑니다.

대기 중1 / 4 단계 — 순찰이 도는 동안

로드밸런서가 주기적으로 세 서버에 "살아 있나요?"를 묻습니다. 전부 대답합니다. 요청은 세 서버에 골고루 나뉩니다. 이 질문이 헬스체크입니다. 야간 순찰과 같습니다.

가용성1

이 강의를 마치면

  • 로드밸런서가 서버의 죽음을 자동으로 아는 것이 아니라 물어봐서 안다는 것을 설명한다.
  • 점검 주기와 판정 횟수가 장애 노출 시간을 결정하는 방식을 계산한다.
  • 너무 민감한 헬스체크가 왜 더 위험한지 설명한다.
  • 살아 있음(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)와 자동 격리
  • 헬스체크 자체가 만드는 부하와 그 폭주

더 읽을거리: Google SRE Book — Addressing Cascading Failures

이제 직접 만들어 보세요

읽어서 아는 것과 만들어서 아는 것은 다릅니다. 컴포넌트를 배치하고 트래픽을 흘려서 실제로 동작하는지 확인해 보세요.

실습 과제 열기

이 강의에 물어보기

하루 5번

이 강의 본문만 근거로 답합니다. 강의에 없는 내용은 지어내지 않습니다.