본문으로 바로가기

32

단일 장애점

하나만 멈춰도 전체가 멈추는 자리를 찾아내는 법

먼저 보면 좋은 강의: 웹 요청의 해부

단계별로 보기

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

대기 중1 / 4 단계 — 안전해 보이는 구성

서버가 두 대입니다. 한 대가 죽어도 다른 한 대가 받아줍니다. 많은 설계가 여기서 멈춥니다. 서버를 이중화했으니 됐다고 생각합니다. 그런데 앞을 보세요. 로드밸런서가 하나뿐입니다.

이 강의를 마치면

  • 단일 장애점이 무엇인지, 어떻게 기계적으로 찾는지 설명한다.
  • 부품을 사슬로 연결하면 전체 가용성이 각 부품보다 낮아지는 이유를 설명한다.
  • '하나뿐인 것'을 지우고 경로가 남는지 보는 방식으로 설계를 점검한다.
  • 단일 장애점이 없는 구조를 직접 만든다.

문이 하나뿐인 건물

10층짜리 건물에 사무실이 200개 있습니다. 그런데 출입구가 하나입니다. 그 문이 고장 나면 어떻게 될까요? 사무실 200개가 전부 무용지물입니다.

건물이 얼마나 큰지, 사무실이 몇 개인지는 아무 상관이 없습니다. 들어갈 방법이 하나뿐이면 그 하나가 건물 전체의 운명을 쥡니다.

이렇게 혼자 멈춰서 전체를 멈추게 할 수 있는 자리를 단일 장애점이라고 합니다.

찾는 방법은 손가락 하나면 된다

단일 장애점을 찾는 데 특별한 도구는 필요 없습니다. 구성도를 펴놓고 부품을 하나씩 손가락으로 가려보면 됩니다. 그리고 매번 같은 질문을 합니다.

"이게 지금 사라졌다. 사용자는 여전히 서비스를 쓸 수 있는가?"

답이 "아니오"면, 방금 가린 그 부품이 단일 장애점입니다. 끝입니다. 이 점검은 시스템을 실제로 멈춰보지 않아도 구성도만 보고 할 수 있습니다.

사용자 ──> 로드밸런서 ──> 서버 1
                     └──> 서버 2

서버 1을 가린다  → 서버 2로 간다      → 괜찮다
서버 2를 가린다  → 서버 1로 간다      → 괜찮다
로드밸런서를 가린다 → 갈 길이 없다    → 단일 장애점!

서버를 두 대로 늘려놓고 안심하는 경우가 많습니다. 그런데 그 앞의 로드밸런서가 하나면 아무 소용이 없습니다. 서버 두 대는 로드밸런서가 살아 있을 때만 의미가 있습니다.

이것이 이 강의의 핵심입니다. 중복은 경로 전체에 있어야 합니다. 한 군데만 하나로 남아 있으면, 나머지에 쏟은 노력이 거기서 다 새어 나갑니다.

왜 부품을 붙일수록 더 자주 고장 나는가

직관에 반하지만 중요한 사실입니다. 사슬로 이으면 전체는 가장 약한 부품보다도 약해집니다.

부품 하나가 99% 확률로 살아 있다고 합시다. 꽤 괜찮아 보입니다. 이런 부품을 다섯 개 줄줄이 이으면 전체는 얼마나 살아 있을까요?

0.99 × 0.99 × 0.99 × 0.99 × 0.99 ≈ 0.95

95%입니다. 부품은 하나도 나빠지지 않았는데 전체는 나빠졌습니다. 전부 살아 있어야 서비스가 되기 때문입니다. 하나라도 죽으면 끝입니다.

사슬로 이은 부품 수전체 가용성연간 정지 시간
1개99%약 3.6일
5개95%약 18일
10개90%약 36일

부품을 붙일수록 시스템은 더 자주 고장 납니다. 그래서 "기능을 하나 더 붙이자"는 말에는 언제나 숨은 비용이 있습니다.

나란히 두면 뒤집힌다

반대로 나란히 두면 정반대가 됩니다. 둘 다 죽어야 서비스가 멈추니까요.

둘 다 죽을 확률 = 0.01 × 0.01 = 0.0001
살아 있을 확률  = 99.99%

99%짜리 부품 두 개로 99.99%를 만들었습니다. 부품을 더 좋게 만든 게 아니라 배치만 바꿨는데 정지 시간이 3.6일에서 1시간 아래로 줄었습니다.

사슬로 이으면 곱해서 나빠지고, 나란히 두면 곱해서 좋아집니다. 가용성 설계는 결국 "무엇을 사슬에서 빼내 나란히 둘 것인가"를 정하는 일입니다.

정직하게 말할 것

나란히 둔다고 저절로 되는 것은 아닙니다. 위 계산에는 조용한 가정이 하나 있습니다. 두 부품이 서로 무관하게 고장 난다는 가정입니다.

현실에서는 자주 틀립니다. 서버 두 대가 같은 전원에 물려 있으면 정전 때 함께 죽습니다. 같은 배포로 같은 버그가 올라가면 함께 죽습니다. 이때 두 대는 사실상 한 대입니다.

그래서 "두 대 뒀으니 됐다"가 아니라 "이 둘이 같은 이유로 함께 죽을 수 있나?"를 물어야 합니다. 이 질문을 지역 단위까지 밀고 간 것이 뒤에서 다룰 재해 복구입니다.

직접 해보세요

아래 과제의 구성에는 단일 장애점이 있습니다. 손가락으로 하나씩 가려보며 찾아낸 다음, 어떤 부품 하나가 사라져도 서비스가 유지되도록 고치세요.

이 강의가 단순화한 것

교육용 모형은 언제나 무언가를 생략합니다. 무엇을 생략했는지 아는 것도 학습의 일부입니다.

전제한 것

  • 이 강의의 단일 장애점 판정은 연결 구조만 본다(위상 검사). 실제로 부품을 멈춰보지 않고 '가렸을 때 경로가 남는가'만 확인한다.
  • 이 시뮬레이터의 사용자는 연결된 첫 번째 진입점으로만 요청을 보낸다. 그래서 진입점을 두 개 두어도 실행 화면에서 자동 전환이 보이지는 않는다. 실제 환경에서 이 전환은 DNS나 애니캐스트가 담당하며 여기서는 모델링하지 않는다. 구조 점검의 결론(진입점이 하나면 위험하다)은 그대로 유효하다.
  • 가용성 계산(0.99의 거듭제곱)은 각 부품이 서로 무관하게 고장 난다는 가정 위에 있다. 본문에서 설명하듯 현실에서는 이 가정이 자주 깨진다.
  • 중복을 두면 용량도 함께 늘어난다고 보지 않는다. 한 대가 죽었을 때 남은 대수가 전체 부하를 감당하는지는 따로 확인해야 한다.

다루지 않은 것

  • 상관 고장(같은 전원·같은 배포·같은 지역)의 정량 분석
  • 액티브-액티브와 액티브-스탠바이의 차이
  • 쿼럼과 홀수 노드 구성
  • 데이터 계층의 중복 — 별도 강의에서 다룬다

더 읽을거리: Google SRE Book — Embracing Risk

이제 직접 만들어 보세요

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

실습 과제 열기

이 강의에 물어보기

하루 5번

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