1. Availability 개요
- 가용성(Availability)은 시스템이 정상적으로 작동하며 사용 가능한 상태를 유지하는 능력을 의미합니다.
- 분산 시스템의 복원력(Resiliency)을 정량적으로 측정하는 가장 중요한 지표 중 하나입니다.
- 고가용성 워크로드를 구축한다는 것은 시스템이 장애 상황에서도 최소한의 중단 시간으로 서비스를 제공할 수 있도록 설계하는 것을 의미합니다.
1.1 가용성의 정의
- 가용성(A)은 워크로드가 사용 가능한 시간의 비율로 정의됩니다.
- 예상되는 "가동 시간(uptime)"과 전체 측정 시간(가동 시간 + 중단 시간) 사이의 비율입니다.
A = uptime / (uptime + downtime)
A: 가용성 (Availability)
uptime: 시스템이 정상적으로 작동하는 시간
downtime: 시스템이 중단된 시간
1.2 가용성의 중요성
- 사용자 경험에 직접적인 영향을 미칩니다.
- 비즈니스 손실을 최소화합니다.
- 시스템 신뢰성을 보장합니다.
- 경쟁 우위를 확보할 수 있습니다.
2. 가용성 측정 지표
가용성을 측정하고 개선하기 위해서는 다음 세 가지 핵심 지표를 이해해야 합니다.
2.1 MTBF (Mean Time Between Failure)
- MTBF는 평균 장애 간격을 의미합니다.
- 워크로드가 정상 작동을 시작한 시점부터 다음 장애가 발생할 때까지의 평균 시간입니다.
- MTBF가 길수록 시스템이 안정적이라는 의미입니다.
예시
시스템이 3개월 동안 3번 장애 발생:
- 1차 장애: 30일 후
- 2차 장애: 35일 후
- 3차 장애: 25일 후
MTBF = (30 + 35 + 25) / 3 = 30일
2.2 MTTR (Mean Time To Repair/Recovery)
- MTTR은 평균 복구 시간을 의미합니다.
- 장애가 발생한 후 시스템이 정상 상태로 복구되기까지 걸리는 평균 시간입니다.
- 워크로드를 사용할 수 없는 기간을 나타냅니다.
- MTTR이 짧을수록 시스템의 가용성이 높습니다.
- MTTR 구성 요소
- 장애 감지 시간
- 문제 진단 시간
- 수리/복구 실행 시간
- 시스템 재시작 및 검증 시간
2.3 MTTD (Mean Time To Detection)
- MTTD는 평균 감지 시간을 의미합니다.
- 장애가 발생한 시점부터 복구 작업이 시작되기까지의 시간입니다.
- MTTR의 중요한 구성 요소입니다.
- MTTD가 짧을수록 빠르게 문제에 대응할 수 있습니다.
2.4 지표 간 관계

- MTTD는 MTTR의 일부입니다. 장애를 빨리 감지할수록(MTTD 감소) 전체 복구 시간(MTTR)도 줄어들어 가용성이 향상됩니다.
3. 가용성 계산
3.1 MTBF와 MTTR을 이용한 가용성 계산
- 가용성은 MTBF(가동 시간)와 MTTR(중단 시간)을 사용하여 표현할 수 있습니다.
A = MTBF / (MTBF + MTTR)
예시 1
MTBF = 720시간 (30일)
MTTR = 1시간
A = 720 / (720 + 1) = 0.9986 = 99.86%
예시 2
MTBF = 8760시간 (1년)
MTTR = 2시간
A = 8760 / (8760 + 2) = 0.9998 = 99.98%
3.2 장애 확률
- 워크로드가 "사용 불가능한" 상태일 확률은 장애 확률(F)로 표현됩니다.
F = 1 - A
F: 장애 확률 (Failure probability)
A: 가용성 (Availability)
예시
가용성이 99.9%인 시스템:
F = 1 - 0.999 = 0.001 = 0.1%
연간 중단 시간 = 365일 × 24시간 × 0.001 = 8.76시간
3.3 가용성 수준별 연간 다운타임
| 가용성 | 연간 다운타임 | 월간 다운타임 | 주간 다운타임 | 일일 다운타임 |
|---|---|---|---|---|
| 90% (1 nine) | 36.53일 | 73시간 | 16.8시간 | 2.4시간 |
| 99% (2 nines) | 3.65일 | 7.31시간 | 1.68시간 | 14.40분 |
| 99.9% (3 nines) | 8.77시간 | 43.83분 | 10.08분 | 1.44분 |
| 99.95% (3.5 nines) | 4.38시간 | 21.92분 | 5.04분 | 43.20초 |
| 99.99% (4 nines) | 52.60분 | 4.38분 | 1.01분 | 8.64초 |
| 99.995% (4.5 nines) | 26.30분 | 2.19분 | 30.24초 | 4.32초 |
| 99.999% (5 nines) | 5.26분 | 26.30초 | 6.05초 | 0.86초 |
높은 가용성의 비용
가용성이 높아질수록 이를 달성하기 위한 비용과 복잡도가 기하급수적으로 증가합니다. 99.9%에서 99.99%로 향상하는 것보다 99.99%에서 99.999%로 향상하는 것이 훨씬 어렵습니다.
4. 가용성 향상 전략
- 가용성 개선의 3가지 핵심 요소는 아래와 같습니다.
- 더 긴 MTBF: 장애가 덜 자주 발생하도록 함
- 더 짧은 MTTD: 장애를 빠르게 감지함
- 더 짧은 MTTR: 복구 시간을 단축함
이 세 가지 요소가 분산 시스템의 가용성을 개선하는 핵심입니다.
5. 분산 시스템의 가용성
5.1 분산 시스템의 구성 요소
- 분산 시스템은 소프트웨어 컴포넌트와 하드웨어 컴포넌트로 구성됩니다.
- 일부 소프트웨어 컴포넌트는 그 자체로 또 다른 분산 시스템일 수 있습니다.
- 하드웨어와 소프트웨어 컴포 넌트 모두의 가용성이 워크로드의 전체 가용성에 영향을 미칩니다.
5.2 하드웨어와 소프트웨어의 장애 차이
5.2.1 하드웨어 장애 특성
- 예측 가능한 수명
- 하드웨어는 사람의 노화처럼 예측 가능한 패턴으로 고장납니다. 이를 "욕조 곡선(Bathtub Curve)"이라고 부릅니다.
- 초기: 불량품이 빠르게 고장 (유아 사망기)
- 중기: 안정적으로 작동 (성인기)
- 후기: 마모로 인한 고장 증가 (노년기)
- 제조사는 테스트를 통해 하드웨어가 언제쯤 고장날지 미리 계산할 수 있습니다.
- 하드웨어는 사람의 노화처럼 예측 가능한 패턴으로 고장납니다. 이를 "욕조 곡선(Bathtub Curve)"이라고 부릅니다.
- 실제 수명 예시
- 일반 하드디스크(HDD)의 경우 연간 고장률이 약 1% 미만입니다.
- 보통 3-5년 정도는 문제없이 사용할 수 있고, 더 오래 쓸 수도 있습니다.
- 한번 만들어진 하드웨어는 사용 중에 물리적으로 바뀌지 않습니다.
- 수명이 있는 제품
- 하드웨어는 사용하다 보면 결국 수명이 다해서 교체해야 합니다.
- 전구나 자동차 부품처럼 일정 기간 후에는 고장날 것을 예상하고 만들어집니다.
5.2.2 소프트웨어 장애 특성

- 소프트웨어는 각 새로운 릴리스마다 도입되는 추가 결함으로 인해 계단식 곡선을 따릅니다.
- 분산 시스템의 소프트웨어는 일반적으로 하드웨어보다 기하급수적으로 높은 비율로 변경됩니다.
- 예: 3-5년 동안 Amazon은 소프트웨어 시스템에 4억 5천만에서 7억 5천만 개 이상의 변경을 배포합니다.
- 소프트웨어는 이론적으로 마모 기간이 없으며 무기한 운영될 수 있습니다.
- 하드웨어에 사용되는 동일한 테스트 및 예측 모델을 소프트웨어에 적용할 수 없습니다.
소프트웨어 가용성의 예측 어려움
분산 시스템에서 "앞으로 얼마나 자주 고장날지(MTBF)", "고장나면 얼마나 빨리 복구할 수 있을지(MTTR)"를 미리 계산하는 것은 결국 예측이나 추정일 뿐입니다.
이러한 수치는 보장이 아닙니다. 실제로는 예상보다 더 자주 고장날 수도 있고, 복구가 더 오래 걸릴 수도 있습니다.
Rule 2: 소프트웨어 가용성의 중요성
워크로드 내 소프트웨어의 가용성은 워크로드 전체 가용성의 중요한 요소이며, 다른 컴포넌트와 동등한 수준의 관심을 받아야 합니다.
5.3 분산 시스템의 버그 유형
분산 시스템에는 가용성에 영향을 미치는 두 가지 주요 버그 클래스가 있습니다.
5.3.1 Bohrbug (보어버그)
- 반복 가능한 기능적 소프트웨어 이슈입니다.
- 동일한 입력이 주어지면 버그는 일관되게 동일한 잘못 된 출력을 생성합니다.
- 결정론적인 보어 원자 모델처럼 견고하고 쉽게 감지됩니다.
- 이러한 유형의 버그는 워크로드가 프로덕션에 도달할 때까지는 드뭅니다.
- Bohrbug의 특징
- 재현 가능
- 디버깅 용이
- 일관된 동작
5.3.2 Heisenbug (하이젠버그)
- 일시적인 버그로, 특정하고 드문 조건에서만 발생합니다.
- 이러한 조건은 일반적으로 다음과 관련이 있습니다:
- 하드웨어 (예: 일시적인 장치 오류, 레지스터 크기와 같은 하드웨어 구현 세부 사항)
- 컴파일러 최적화 및 언어 구현
- 제한 조건 (예: 일시적인 스토리지 부족)
- 경쟁 조건 (예: 멀티스레드 작업에 세마포어를 사용하지 않음)
- Heisenbug의 특징
- 프로덕션의 대부분의 버그를 차지합니다.
- 찾기 어려움
- 관찰하거나 디버그하려고 하면 행동이 변하거나 사라지는 것처럼 보입니다.
- 프로그램을 재시작하면 운영 환경이 약간 달라져서 Heisenbug를 발생시킨 조건이 제거되므로 실패한 작업이 성공할 가능성이 높습니다.
Heisenbug 대응 전략
프로덕션의 대부분의 장애는 일시적이며, 작업을 재시도하면 다시 실패할 가능성이 낮습니다. 복원력을 갖추기 위해 분산 시스템은 Heisenbug에 대한 장애 허용성을 가져야 합니다.
6. 의존성과 가용성
6.1 의존성의 종류
- 워크로드는 기능을 제공하기 위해 다양한 컴포넌트에 의존합니다.
- 이러한 컴포넌트를 **의존성(Dependencies)**이라고 부릅니다.
6.1.1 Hard Dependencies (하드 의존성)
- 워크로드가 기능을 수행하기 위해 반드시 필요한 것들입니다.
- 하드 의존성의 가용성은 워크로드의 가용성에 직접적인 영향을 미칩니다.
- 예시: 데이터베이스, 인증 서비스, 결제 게이트웨이