SRE

Part I. 소개 (Introduction)

Ch01. 소개

TL;DR

  • SRE: 운영팀을 위한 소프트웨어 엔지니어. 이들은 가용성(availability), 응답 시간(latency), 성능(performance), 효율성(efficiency), 변화 관리(change management), 모니터링(monitoring), 위기 대응(emergency response), 수용량 계획(capacity planning)에 대한 책임을 진다.

Key Ideas

  • 가용성(availability)
  • 응답 시간(latency)
  • 성능(performance)
  • 효율성(efficiency)
  • 변화 관리(change management)
    • 제품의 단계적 출시
    • 문제를 빠르고 정확하게 도출하기
    • 문제 발생 시 안전하게 이전 버전으로 되돌리기
  • 모니터링(monitoring)
    • 알림(alerts): 문제가 발생했거나, 발생하려 할 때 사람이 즉각적으로 대응해야 함을 알린다.
    • 티켓(tickets): 사람의 대응이 필요하지만 즉각적인 대응이 필요하지 않은 상황을 의미한다.
    • 로깅(logging): 누군가 이 정보를 반드시 확인해야 할 필요는 없지만 향후 분석이나 조사를 위해 기록되는 내용이다.
  • 위기 대응(emergency response)
    • MTTF(Mean Time to Failure)
    • MTTR(Mean Time To Repair)
  • 수용량 계획(capacity planning)
    • 자연적 수요에 대한 정확한 예측. 필요한 수용력을 확보하기까지의 시간에 대한 예측을 이끌어낼 수 있다.
    • 자연적 수요와 인위적 수요를 정확하게 합산하기
    • 원천적인 수용력(서버, 디스크 등)을 바탕으로 서비스의 수용력을 측정하기 위한 통상의 시스템 부하 테스트

Ch02. 구글 프로덕션 환경 개요

TL;DR

  • 구글 데이터센터(datacenter)는 동질화된 하드웨어 위에 Borg, Colossus, Chubby, Stubby 같은 자체 시스템 소프트웨어를 얹어 대규모 장애를 추상화한 환경이다.
  • 머신(machine, 하드웨어)과 서버(server, 소프트웨어)를 명확히 구분하며, 자원 할당과 장애 복구는 클러스터 OS인 Borg가 담당한다.
  • 네트워킹은 Jupiter 패브릭(fabric)과 글로벌 백본 B4, GSLB(Global Software Load Balancer)로 구성되어 글로벌 트래픽을 효율적으로 분산한다.
  • 셰익스피어(Shakespeare) 예제를 통해 MapReduce 배치, Bigtable 저장, GFE 프론트엔드, RPC 백엔드, GSLB 라우팅이 한 요청 안에서 어떻게 맞물리는지 보여준다.

Key Ideas

  • 하드웨어 토폴로지(topology)
    • 머신(machine)은 하드웨어 또는 VM, 서버(server)는 서비스를 구현한 소프트웨어로 용어를 분리한다.
    • 수십 대의 머신이 랙(rack)을 이루고, 랙들이 행(row)을 이루며, 한두 개 이상의 행이 클러스터(cluster), 여러 클러스터가 데이터센터 빌딩, 인접한 빌딩들이 캠퍼스(campus)를 형성한다.
    • 데이터센터 내부는 Clos 네트워크 패브릭인 Jupiter로 연결되어 최대 1.3 Pbps의 bisection 대역폭을 제공하고, 데이터센터 간은 OpenFlow 기반 SDN 백본 B4로 연결된다.
  • 클러스터 운영체제 Borg
    • 분산 클러스터 OS로서 잡(job)을 실행하며, 잡은 다수의 동일한 태스크(task)들로 구성된다.
    • 태스크 위치가 유동적이므로 IP/포트 대신 Borg Naming Service(BNS) 경로(/bns/<cluster>/<user>/<job>/<task>)로 참조한다.
    • 자원 요구량을 기반으로 머신에 빈팩킹(binpacking)하면서 랙 단위 장애 도메인을 분산시키고, 자원 초과 사용 태스크는 죽이고 재시작한다.
  • 저장소 스택
    • 최하위 D 계층은 거의 모든 머신에서 동작하는 파일서버이고, 그 위 Colossus가 클러스터 전역 파일시스템과 복제/암호화를 제공하는 GFS(Google File System) 후속 시스템이다.
    • Colossus 위에 페타바이트급 NoSQL인 Bigtable, 글로벌 강한 일관성을 지원하는 SQL-like 시스템 Spanner, Blobstore 등이 동작한다.
  • 네트워킹과 부하 분산
    • 라우팅 결정을 중앙 컨트롤러로 옮긴 OpenFlow SDN과, 트래픽당 대역폭을 관리하는 Bandwidth Enforcer(BwE)로 네트워크 자원을 최적화한다.
    • GSLB(Global Software Load Balancer)는 DNS 지리적 분산, 사용자 서비스 단위, RPC 단위의 세 계층에서 부하를 분산한다.
  • 공유 인프라 시스템 소프트웨어
    • Chubby는 Paxos 기반의 분산 잠금/합의 서비스로, 마스터 선출과 BNS 매핑처럼 일관성이 필요한 데이터를 저장한다.
    • Borgmon은 서버 메트릭을 주기적으로 스크래이프(scrape)해 알림, 회귀 비교, 용량 계획에 활용하는 모니터링 시스템이다.
  • 소프트웨어 인프라
    • 모든 서비스는 Stubby(오픈소스 버전 gRPC) RPC로 통신하며, 데이터 직렬화는 XML 대비 작고 빠른 프로토콜 버퍼(protobuf)를 사용한다.
    • 모든 서버는 진단/통계용 HTTP 서버를 내장하고, 코드는 멀티스레드(multithread)로 작성되어 다코어를 활용한다.
  • 개발 환경
    • 대부분의 코드를 단일 모노레포(monorepo)에서 관리하며, 모든 변경은 체인지리스트(CL) 리뷰를 거쳐 메인라인에 머지된다.
    • 빌드/테스트는 데이터센터의 빌드 서버에서 병렬 수행되고, CL 제출 시 영향 범위의 테스트가 자동으로 돌며, 일부 프로젝트는 push-on-green으로 자동 배포된다.
  • 셰익스피어(Shakespeare) 예제 서비스
    • 배치 컴포넌트는 MapReduce(map → shuffle → reduce)로 셰익스피어 텍스트의 단어 인덱스를 만들어 Bigtable에 저장하고, 항상 떠 있는 프론트엔드가 사용자 검색을 처리한다.
    • 요청 흐름: DNS → GSLB → GFE(Google Frontend) 리버스 프록시 → Shakespeare 프론트엔드 → 백엔드 → Bigtable 순으로 RPC가 이어진다.
    • 100 QPS 처리 가능한 백엔드를 피크 3,470 QPS에 맞춰 N+2 중복으로 최소 37태스크 산정하고, 지역별(미주 17, 유럽 16, 아시아 6, 남미 4) 분산 및 Bigtable 리전 복제로 지연과 비용을 균형 있게 설계한다.

Shakespeare 검색 요청 흐름

sequenceDiagram
    participant U as 사용자
    participant D as DNS
    participant G as GSLB
    participant F as GFE (리버스 프록시)
    participant S as Shakespeare Frontend
    participant B as Shakespeare Backend
    participant T as Bigtable

    U->>D: shakespeare.google.com?
    D->>G: DNS 질의 → 최적 리전
    G-->>U: 가장 가까운 GFE IP
    U->>F: HTTPS 요청
    F->>S: RPC(Stubby)
    S->>B: 검색어 RPC
    B->>T: 단어 인덱스 조회
    T-->>B: Bigtable 응답
    B-->>S: 매치 리스트
    S-->>F: 렌더링된 응답
    F-->>U: HTTP 응답

Part II. 원칙 (Principles)

Ch03. 리스크 수용

TL;DR

  • 100% 신뢰성은 비용 대비 가치가 없으며, 사용자 경험을 좌우하는 약한 고리(네트워크, 단말 등) 때문에 인지조차 되지 않는다.
  • SRE는 신뢰성을 비즈니스가 감내 가능한 리스크 수준에 명시적으로 정렬시키는 방식으로 관리한다.
  • 오차 예산(error budget)은 제품 개발팀과 SRE가 혁신과 안정성 사이의 균형을 객관적 데이터로 협상하게 해 주는 공통 인센티브다.

Key Ideas

  • 리스크 관리(risk management)
    • 신뢰성을 한 단계 높일 때 비용은 선형이 아니라 100배씩 증가하므로, 가용성 목표는 최소이자 최대 한도로 다뤄야 한다.
  • 서비스 가용성 측정(measuring service risk)
    • 시간 기반 가용성 대신 글로벌 분산 환경에서는 요청 성공률(request success rate)로 측정하며, 분기 단위 SLO를 주/일 단위로 추적한다.
  • 리스크 허용도(risk tolerance)
    • 가용성 목표, 장애 유형(부분 vs 전체), 비용/매출 영향, 지연 같은 다른 메트릭을 종합해 컨슈머 서비스와 인프라 서비스 각각에 맞게 정의한다.
  • 인프라 서비스의 차등 SLA
    • Bigtable처럼 저지연 클러스터와 처리량 클러스터로 구분해 명시적인 서비스 레벨을 제공함으로써 비용 대비 효율을 확보한다.
  • 오차 예산(error budget)
    • SLO에서 도출한 분기별 허용 실패율로, 예산이 남아 있는 동안에는 릴리즈가 가능하고 소진되면 자동으로 릴리즈가 늦춰진다.
  • 카나리(canary)와 푸시 빈도
    • 모든 푸시는 리스크이므로 카나리 기간/규모, 테스트 강도 등을 오차 예산을 기준으로 결정한다.
  • 공동 책임(joint ownership)
    • 네트워크 장애나 데이터센터 장애도 예산을 소모하므로, 가용성에 대한 책임을 팀 전체가 공유하게 만든다.

오차 예산 제어 루프

flowchart LR
    SLO[분기 SLO<br/>예: 99.9%] --> Budget[허용 실패 = 0.1%]
    Budget --> Track{예산 잔여?}
    Track -- 남음 --> Ship[릴리즈/실험 진행]
    Track -- 소진 --> Freeze[릴리즈 동결<br/>신뢰성 작업 우선]
    Ship --> Measure[실측 성공률]
    Freeze --> Measure
    Measure --> Track

Ch04. 서비스 수준 목표

TL;DR

  • SLI/SLO/SLA를 명확히 구분하고, 사용자가 진짜 신경 쓰는 소수의 지표만 골라 측정하라.
  • SLO는 분포(percentile) 관점으로 다루고, 너무 많거나 너무 엄격하게 잡지 말고 단순하게 시작하라.
  • SLO를 공개하면 기대치를 정렬할 수 있으며, 의도된 장애 주입(planned outage)으로 과의존을 방지한다.

Key Ideas

  • 용어 구분(SLI/SLO/SLA)
    • SLI는 정량 지표(latency, error rate, throughput, availability), SLO는 SLI의 목표 범위, SLA는 위반 시 결과(보상/페널티)가 따르는 명시적 계약이다.
  • 가용성과 내구성(availability/durability)
    • 가용성은 "나인(nines)"으로 표현되며, 스토리지에서는 데이터 보존성을 의미하는 내구성도 동등하게 중요하다.
  • 사용자 중심의 지표 선택
    • 사용자 대면 시스템은 가용성/지연/처리량, 스토리지는 지연/가용성/내구성, 빅데이터는 처리량/엔드투엔드 지연을 본다.
  • 분포와 백분위수(percentile)
    • 평균은 롱테일을 가린다. 히스토그램과 99/99.9 백분위로 측정해야 사용자 체감을 반영한다.
  • SLO 설정 원칙
    • 현재 성능 기준으로 잡지 말고, 단순하게, 절대값(infinite/always)을 피하고, 가능한 적게, 완벽보다 점진적 개선으로 가라.
  • 제어 루프(control loop)
    • SLI 측정 → SLO와 비교 → 필요한 조치 결정 → 실행의 사이클로 시스템을 운영한다.
  • 안전 마진과 과달성 방지
    • 외부 공개 SLO보다 빡빡한 내부 SLO를 두고, Chubby처럼 의도적 다운타임으로 과도한 의존을 끊어낸다.
  • SLA의 보수성
    • SLA는 광범위한 사용자에게 약속하는 만큼 변경/철회가 어려워, 보수적으로 광고하는 것이 안전하다.

SLI / SLO / SLA 비교

구분 정의 예시 위반 결과 결정 주체
SLI (Indicator) 측정되는 정량 지표 p99 지연, 성공률 SRE/개발팀
SLO (Objective) SLI에 대한 내부 목표 p99 < 500ms, 99.9% 성공 엔지니어링 대응 트리거 SRE + 개발팀 합의
SLA (Agreement) 외부 고객과의 계약 월 99.5% 미만 시 환불 금전적 보상/페널티 비즈니스/법무

Ch05. 삽질 없애기

TL;DR

  • 삽질(toil)은 단순히 싫은 일이 아니라 수동적·반복적·자동화 가능·전술적·지속 가치 없음·서비스 규모에 선형 비례하는 운영 작업이다.
  • SRE는 시간의 50% 이상을 엔지니어링에 써야 하며, 이 약속이 SRE를 단순 Ops 조직으로 추락시키지 않게 한다.
  • 적절한 양의 삽질은 괜찮지만, 과도하면 번아웃(burnout), 사기 저하, 경력 정체, 팀 이탈을 유발한다.

Key Ideas

  • 삽질의 정의(toil)
    • 수동(manual), 반복적(repetitive), 자동화 가능(automatable), 전술적(tactical), 지속 가치 없음(no enduring value), O(n) 성장 중 다수에 해당하는 운영 작업.
  • 오버헤드(overhead)와의 구분
    • 회의, HR 업무 같은 운영 외 행정 업무는 삽질이 아니라 오버헤드이며, 일회성으로 큰 개선을 만드는 작업도 삽질이 아니다.
  • 50% 룰
    • 삽질을 SRE 시간의 50% 이하로 유지하고, 나머지는 미래의 삽질을 줄이는 엔지니어링 프로젝트에 투입한다.
  • 삽질의 하한선과 출처
    • 온콜 로테이션 자체가 25~33% 하한을 만들며, 인터럽트, 온콜 응답, 릴리즈/푸시가 주된 삽질 원천이다.
  • 엔지니어링 작업의 분류
    • 소프트웨어 엔지니어링, 시스템 엔지니어링, 삽질, 오버헤드 네 가지로 나누고 인간 판단이 필수이고 영구적 개선을 만드는 작업만 엔지니어링으로 친다.
  • 과도한 삽질의 폐해
    • 경력 정체, 사기 저하, 번아웃(burnout)에 더해 조직적으로는 혼란 야기, 진척 둔화, 잘못된 선례, 인재 이탈, 신뢰 파괴를 부른다.

작업 분류

분류 특징 예시 목표 비중
삽질(Toil) 수동·반복·자동화 가능·지속 가치 없음·O(n) 알림 수동 처리, 반복 롤백, 티켓 소화 50% 이하
오버헤드(Overhead) 운영 외 행정 업무 회의, HR, 교육, 코드 리뷰 자연 발생량
엔지니어링(Engineering) 인간 판단 필요 + 영구적 개선 자동화 도구 개발, 시스템 재설계 50% 이상

Ch06. 분산 시스템 모니터링

TL;DR

  • 좋은 모니터링은 신호는 높고 잡음은 낮아야 하며, 페이저는 긴급·실행 가능·사용자 영향이 있는 경우에만 울려야 한다.
  • 4가지 황금 신호(four golden signals): 지연(latency), 트래픽(traffic), 오류(errors), 포화도(saturation)에 집중하라.
  • 평균이 아니라 분포로 보고, 시스템은 단순하게 유지하며, 단기 가용성보다 장기 시스템 건강을 우선하라.

Key Ideas

  • 화이트박스/블랙박스(white-box/black-box monitoring)
    • 화이트박스는 내부 메트릭으로 임박한 문제까지 잡고, 블랙박스는 사용자 시점의 실제 증상을 검증한다.
  • 증상 vs 원인(symptoms vs causes)
    • 모니터링은 "무엇이 깨졌나"(증상)와 "왜"(원인)를 모두 답해야 하며, 페이지는 가급적 증상 기반이어야 한다.
  • 4가지 황금 신호(four golden signals)
    • Latency(성공/실패 분리), Traffic(수요 측정), Errors(명시/암묵/정책 위반), Saturation(가장 제약된 자원의 충만도).
  • 롱테일과 히스토그램
    • 평균 지연 100ms여도 99% 백분위는 수 초가 될 수 있어, 지수형 버킷 히스토그램으로 분포를 봐야 한다.
  • 측정 해상도(resolution)
    • 모든 지표를 초 단위로 수집하면 비용이 폭증하므로, 서버에서 내부 샘플링 후 외부에서 집계하는 방식을 활용한다.
  • 단순함의 원칙
    • 자주 트리거되지 않는 룰과 대시보드/알람에서 활용되지 않는 시그널은 제거 후보다.
  • 페이지 철학
    • 모든 페이지는 긴급성, 실행 가능성, 지능적 판단, 새로운 문제일 것이 요구된다.
  • 장기 관점(long term)
    • Bigtable·Gmail 사례처럼 단기 가용성을 의도적으로 낮춰서라도 근본 원인을 고치는 것이 장기적으로 이득이다.

4가지 황금 신호 (Four Golden Signals)

신호 무엇을 보는가 측정 방법 알림 임계값 예시
지연(Latency) 요청 처리 시간 성공/실패 분리된 p50/p95/p99 p99 > 500ms 5분
트래픽(Traffic) 수요 강도 QPS, 동시 세션 수 평소 대비 ±50%
오류(Errors) 실패율 명시적(5xx) + 암묵적(잘못된 응답) + 정책 위반 성공률 < 99.9%
포화도(Saturation) 가장 제약된 자원의 충만도 CPU·메모리·디스크·큐 길이 사용률 > 80%

Ch07. 구글의 발전된 자동화

TL;DR

  • 자동화는 일관성, 플랫폼화, 빠른 복구(MTTR 단축), 빠른 대응, 시간 절감의 가치를 제공한다.
  • 자동화는 무자동화 → 외부 스크립트 → 외부 범용 자동화 → 시스템 내장 자동화 → 자율(autonomous) 시스템의 단계로 진화한다.
  • 진정한 목표는 자동화가 아니라 자율 시스템이며, Borg는 클러스터 관리 자체를 자율 시스템으로 끌어올린 사례다.

Key Ideas

  • 자동화의 가치(value of automation)
    • 일관성, 플랫폼화(중앙집중 버그 수정), 빠른 복구(MTTR 단축), 사람보다 빠른 대응, 시간 절감.
  • 자동화 계층 구조(hierarchy of automation classes)
    • ① 무자동화 ② 외부 시스템별 자동화 ③ 외부 범용 자동화 ④ 시스템 내장 자동화 ⑤ 자동화 불필요한 자율 시스템.
  • MoB와 Decider 사례
    • MySQL on Borg(MoB)에서 페일오버를 30초 내로 자동화한 Decider로 운영 부담을 95% 감소.
  • Prodtest와 idempotent fix
    • Python 단위 테스트로 클러스터 설정 불일치를 검증하고, 멱등(idempotent)한 fix와 페어링해 일관성을 회복.
  • 자동화 소유권 문제
    • 서비스 팀에서 자동화를 분리한 turnup 팀은 도메인 지식 부족으로 품질이 떨어졌고, 결국 서비스 팀이 다시 책임지게 됨.
  • SOA 기반 cluster turnup
    • 각 서비스 팀이 Admin Server RPC를 제공하는 SOA 방식으로 저지연·정확·관련성 있는 자동화를 달성.
  • Borg와 자율성(autonomy)
    • 호스트/포트/잡을 정적으로 묶지 않고 자원을 풀로 관리하여 자가 복구·자동 OS 업그레이드를 가능하게 함.
  • 자동화의 위험성
    • Diskerase 사고처럼 빈 집합을 "전체"로 해석한 버그가 대규모 장애로 번질 수 있어, 율 제한과 sanity check, 멱등성이 필수.
  • 신뢰성 우선(reliability is the fundamental feature)
    • 규모가 커질수록 자율적·복원력 있는 동작이 필수이며, 디커플링·API·부수효과 최소화 같은 좋은 SW 엔지니어링이 토대가 된다.

자동화 5단계 진화

flowchart LR
    L1["① 무자동화<br/>사람이 매번 수동 실행"]
    L2["② 외부 시스템별<br/>각 서비스 전용 스크립트"]
    L3["③ 외부 범용<br/>재사용 가능한 도구"]
    L4["④ 시스템 내장<br/>서비스가 스스로 처리"]
    L5["⑤ 자율 시스템<br/>Borg처럼 자가 치유"]
    L1 --> L2 --> L3 --> L4 --> L5

Ch08. 릴리즈 엔지니어링

TL;DR

  • 릴리즈 엔지니어는 빌드/패키징/배포 전 과정을 일관되고 재현 가능하게 만드는 별도의 직무이며, SRE와 긴밀히 협업한다.
  • 핵심 철학은 셀프서비스, 높은 속도, 폐쇄적 빌드(hermetic builds), 정책 강제 네 가지다.
  • 모노레포(monorepo) 메인라인에서 분기 후 체리픽하고, 빌드/패키지/구성도 버전으로 묶어 재현성을 확보한다.

Key Ideas

  • 릴리즈 엔지니어 역할(release engineer)
    • 소스 관리, 컴파일러, 빌드 시스템, 패키지 매니저, 배포까지 다루며, 측정과 데이터 기반으로 모범 사례를 정의한다.
  • 4가지 철학
    • 셀프서비스 모델, 높은 속도(잦은 작은 릴리즈), 폐쇄적 빌드(hermetic builds), 정책·절차의 강제(policies and procedures).
  • 폐쇄적 빌드(hermetic builds)
    • 빌드 머신의 환경에 의존하지 않고 알려진 버전의 도구·라이브러리에만 의존해 동일 리비전은 동일 결과를 보장한다.
  • 분기와 체리픽(branching/cherry pick)
    • 메인라인에서만 개발하고 릴리즈는 분기에서, 버그 수정은 메인라인 → 분기로 체리픽해 정확한 릴리즈 콘텐츠를 확보한다.
  • Blaze, Rapid, MPM, Sisyphus 도구 체계
    • Blaze로 빌드, MPM(Midas Package Manager)으로 패키징, Rapid가 워크플로 오케스트레이션, Sisyphus로 복잡한 롤아웃 자동화.
  • 카나리(canary)와 점진적 롤아웃
    • 시스템 테스트 후 소수 클러스터에 카나리, 이후 위험 프로파일에 맞춰 시간/지역에 걸쳐 지수적으로 확장.
  • 구성 관리(configuration management)
    • 메인라인 직접 사용, 바이너리에 동봉, 별도 구성 패키지, 외부 저장소(Chubby/Bigtable) 등 여러 모델을 상황별로 선택.
  • 시작 시점의 중요성
    • 릴리즈 엔지니어링은 프로젝트 초기부터 예산과 인력을 잡고, 개발자·SRE·릴리즈 엔지니어가 처음부터 함께 일해야 한다.

릴리즈 파이프라인

flowchart LR
    Src[메인라인<br/>monorepo] -->|브랜치| Branch[릴리즈 브랜치]
    Branch -->|Blaze| Build[Hermetic Build]
    Build -->|MPM| Pkg[패키지<br/>Midas Package Manager]
    Pkg -->|Rapid| Test[시스템 테스트]
    Test -->|Sisyphus| Canary[카나리 클러스터]
    Canary -->|점진적 롤아웃| Prod[전체 프로덕션]
    Fix[버그 수정] -.체리픽.-> Branch

Ch09. 단순함

TL;DR

  • 신뢰성의 대가는 극단적 단순함의 추구이며, "지루한(boring) 코드"가 SRE에게는 최고의 칭찬이다.
  • 본질적 복잡성(essential complexity)은 받아들이되, 우발적 복잡성(accidental complexity)은 적극적으로 제거하라.
  • API 최소화, 모듈화, 작은 릴리즈, 죽은 코드 삭제(negative lines of code) 같은 실천이 단순함을 유지한다.

Key Ideas

  • 안정성과 민첩성의 균형(stability vs agility)
    • SRE의 일은 시스템의 민첩성과 안정성 사이의 균형을 잡는 것이며, 신뢰성 있는 프로세스가 결국 개발자 민첩성을 높인다.
  • 지루함의 미덕(virtue of boring)
    • 운영 환경의 서프라이즈는 SRE의 적이며, 코드는 예측 가능하게 비즈니스 목표만 달성해야 한다.
  • 본질적 vs 우발적 복잡성(essential/accidental complexity)
    • Fred Brooks의 "No Silver Bullet"처럼 우발적 복잡성은 엔지니어링 노력으로 제거 가능하므로 적극적으로 밀어내야 한다.
  • 죽은 코드 제거(negative lines of code)
    • 모든 코드 줄은 책임이며, 플래그로 끄거나 주석 처리하지 말고 소스 컨트롤을 믿고 삭제하라(Knight Capital 사고가 반례).
  • 최소 API(minimal APIs)
    • 메서드와 인자가 적을수록 이해하기 쉽고 잘 정의된 문제임을 시사한다("덜어낼 게 없을 때가 완성").
  • 모듈성(modularity)
    • 바이너리·구성 간 느슨한 결합, API 버저닝(versioning), 명확한 책임 분리가 부분적 변경과 독립 배포를 가능하게 한다.
  • 데이터 포맷의 모듈성
    • 프로토콜 버퍼(protocol buffers)처럼 전후방 호환되는 와이어 포맷이 시스템 진화를 지원한다.
  • 릴리즈 단순성(release simplicity)
    • 한 번에 하나의 변경만 배포하면 영향 분석이 쉬워지고 머신러닝의 경사하강법처럼 안전하게 빠르게 움직일 수 있다.

Part III. 실천 (Practices)

Ch10. 시계열 데이터로부터의 실용적 알림

TL;DR

  • 시계열 데이터 기반 모니터링은 화이트박스(white-box)와 블랙박스(black-box) 접근을 결합해야 한다.
  • Borgmon은 레이블(label)이 붙은 시계열을 메모리에 저장하고 규칙(rule)으로 평가한다.
  • 좋은 알림은 일시적 변동이 아닌 의미 있는 SLO 위반에 대해, 충분한 지속 시간 조건과 함께 발화한다.
  • 모든 모니터링 데이터가 알림이 되어선 안 되며, 페이지/티켓/대시보드를 명확히 구분한다.

Key Ideas

  • 화이트박스 모니터링(white-box monitoring)
    • 서비스 내부 메트릭을 노출(/varz 같은 엔드포인트)하여 병목과 실패 컴포넌트를 빠르게 파악한다.
  • 블랙박스 모니터링(black-box monitoring)
    • 사용자 관점에서 외부 동작을 검증하여 DNS/네트워크처럼 트래픽이 도달하기 전 발생하는 실패까지 잡는다.
  • 시계열 아레나(time-series arena)와 호라이즌(horizon)
    • Borgmon은 레이블 기반 시계열을 인메모리에 약 12시간 분량 저장하고 GC로 정리하며, 쿼리 윈도우를 호라이즌이라 부른다.
  • 규칙 평가(rule evaluation)와 벡터(vector)
    • 집계(aggregation), 비율(rate), 비(ratio) 같은 대수 표현으로 파생 시계열을 만들어 SLO 평가와 알림에 활용한다.
  • 카운터 vs 게이지(counter vs gauge)
    • 카운터는 단조 증가하여 샘플링 간 정보 손실이 적고, 게이지는 순간값이라 측정 간 변화가 누락될 수 있다.
  • 알림 설계 원칙(alert design)
    • 플래핑(flapping) 방지를 위한 최소 지속 시간, 다중 조건(에러 비율 1% AND 절대 에러율 1/s 초과), 운영자에게 필요한 컨텍스트 포함.
  • 계층적 모니터링(hierarchical monitoring)
    • 로컬 스크레이퍼 → 데이터센터 집계 → 글로벌 모니터로 이어지는 계층 구조로 단일 장애점과 확장성 한계를 회피한다.
  • 오픈소스 등가물
    • Prometheus, Riemann, Heka, Bosun 등이 동일한 시계열 기반 알림 모델을 제공한다.

Ch11. 온콜 대응

TL;DR

  • 온콜은 운영 부담과 엔지니어링 시간을 균형 있게 유지해야 지속 가능하다.
  • 구글 SRE는 온콜에 25% 이하, 엔지니어링 작업에 최소 50%를 보장한다.
  • 심리적 안전(psychological safety)과 명확한 절차가 직관 기반 판단의 위험(확증 편향 등)을 줄인다.
  • 운영 과부하(operational overload)와 운영 저부하(operational underload) 모두 관리 대상이다.

Key Ideas

  • 균형 잡힌 온콜 로테이션(balanced on-call rotation)
    • 단일 사이트 24/7 로테이션은 최소 8명, 다중 사이트는 사이트당 최소 6명이 필요하며 "follow the sun" 방식으로 야간 근무를 줄인다.
  • 양보다 질(quality over quantity)
    • 1건당 평균 6시간(분석/포스트모템 포함)을 기준으로 12시간 시프트당 2건 이하가 지속 가능한 한계다.
  • 보상 구조(compensation)
    • 시간 외 근무에 대해 대체 휴가 또는 현금 보상을 제공하되 급여 비례 상한을 둬 과도한 온콜을 자연스럽게 제한한다.
  • 안전감과 비난 없는 문화(feeling safe, blameless culture)
    • 명확한 에스컬레이션 경로, 문서화된 절차, 비난 없는(blameless) 포스트모템이 스트레스성 판단을 줄인다.
  • 직관 vs 분석(intuition vs analytics)
    • 투쟁-도피(fight-or-flight) 반응에서 비롯된 직관 대신, 데이터 기반 분석과 구조화된 절차를 우선한다.
  • 운영 과부하(operational overload) 대응
    • 잘못 설정된 알림과 노이즈 페이지를 재튜닝하고 관련 알림을 묶거나 개발팀과 책임을 재협상한다.
  • 운영 저부하(operational underload) 위험
    • 프로덕션과 멀어지면 지식과 자신감이 손실되므로 분기별 온콜 노출과 "Wheel of Misfortune" 같은 훈련을 진행한다.

온콜 부하 진단

상태 증상 주요 신호 조치
과부하 (Overload) 페이지 > 12h 시프트당 2건, 번아웃 야간 호출 다발, 지연된 포스트모템 노이즈 튜닝, 개발팀 책임 재협상, 인력 증원
적정 (Healthy) 시프트당 0–2건, 엔지니어링 시간 50%+ 근본 원인 수정이 전파됨 유지 — 분기 리뷰
저부하 (Underload) 시프트당 거의 0건, 연속 한산 운영 감각 저하, 절차 망각 Wheel of Misfortune, 분기 재노출, 팀 범위 확장

Ch12. 효과적인 장애 조치

TL;DR

  • 장애 조치는 일반적 방법론과 시스템 지식의 결합으로 학습 가능한 기술이다.
  • 가설 연역적 방법(hypothetico-deductive method)으로 관찰 → 가설 → 검증을 반복한다.
  • 대형 장애 시 근본 원인보다 "출혈을 멈추는" 트리아지(triage)를 우선한다.
  • 부정적 결과(negative results)도 가치 있는 데이터다.

Key Ideas

  • 문제 보고(problem report)
    • 기대 동작, 실제 동작, 재현 단계 세 가지를 포함하고 버그 트래킹 시스템에 일관된 폼으로 기록한다.
  • 트리아지(triage)
    • 트래픽 우회, 종속 실패 차단, 서브시스템 비활성화 등으로 우선 안정화한 뒤 근본 원인을 찾는다.
  • 검사(examination) 도구
    • 시계열 메트릭 그래프, 구조화 로깅(structured logging), Dapper 같은 요청 추적(request tracing), 현재 상태 노출 엔드포인트.
  • 분할 정복과 단순화(divide and conquer, simplify and reduce)
    • 잘 정의된 인터페이스로 컴포넌트를 분리해 블랙박스 테스트하고, 큰 시스템에서는 이분 탐색(bisection)으로 영역을 좁힌다.
  • 핵심 질문과 최근 변경(recent changes)
    • "무엇을, 왜, 어디서"를 묻고 시스템 관성을 가정하여 최근 배포·설정·환경 변화를 우선 의심한다.
  • 흔한 함정(common pitfalls)
    • 무관한 증상에 매몰, 안전하지 않은 가설 검증, 비현실적 이론 반복, 상관과 인과 혼동("말 발굽 소리에 얼룩말이 아닌 말을 떠올려라").
  • 부정적 결과의 가치(value of negative results)
    • 무엇이 효과가 없는지를 명확히 보여주고, 도구·방법론을 개선하며, 공유 시 산업 전반의 데이터 기반 문화를 강화한다.
  • 장애 조치 친화적 설계
    • 화이트박스 메트릭, 일관된 요청 ID, 변경의 통제·로깅을 처음부터 설계에 반영한다.

Ch13. 긴급 대응

TL;DR

  • 대형 시스템에서 장애는 필연이며, 핵심은 당황하지 않고 절차에 따라 대응하는 것이다.
  • 테스트, 변경, 프로세스로 인한 긴급 상황을 구분해 학습한다.
  • 통제된 실패가 통제되지 않은 실패보다 훨씬 안전하다.
  • 정직한 장애 기록과 "what-if" 질문이 사전 대비를 강화한다.

Key Ideas

  • 침착함과 협업(don't panic, you aren't alone)
    • 혼자 떠안지 말고 인시던트 응답 절차에 따라 추가 인력을 투입하며 체계적으로 대응한다.
  • 테스트 유발 긴급 상황(test-induced emergency)
    • 의도적 장애 주입이 숨은 종속성을 드러낼 수 있으며, 대규모 테스트 전 롤백 절차를 철저히 검증해야 한다.
  • 변경 유발 긴급 상황(change-induced emergency)
    • 단순한 인프라 설정 변경도 광범위한 크래시 루프를 유발할 수 있어 카나리(canary) 검증을 반드시 거쳐야 한다.
  • 프로세스 유발 긴급 상황(process-induced emergency)
    • 자동화의 버그는 빠르고 광범위한 피해를 만들 수 있고, 복구는 다국가 팀 간 수작업 조정이 필요할 수 있다.
  • 과거로부터 학습(learning from past)
    • 전술적 수정만 기록하지 말고 전략적 예방 조치를 함께 정직하게 문서화한다.
  • 큰 What-If 질문하기
    • 데이터센터 장애, 보안 침해, 인프라 재해를 미리 가정해 대응 계획을 준비한다.
  • 사전 테스트 권장(proactive testing)
    • 자원이 풍부한 시간대의 통제된 실패가 새벽의 예측 불가 실패보다 낫다.

Ch14. 장애 관리

TL;DR

  • 관리되지 않는 인시던트는 기술 집착, 빈약한 의사소통, 조율 없는 즉흥 대응(freelancing)으로 악화된다.
  • 책임의 재귀적 분리(recursive separation of responsibilities)로 역할을 명확히 한다.
  • 인시던트 커맨더, 운영, 커뮤니케이션, 플래닝의 4가지 핵심 역할이 있다.
  • 라이브 인시던트 문서와 명확한 인수인계가 대응의 척추다.

Key Ideas

  • 인시던트 커맨드(incident command)
    • 전체 상태를 유지하고 태스크포스를 구성하며, 위임되지 않은 모든 역할을 보유하고 장애물을 제거한다.
  • 운영 작업(operational work)
    • 오직 Ops 리드 팀만 시스템을 변경하며, 커맨더와 협력해 도구를 적용한다.
  • 커뮤니케이션(communication)
    • 이해관계자에게 주기적으로 업데이트를 발신하고 인시던트 문서의 정확성을 유지한다.
  • 플래닝(planning)
    • 버그 등록, 자원 조정, 시스템 일탈 추적 및 추후 복원 계획 등 장기적 사안을 담당한다.
  • 인식 가능한 커맨드 포스트(recognized command post)
    • 물리적 또는 가상 공간(IRC 등)에 모두가 접근 가능해야 하며, 로그가 남고 분산 협업이 가능해야 한다.
  • 라이브 인시던트 상태 문서(live incident state document)
    • 공동 편집 가능한 문서를 실시간 갱신해 현재 대응을 안내하고 후속 포스트모템에 활용한다.
  • 명확한 인수인계(clear handoff)
    • 신임 커맨더가 상황을 완전히 이해했음을 명시적으로 확인한 뒤에야 전임 커맨더가 이탈한다.
  • 인시던트 선언 기준(when to declare)
    • 다중 팀 조율 필요, 고객 영향 발생, 1시간 집중 분석에도 미해결인 경우 공식 절차를 가동한다.

인시던트 역할 구조

flowchart TB
    IC[Incident Commander<br/>전체 지휘 · 위임되지 않은 모든 일]
    Ops[Operations Lead<br/>시스템 변경 실행]
    Comm[Communications Lead<br/>이해관계자 업데이트]
    Plan[Planning Lead<br/>버그·자원·장기 복원]
    IC --> Ops
    IC --> Comm
    IC --> Plan
    Ops -.상황 공유.-> IC
    Comm -.상황 공유.-> IC
    Plan -.상황 공유.-> IC
역할 핵심 책임 하지 않는 것
Incident Commander 전체 상태 유지, 태스크포스 구성, 장애물 제거 직접 명령 실행(시스템 변경)
Operations Lead 시스템을 실제로 바꾸는 유일한 팀 외부 커뮤니케이션
Communications Lead 주기적 상태 공지, 인시던트 문서 갱신 기술적 판단
Planning Lead 버그 등록, 인수인계 준비, 장기 복원 계획 실시간 대응

Ch15. 포스트모템 문화: 실패로부터 배우기

TL;DR

  • 포스트모템은 처벌이 아닌 학습 기회로, 시스템과 프로세스 개선이 목적이다.
  • 비난 없는(blameless) 접근은 모든 참가자가 선의로 행동했다고 가정한다.
  • 명확한 트리거 기준을 미리 정의해 일관성을 확보한다.
  • 조직 차원의 의례(월간 포스트모템 등)가 문화 정착을 강화한다.

Key Ideas

  • 포스트모템 트리거(when to perform)
    • 사용자 가시 다운타임, 데이터 손실, 온콜 개입, 장기 해결, 모니터링 실패 등 사전 합의된 조건에서 작성한다.
  • 비난 없는 포스트모템(blameless postmortem)
    • 의료·항공 안전 문화에서 유래했으며 "사람을 고칠 순 없지만 시스템과 프로세스는 고칠 수 있다"는 철학에 기반한다.
  • 협업과 지식 공유(collaborate and share knowledge)
    • 실시간 공동 편집, 댓글, 알림 도구를 사용하고 시니어 엔지니어의 공식 리뷰를 거쳐 배포한다.
  • 포스트모템의 달(postmortem of the month)
    • 사내 뉴스레터에 우수 사례를 게시해 가시성을 높인다.
  • Google+ 포스트모템 그룹과 리딩 클럽
    • 사내 포럼과 팀 단위 토론 모임으로 과거 사례를 공유·학습한다.
  • Wheel of Misfortune
    • 신규 SRE를 위한 재해 역할극으로, 실제 인시던트 시나리오를 시뮬레이션해 대응 역량을 키운다.
  • 경영진의 가시적 지원
    • 관리자가 포스트모템 가치를 명확히 인정하고 보상해야 문화가 지속된다.

Ch16. 장애 추적

TL;DR

  • 신뢰성 향상의 출발점은 알려진 베이스라인의 측정이다.
  • Escalator는 미응답 알림을 자동 에스컬레이션하는 중앙 알림 시스템이다.
  • Outalator는 다중 알림 스트림을 시간 순으로 통합·주석·그룹화한다.
  • 자유 형식 태깅(tagging)으로 추세와 시스템적 문제를 가볍게 식별할 수 있다.

Key Ideas

  • Escalator
    • 1차 온콜이 응답하지 않으면 2차로 자동 에스컬레이션하며 기존 워크플로에 투명하게 통합된다.
  • Outalator
    • 시간 인터리브 큐 뷰(time-interleaved queue view)로 여러 알림 스트림을 한 화면에서 본다.
  • 인시던트 그룹화(incident grouping)와 중복 제거(deduplication)
    • 단일 인프라 사건이 여러 팀에 알림을 만들 때 이를 묶어 "알림 수"와 "인시던트 수"를 구분한다.
  • 자유 형식 태깅(free-form tagging)
    • cause:network:switch 같은 계층적 태그로 일관성과 유연성을 동시에 확보한다.
  • 분석과 리포팅(analysis and reporting)
    • 주당 인시던트 수, 인시던트당 알림 수 같은 기본 메트릭과 팀·기간 간 추세 비교를 제공한다.
  • 시프트 핸드오프(shift handoff)
    • 태그 요약이 포함된 인수인계 이메일로 다음 온콜이 빠르게 컨텍스트를 파악한다.
  • 예상치 못한 이점(unexpected benefits)
    • 팀 간 가시성이 높아져 다운스트림 영향을 인지하지 못한 인프라 팀에 수동 알림을 보낼 수 있다.

Ch17. 신뢰성을 위한 테스트

TL;DR

  • 테스트는 과거 신뢰성(모니터링)과 미래 신뢰성(테스트 커버리지)을 모두 정량화한다.
  • 단위·통합·시스템 테스트가 기반이며 카나리(canary), 스트레스, 설정 테스트가 프로덕션을 보완한다.
  • 설정 변경도 코드 릴리스만큼 엄격하게 다뤄야 한다.
  • 카오스 엔지니어링(chaos engineering) 같은 비결정적 기법도 가치를 제공한다.

Key Ideas

  • 전통적 테스트 유형(unit, integration, system)
    • 단위 테스트는 함수/클래스 단위, 통합은 의존성 주입을 통한 컴포넌트 결합, 시스템은 엔드 투 엔드 검증이다.
  • 시스템 테스트의 하위 분류
    • 스모크 테스트(smoke), 성능 테스트(performance), 회귀 테스트(regression)로 핵심 동작·성능 저하·기존 버그 재발을 방지한다.
  • 설정 테스트(configuration tests)
    • 프로덕션에 실제 적용된 바이너리 설정을 버전 관리된 설정 파일과 비교 검증한다.
  • 스트레스 테스트(stress tests)
    • 시스템이 파국적으로 무너지기 전의 한계점을 식별한다.
  • 카나리 테스트(canary tests)
    • 일부 서버에 먼저 배포하고 인큐베이션 기간을 둔 뒤 전체 롤아웃하며 문제 시 빠르게 롤백한다.
  • 빌드/테스트 인프라
    • 버전 관리, 즉시 알림이 가는 지속적 빌드, Bazel 같은 의존성 인식 테스트 러너가 필수다.
  • 통계적·재해 테스트(statistical and disaster testing)
    • 퍼징(fuzzing)과 카오스 엔지니어링(chaos engineering)은 비결정적이지만 의외의 결함을 드러낸다.
  • 프로덕션 프로브와 빠른 피드백
    • 모니터링 프로브로 라이브 환경에서 시나리오를 재생하고, 짧은 피드백 사이클로 신뢰성을 높인다.

Ch18. SRE의 소프트웨어 엔지니어링

TL;DR

  • SRE는 프로덕션 지식을 바탕으로 내부 도구를 가장 잘 만들 수 있는 위치에 있다.
  • Auxon은 의도 기반 용량 계획(intent-based capacity planning)을 자동화한 사례다.
  • "왜" 자원이 필요한가를 명세하면 시스템이 최적 배분을 자동 생성한다.
  • 단순 프로토타입에서 시작해 반복(launch and iterate)하는 전략이 성공의 열쇠다.

Key Ideas

  • SRE 소프트웨어 엔지니어링의 가치
    • 팀 규모가 서비스 확장에 비례해 늘어나선 안 된다는 SRE 원칙상 자동화는 필수이며, 개인의 커리어 성장에도 도움이 된다.
  • Auxon 사례 연구
    • 수작업 스프레드시트 기반의 용량 계획을 기계 가독 제약식으로 변환해 최적화 알고리즘으로 해결, 수백만 달러의 머신 자원을 관리한다.
  • 의도 기반 용량 계획(intent-based capacity planning)
    • 어떤 자원이 아니라 신뢰성·이중화·지연 같은 "의도"를 명세하고 시스템이 매개변수 변화에 따라 새 계획을 자동 생성한다.
  • 근사와 반복(approximation and iteration)
    • "Stupid Solver"라는 단순 프로토타입으로 비전을 검증하고 선형 계획법(linear programming)을 학습하며 점진적으로 발전시켰다.
  • 채택 전략(adoption strategy)
    • 일관된 메시징, 기존 솔루션이 없는 얼리 어댑터 발굴, 화이트 글러브 지원, 도구 표준화를 강요하지 않는 비종속(agnostic) 설계.
  • 팀 구성(team composition)
    • 제너럴리스트와 도메인 전문가를 결합하고 프로덕션 연결을 유지하며 후기에 수학적 최적화 전문가를 합류시켰다.
  • SRE 엔지니어링 문화 조성
    • 명확한 메시징, 역량 평가, 신뢰할 만한 첫 출시(credible launches), 코드 리뷰·테스트·프로덕션 준비 검토 같은 표준 유지가 필요하다.
  • 교훈(lessons learned)
    • 도메인 전문가가 주도하고, 고신호 사용자 피드백을 받으며, 토일(toil)을 줄이고 조직 목표와 정렬되는 프로젝트가 성공한다. 구글 클라우드 로드 밸런서가 사내 SRE 개발에서 출발한 사례다.

Ch19. 프런트엔드의 로드 밸런싱

TL;DR

  • 프런트엔드 트래픽 분산은 단순한 라운드 로빈을 넘어 지리적 근접성, 용량, 지연시간을 종합 고려해야 한다.
  • DNS와 가상 IP(VIP)를 결합한 다층 구조로 글로벌 트래픽을 효율적으로 라우팅한다.
  • 애니캐스트(anycast)는 단일 IP로 가장 가까운 데이터센터로 사용자를 자연스럽게 유도하는 강력한 기법이다.

Key Ideas

  • DNS 로드 밸런싱(DNS load balancing)
    • 가장 단순한 방식이지만 클라이언트가 결과를 캐싱하고 재귀 리졸버(recursive resolver)가 중간에 끼어 있어 정확한 트래픽 제어가 어렵다.
    • EDNS0 확장으로 클라이언트 서브넷 정보를 전달해 더 나은 위치 기반 응답을 제공할 수 있다.
  • 가상 IP 주소(Virtual IP, VIP)
    • 다수의 백엔드가 하나의 IP를 공유하여 장애 격리와 무중단 배포를 가능하게 한다.
    • 네트워크 로드 밸런서가 패킷을 백엔드로 전달하며 일관된 해싱(consistent hashing)으로 연결의 어피니티를 유지한다.
  • 애니캐스트(anycast) 라우팅
    • 동일한 IP를 여러 위치에서 BGP로 광고하여 사용자가 네트워크적으로 가장 가까운 사이트로 자연스럽게 연결되도록 한다.
    • 라우팅 변경 시 TCP 연결이 깨질 수 있는 위험이 있어 안정 관리가 필요하다.
  • 패킷 캡슐화(packet encapsulation)
    • GRE 같은 터널링으로 VIP 트래픽을 백엔드까지 전달하면서 원본 클라이언트 IP를 보존한다.
  • 계층화된 부하 분산
    • 프런트엔드 단계에서는 사용자와의 근접성과 가용 용량을 우선시하고, 세밀한 분배는 데이터센터 내부 단계에 위임한다.

부하 분산 계층도

flowchart TB
    U[사용자] --> DNS[DNS / GSLB<br/>지리 근접 + 용량 기반]
    DNS --> VIP[Anycast VIP<br/>BGP로 가장 가까운 사이트]
    VIP --> NLB[Network LB<br/>일관된 해싱 · GRE 캡슐화]
    NLB --> GFE[GFE 리버스 프록시]
    GFE --> Sub[Subsetting<br/>결정적 부분집합]
    Sub --> BE[백엔드 서버]
    Sub -.가중 RR.-> BE
계층 관심사 신호
프런트엔드 (DNS/Anycast) 지리적 근접성, 사이트 용량 지연, 리전별 QPS
네트워크 LB 연결 어피니티, 장애 격리 연결 수, 백엔드 상태
L7 (GFE → 백엔드) 세밀한 분배 활성 요청 수, 활용률, 큐 길이

Ch20. 데이터센터의 로드 밸런싱

TL;DR

  • 데이터센터 내부에서는 백엔드 상태와 부하를 인식하는 정교한 알고리즘이 필요하다.
  • 단순 라운드 로빈은 부하 편차를 크게 만들며, 최소 부하 라운드 로빈(least-loaded round robin)이 더 균형 잡힌다.
  • 활성 요청 가중 라운드 로빈(weighted round robin)이 Google 환경에서 가장 효과적인 접근으로 평가된다.

Key Ideas

  • 흐름 제어를 위한 백엔드 상태 모델
    • 각 백엔드는 healthy, refusing connections, lame duck 세 가지 상태를 가질 수 있으며 lame duck은 새 요청을 거부하면서 진행 중 요청은 마무리하게 한다.
  • 서브셋팅(subsetting)
    • 클라이언트가 모든 백엔드와 연결을 유지하면 자원이 과다하게 소모되므로, 일부 백엔드 서브셋과만 연결을 유지한다.
    • 결정적 서브셋팅(deterministic subset selection) 알고리즘이 로드 분산과 안정성을 동시에 충족한다.
  • 라운드 로빈(round robin)의 한계
    • 요청 비용이 균일하지 않고 머신 성능이 다양하므로 부하 편차가 매우 커진다.
  • 최소 부하 라운드 로빈(least-loaded round robin)
    • 클라이언트가 각 백엔드의 활성 요청 수를 추적해 가장 적은 곳으로 보낸다.
    • 죽은 백엔드가 활성 요청 0으로 보여 트래픽 폭주를 받는 함정이 있다.
  • 가중 라운드 로빈(weighted round robin)
    • 백엔드가 자신의 활용률, 큐 길이, 오류율 같은 신호를 클라이언트에 알리고, 클라이언트가 가중치를 동적으로 조정한다.
    • Google 내부 측정에서 부하 편차를 크게 줄이는 가장 효과적인 방식으로 검증되었다.

Ch21. 과부하 대응

TL;DR

  • 단순 QPS 기반 제한은 요청 비용 차이로 부정확하므로 자원 사용량(CPU 등) 기반 제한이 더 우수하다.
  • 과부하 시 점진적 감쇠(graceful degradation)와 클라이언트측 스로틀링이 핵심 도구다.
  • 요청에 중요도(criticality) 라벨을 붙여 우선순위 기반 거부와 재시도 정책을 일관되게 적용한다.

Key Ideas

  • 사용자당 할당량(per-customer quota)
    • QPS는 워크로드에 따라 의미가 달라 신뢰할 수 없으며, CPU 같은 자원 사용량으로 환산한 제한이 더 안정적이다.
  • 클라이언트측 스로틀링(client-side throttling)
    • 적응형 스로틀링(adaptive throttling)으로 클라이언트가 거부될 가능성이 높은 요청을 아예 보내지 않아 서버 부하를 막는다.
  • 요청 중요도(criticality)
    • CRITICAL_PLUS, CRITICAL, SHEDDABLE_PLUS, SHEDDABLE 네 단계로 분류해 과부하 시 낮은 등급부터 거부한다.
    • 중요도는 RPC 호출 트리를 따라 전파되어 일관된 정책 적용을 보장한다.
  • 활용률 신호(utilization signal)
    • CPU 사용률 기반 실행기 부하(executor load average) 같은 신호로 서버가 자신의 부하 상태를 자체 평가해 트래픽을 거절한다.
  • 재시도 처리
    • 요청당 재시도 예산과 서버측 "오버로드, 재시도 금지" 응답으로 재시도 폭증(retry amplification)을 방지한다.
  • 연결 부하 관리
    • 다수의 작은 클라이언트가 만드는 연결 자체가 부하가 되므로 배칭 프록시(batching proxy) 같은 중간 계층을 둔다.

요청 중요도 (Criticality) 4단계

등급 의미 예시 워크로드 과부하 시
CRITICAL_PLUS 절대 거부 금지 로그인, 결제 마지막까지 처리
CRITICAL 평시 우선 처리 핵심 사용자 요청 예산 내 우선 보장
SHEDDABLE_PLUS 일부 실패 허용 비핵심 조회 부하 시 선제 거부
SHEDDABLE 재시도로 커버 가능 백그라운드 배치, 분석 제일 먼저 버림

중요도는 RPC 호출 트리를 따라 전파되어 하위 호출이 상위 중요도를 초과하지 않도록 한다.

Ch22. 연쇄 장애 대응

TL;DR

  • 연쇄 장애(cascading failure)는 한 컴포넌트의 장애가 부하 재분배를 통해 시스템 전체로 확산되는 현상이다.
  • 자원 고갈, 정책 미흡, 재시도 폭증이 주요 원인이며, 부하 테스트로 한계를 미리 파악해야 한다.
  • 복구는 트래픽 차단, 재시작, 점진적 트래픽 복원의 단계로 진행한다.

Key Ideas

  • 서버 과부하의 연쇄 효과
    • 한 서버의 장애로 부하가 남은 서버로 옮겨가며 도미노처럼 무너진다.
  • 자원 고갈(resource exhaustion)
    • CPU, 메모리, 스레드, 파일 디스크립터, 의존 서비스 등 어떤 자원이라도 고갈되면 장애로 이어진다.
    • 메모리 부족은 GC 폭주(GC death spiral)나 캐시 적중률 하락 같은 2차 효과를 유발한다.
  • 큐 관리(queue management)
    • 큐가 길수록 지연이 누적되어 사용자가 이미 포기한 요청을 처리하게 된다.
    • LIFO나 ADD(Active Queue Management) 기법으로 오래된 요청을 우선 폐기한다.
  • 부하 차단과 점진적 감쇠(graceful degradation)
    • 과부하 시 품질을 낮춘 응답이라도 제공해 완전한 실패를 피한다.
  • 재시도(retry) 폭증 방지
    • 지수 백오프(exponential backoff), 지터(jitter), 재시도 예산을 적용하고 호출 스택을 따라 재시도가 곱해지지 않도록 한다.
  • 시작 시점의 콜드 캐시(cold cache)
    • 재시작 직후 캐시 미스 폭증으로 의존 시스템이 무너질 수 있어 점진적 트래픽 증가가 필요하다.
  • 부하 테스트(load testing)
    • 서비스가 어느 지점에서 무너지고 어떻게 무너지는지 미리 측정해 두어야 한다.

Ch23. 치명적 상태 관리: 신뢰성을 위한 분산 합의

TL;DR

  • 분산 시스템에서 일관된 상태 결정은 분산 합의(distributed consensus) 알고리즘으로 해결한다.
  • Paxos, Raft, Zab 같은 알고리즘은 비동기 네트워크와 장애 환경에서도 안전성을 보장한다.
  • 합의는 리더 선출, 잠금, 큐, 설정 관리 등 광범위한 분산 시스템 문제의 기반이다.

Key Ideas

  • CAP 정리와 합의의 필요성
    • 네트워크 분할 시 일관성과 가용성을 동시에 만족할 수 없으므로 강한 일관성이 필요한 곳에는 합의가 필수이다.
  • Paxos
    • 두 단계 프로토콜(prepare/promise, accept/accepted)로 다수결을 통해 단일 값에 합의한다.
    • 다중 결정(Multi-Paxos)에서는 안정 리더가 첫 단계를 생략해 성능을 높인다.
  • Raft, Zab, Mencius 등 변형
    • Raft는 가독성과 구현 용이성에 초점을 둔 알고리즘이며, Zab은 ZooKeeper, Mencius는 다중 리더 변형이다.
  • 합의 기반 패턴
    • 신뢰성 있는 복제 상태 머신(replicated state machine), 신뢰성 있는 리더 선출, 분산 잠금, 안정적 메시지 큐 등을 구현하는 기반이 된다.
  • 성능 고려사항
    • 합의는 다수결 왕복(round trip)이 필요해 지연이 크므로 배칭, 파이프라이닝, 디스크 쓰기 최적화로 성능을 끌어올린다.
    • 정족수 리스(quorum lease)와 지역 인지 정족수 배치로 지연을 줄인다.
  • 운영 모니터링
    • 합의 그룹 멤버십, 리더 안정성, 복제 지연, 디스크 동기화 시간 등을 핵심 지표로 추적한다.
  • 합의 시스템 사용자(client) 패턴
    • 직접 구현보다는 ZooKeeper, etcd, Chubby 같은 검증된 서비스를 활용하는 것이 권장된다.

Paxos 기본 흐름

sequenceDiagram
    participant P as Proposer (Leader)
    participant A1 as Acceptor 1
    participant A2 as Acceptor 2
    participant A3 as Acceptor 3

    Note over P,A3: Phase 1 — Prepare
    P->>A1: Prepare(n)
    P->>A2: Prepare(n)
    P->>A3: Prepare(n)
    A1-->>P: Promise(n)
    A2-->>P: Promise(n)
    Note right of A3: 네트워크 지연 허용 — 과반만 응답하면 진행

    Note over P,A3: Phase 2 — Accept
    P->>A1: Accept(n, v)
    P->>A2: Accept(n, v)
    A1-->>P: Accepted
    A2-->>P: Accepted
    Note over P: 과반 수락 → 값 v 확정

Ch24. Cron을 통한 분산 주기 스케줄링

TL;DR

  • 단일 머신 cron의 한계를 넘어 다수 머신에서 신뢰성 있게 주기 작업을 실행하는 분산 cron이 필요하다.
  • "정확히 한 번(exactly once)"과 "최소 한 번(at least once)" 사이의 트레이드오프를 명확히 인지해야 한다.
  • Paxos를 사용한 리더 기반 구조와 외부 작업 시스템과의 통합으로 신뢰성을 확보한다.

Key Ideas

  • cron의 신뢰성 요구
    • 결제, 백업, 보고서 생성 같은 작업은 누락이나 중복 모두 비용이 크므로 명확한 시맨틱이 필요하다.
  • 멱등성(idempotency)
    • 작업 자체가 멱등하면 중복 실행 위험이 줄어들지만, 모든 작업이 멱등하게 만들 수는 없다.
  • 리더-팔로워 구조
    • Paxos로 리더를 선출하고 리더만 실제 cron 트리거를 발사하며, 팔로워는 상태를 동기화한다.
  • 상태 저장(state preservation)
    • 어느 작업을 시작했는지, 완료했는지를 합의 로그에 기록해 리더 교체 시에도 일관성을 유지한다.
  • 외부 작업 실행 시스템과의 결합
    • Borg 같은 클러스터 매니저에 작업 시작을 위임하며, 시작 RPC가 응답하지 않은 모호한 상태를 처리하는 로직이 필요하다.
  • 대규모 트리거 분산
    • 동일 시각에 다수의 작업이 동시에 발사되어 인프라에 부하를 주지 않도록 일정에 지터(jitter)를 추가한다.
  • 운영 관측성
    • 누락된 실행, 지연된 실행, 중복 실행을 명시적으로 모니터링한다.

Ch25. 데이터 처리 파이프라인

TL;DR

  • 단순한 주기 실행 파이프라인은 데이터 양 변화나 청크 편향(thundering herd, stragglers)에 취약하다.
  • MapReduce 같은 일괄 처리부터 스트리밍까지 다양한 모델이 있으며 각각의 한계를 이해해야 한다.
  • Workflow 시스템은 작업 간 의존성과 상태를 관리해 복잡한 파이프라인을 신뢰성 있게 운영한다.

Key Ideas

  • 단순 주기 파이프라인의 문제
    • 데이터 양 증가나 워커 실패 시 늦은 워커(straggler)가 전체 작업을 지연시킨다.
  • 부하 불균형(load imbalance)
    • 데이터 분포가 균일하지 않으면 일부 샤드가 과도하게 커져 전체 작업 시간을 결정한다(헝거리 작업, hanging chunk).
  • MapReduce와 GFS
    • Google의 일괄 처리 모델로, 입력을 매핑하고 셔플 후 리듀스하는 구조이며 GFS 같은 분산 파일시스템 위에서 동작한다.
  • 주기적 파이프라인의 운영 부담
    • 주기 사이의 데이터 누적과 모니터링 사각지대로 인해 SRE 운영 비용이 크다.
  • 워크플로 시스템(workflow system)
    • 마스터-워커 구조로 작업 단위(task)와 의존성(DAG)을 관리하며, 단계별 실패 복구와 부분 재실행을 지원한다.
    • 마스터 자체의 신뢰성을 위해 합의 기반 복제와 영속 저장이 필요하다.
  • 비즈니스 연속성 패턴
    • 작업 단위의 멱등성, 체크포인트, 정확히 한 번 시맨틱을 위해 트랜잭션 로그와 두 단계 커밋(two-phase commit)을 활용한다.
  • 점진적 처리(incremental processing)
    • 매번 전체 재처리 대신 변경분만 처리하는 방식으로 효율과 응답성을 높인다.

Ch26. 데이터 무결성: 읽는 것이 곧 쓴 것

TL;DR

  • 데이터 무결성은 사용자 관점에서 정의되어야 하며, "사용자가 접근 가능한가"가 진정한 가용성이다.
  • 백업이 아닌 복원 가능성이 본질이며, 정기적인 복원 훈련이 필수이다.
  • 소프트 삭제, 다층 백업, 복제, 검증으로 24가지 데이터 손실 시나리오에 대비한다.

Key Ideas

  • 데이터 무결성과 가용성의 정의
    • 데이터가 손상되지 않고 사용자가 적시에 접근할 수 있어야 진정한 가용성이다.
  • 데이터 손실의 근본 원인
    • 사용자 오류, 애플리케이션 버그, 인프라 결함, 하드웨어 고장, 사이트 장애 등 다양한 원인을 모두 고려해야 한다.
  • 다층 방어(defense in depth)의 세 계층
    • 1계층: 소프트 삭제(soft delete)와 휴지통으로 사용자/개발자 실수 복구.
    • 2계층: 백업과 복원 시스템으로 애플리케이션/저장소 결함 대응.
    • 3계층: 복제(replication)로 사이트 장애에 대비.
  • 백업이 아닌 복원(restore) 중심 사고
    • 복원해보지 않은 백업은 백업이 아니며, 정기 복원 훈련으로 검증해야 한다.
  • 보존 기간과 비용의 균형
    • 데이터 양과 보존 기간의 곱이 비용을 결정하므로 계층화된 저장소(테이프, 콜드, 핫)를 활용한다.
  • 조기 탐지(early detection)
    • 비대역 데이터 검증기(data validator)와 체크섬으로 손상을 빠르게 발견한다.
  • 사례 학습
    • Gmail과 Google Music의 실제 데이터 복구 사례에서 다층 백업과 외부 미디어(테이프)의 가치를 입증.
  • 24가지 조합
    • 데이터 손실(loss), 손상(corruption), 가용성(unavailability) 세 종류 × 다양한 원인의 조합 모두에 대비책을 마련한다.

다층 방어 (Defense in Depth)

flowchart TB
    subgraph L1[1계층 — 소프트 삭제]
        Trash[휴지통 · undelete API<br/>대응: 사용자/개발자 실수]
    end
    subgraph L2[2계층 — 백업 / 복원]
        BK[오프라인 백업 · 체크섬<br/>대응: 앱 버그, 저장소 결함]
    end
    subgraph L3[3계층 — 복제 / 지역 분산]
        Repl[다중 리전 복제<br/>대응: 사이트 장애, 재해]
    end
    L1 --> L2 --> L3
    Probe[데이터 검증기 · 정기 복원 훈련] -.지속 검증.-> L1
    Probe -.지속 검증.-> L2
    Probe -.지속 검증.-> L3

Ch27. 대규모 제품 출시의 신뢰성

TL;DR

  • Google의 Launch Coordination Engineering(LCE) 팀은 출시 체크리스트와 컨설팅으로 신뢰성 있는 출시를 표준화했다.
  • 출시 체크리스트는 아키텍처, 용량 계획, 장애 모드, 외부 의존성 등 광범위한 영역을 다룬다.
  • 단계적 롤아웃, 기능 플래그, 다크 런치(dark launch)로 출시 위험을 점진적으로 검증한다.

Key Ideas

  • Launch Coordination Engineering(LCE)
    • 출시 조율 엔지니어가 제품 팀과 함께 출시 준비도를 점검하고 SRE의 운영 경험을 사전에 주입한다.
  • 출시 체크리스트(launch checklist)
    • 아키텍처 리뷰, 용량 계획, 모니터링/경보, 비상 대응, 외부 의존성, 보안, 사용자 약관 등 누적된 사고 학습이 응축되어 있다.
  • 신뢰성 있는 출시 기법
    • 점진적이고 단계적인 롤아웃(staged rollout), 기능 플래그(feature flag), 다크 런치(dark launch)로 트래픽이나 사용자 비중을 점차 늘린다.
  • 다크 런치(dark launch)
    • 사용자에게는 보이지 않게 신규 시스템에 실제 트래픽을 미러링해 부하와 동작을 사전 검증한다.
  • 출시 자동화와 셀프 서비스
    • 체크리스트와 도구를 자동화해 LCE 인력 병목을 줄이고 팀 자율성을 높인다.
  • 비상 대응 준비
    • 출시 직전과 직후 비상 대기 인력, 롤백 절차, 모니터링 강화를 준비한다.
  • 학습 사례
    • Gmail 같은 대규모 출시에서 다크 런치와 점진적 트래픽 이전이 결정적 성공 요인이었다.
  • 출시 후 회고(postlaunch review)
    • 출시가 끝나도 데이터 기반 회고로 체크리스트와 프로세스를 지속 개선한다.

Part IV. 관리 (Management)

Ch28. SRE의 온콜 대응 및 그 이상의 역할로 가속화하기

TL;DR

  • 신규 SRE를 무작위 티켓이나 "시련에 의한 학습(trial by fire)"으로 던지지 말고, 기초부터 응용까지 누적적으로 설계된 학습 경로(learning path)를 통해 훈련해야 한다.
  • 절차 암기보다 역공학(reverse engineering), 통계적 사고(statistical thinking), 가설 기반 트러블슈팅 같은 근본 역량을 먼저 길러야 장애 시 표준 절차가 무너져도 대응할 수 있다.
  • 포스트모템 독서 모임(postmortem reading club), 재난 롤플레잉(Wheel of Misfortune), 섀도 온콜(shadow on-call) 같은 활동으로 실전 진입 전 안전한 환경에서 경험을 쌓게 한다.
  • 온콜 합류 이후에도 아키텍처 변경 발표, 개발팀과의 협업, 문서 갱신을 통해 학습이 지속되어야 한다.

Key Ideas

  • 구조화된 학습 경로(Structured Learning Path)
    • 무작위 티켓 분배(menial task dumping)나 절차 위주 훈련을 지양하고, 기초 → 응용 순으로 누적적인 커리큘럼을 설계한다.
    • 섣불리 1차 온콜(primary on-call)에 투입하지 않는다.
  • 역공학(Reverse Engineering)
    • 진단 도구, RPC 추적(RPC tracing), 로그, 모니터링을 활용해 낯선 시스템을 이해하는 능력을 키운다.
    • 표준 플레이북(playbook)이 통하지 않는 상황에서 결정적인 역량이다.
  • 통계적/가설 기반 사고(Statistical Thinking)
    • 의사결정 트리(decision tree)를 효율적으로 좁혀가며 장애 원인을 좁히는 훈련을 한다.
  • 포스트모템 독서 모임(Postmortem Reading Club)
    • 교육적 가치가 높은 포스트모템을 큐레이션해 함께 읽고 토론하며 프로덕션 장애의 심상지도(mental map)를 구축한다.
  • 재난 롤플레잉(Disaster Role-Playing, "Wheel of Misfortune")
    • 정기적인 탁상 훈련(tabletop exercise)으로 현실적 시나리오를 시뮬레이션한다.
  • 학습 체크리스트(Learning Checklist)
    • 핵심 지식, 전문가 연락처, 필수 읽을거리, 이해도 확인 질문을 담은 구조화된 문서를 제공한다.
  • 섀도 온콜(Shadow On-Call)
    • 신입을 업무 시간 중 숙련된 온콜러와 짝지어 실시간 압박 없이 실전 경험을 쌓게 한다.
  • 추상적 학습에서 응용 학습으로의 진행
    • 포스트모템/역공학(추상) → 프로젝트 작업/섀도 온콜(응용) 순으로 페이스를 조절한다.
    • 문서 갱신(documentation refresh)을 도제식 학습(apprenticeship) 도구로 활용한다.

Ch29. 방해 요소 대응

TL;DR

  • 운영 부하는 페이지(pages), 티켓(tickets), 지속적인 책임(ongoing responsibilities) 세 가지로 구분되며, 각각 다른 SLO와 처리 방식을 가진다.
  • 인간의 인지적 한계상 컨텍스트 스위칭(context switching) 비용이 크므로, 같은 사람이 동시에 프로젝트와 인터럽트(interrupt)를 처리하게 하면 안 된다.
  • 시간을 양극화(polarizing time)해 엔지니어가 한 번에 프로젝트 작업 또는 인터럽트 대응 중 하나만 하도록 구조화한다.
  • 인터럽트가 처리 용량을 초과하면 부하를 흩뿌리지 말고 전담 인력을 늘리거나 근본 원인을 제거한다.

Key Ideas

  • 운영 부하의 3분류
    • 페이지(Pages): 분 단위 SLO를 가진 즉시 대응 알림.
    • 티켓(Tickets): 시간~주 단위 응답 시간을 가진 고객 요청.
    • 지속적인 책임(Ongoing Responsibilities): 코드 롤아웃, 임시 질문 등 시간에 민감한 일.
  • 인지적 몰입(Cognitive Flow State)
    • 단순 반복 작업과 고난도 문제 해결 모두에서 도달 가능하지만, 인터럽트로 쉽게 깨진다.
    • "창의적이고 몰입된 흐름(Creative and engaged)" vs. "앵그리버드 식 흐름(Angry Birds)"을 구분.
  • 시간 양극화(Polarizing Time)
    • 핵심 원칙: 같은 사람에게 온콜과 프로젝트 진척을 동시에 기대하지 말 것.
    • 온콜 주간은 프로젝트 진도에서 제외(write off)한다.
  • 온콜 구조(On-Call Structure)
    • 1차 온콜(Primary)은 페이지에만 집중.
    • 2차 온콜(Secondary) 역할은 실제 책임 범위에 따라 정의.
  • 티켓 관리(Ticket Management)
    • 무작위 분배 금지, 전담자 또는 로테이션(rotation)에 할당.
    • 정기적인 티켓 스크럽(ticket scrub)으로 근본 원인을 분석하고, 핸드오프(handoff) 절차를 정한다.
  • 인터럽트 부하 줄이기(Reducing Interrupt Load)
    • 부하가 용량을 넘으면 인원을 추가하고 분산하지 않는다.
    • 소스에서 인터럽트를 침묵화(silence)하고, 정책으로 적절한 노력을 고객 측에 떠넘긴다.
  • 명명된 패턴
    • 인터럽터빌리티(Interruptability): 지속적 인터럽트 상태로 매우 스트레스가 크다.
    • 푸시 매니저(Push Manager): 릴리스 책임을 공식화한 역할.
    • 건틀릿 달리기(Running the Gauntlet): 비생산적인 로테이션 안티패턴.
  • 핵심 통찰
    • "인터럽트를 처리할 때 프로젝트는 방해 요소이고, 그 반대도 마찬가지다." 두 작업은 구조적으로 분리되어야 한다.

Ch30. 운영 과부하에서 회복하기 위한 SRE 파견

TL;DR

  • 반응적 업무에 매몰된 팀에 단일 SRE를 일시적으로 파견(embedding)해, 티켓 소화가 아닌 관행 개선과 외부 시각 제공으로 균형을 회복시킨다.
  • 파견 SRE는 1단계 학습/관찰, 2단계 컨텍스트 공유(우수 사례 시연), 3단계 변화 주도의 단계로 진행한다.
  • 가장 강력한 지렛대는 SLO 수립이며, 비난 없는 포스트모템 문화(blameless postmortem culture)와 오류 예산(error budget) 개념을 함께 정착시킨다.
  • 떠날 때는 사후 보고서(after-action report)를 남겨 팀이 새로운 상황에도 SRE 원칙을 스스로 적용할 수 있게 한다.

Key Ideas

  • 1단계: 학습과 컨텍스트(Phase 1: Learning & Context)
    • 운영 섀도잉(shadowing operations)으로 실제 규모 부담이 진짜인지 인식의 문제인지 평가.
    • 가장 큰 스트레스 원인을 식별해 우선순위화.
  • 부싯깃 식별(Identifying "Kindling")
    • 지식 격차/과잉 전문화(overspecialization), 미문서화된 핵심 시스템, 미진단 반복 알림, SLO 부재 서비스, 반응적 용량 계획(reactive capacity planning) 등 잠재적 화재 요인.
  • 2단계: 컨텍스트 공유(Phase 2: Sharing Context)
    • 다음 사고를 직접 맡아 모범적인 비난 없는 포스트모템(blameless postmortem)을 작성해 시연.
    • 화재(fires)를 자동화 대상 토일(toil)과 정당한 온콜 오버헤드로 분류.
  • 나쁜 사과 이론(Bad Apple Theory)의 오류
    • "어떤 시스템에서도 실수는 불가피하다"는 점을 강조해 개인 책임 추궁 문화를 교정.
  • 3단계: 변화 주도(Phase 3: Driving Change)
    • SLO 수립을 "단일 가장 중요한 지렛대"로 활용해 반응적 업무에서 건강한 관행으로 이동.
    • 직접 고치지 않고 팀원에게 위임(delegate)한 뒤 솔루션을 리뷰.
    • 오류 예산(error budget)과 롤백 안전성(rollback-safety) 등의 근거를 충실히 설명.
  • 유도 질문(Leading Questions)
    • 답을 주기보다 팀이 스스로 원칙을 사고하도록 질문으로 유도.
  • 종료와 인계(After-Action Report)
    • 핵심 의사결정 기록과 액션 아이템을 담은 사후 보고서를 남기고 팀의 자립적 개선을 보장.

Ch31. SRE 내 커뮤니케이션과 협업

TL;DR

  • 프로덕션 미팅(production meeting)은 서비스 상태 인식을 높이고 운영을 개선하는 SRE의 핵심 의례이며, 의장(chair)을 로테이션해 팀 오너십을 키운다.
  • 다양한 스킬셋의 팀 구성과 강한 서면 커뮤니케이션이 다중 시간대/사이트에 걸친 협업의 성패를 좌우한다.
  • Viceroy 사례는 분산 협업의 어려움(중복 작업, 기여자 이탈, 범위 확장)과 이를 극복하는 모범 사례를 보여준다.
  • 제품 개발팀과의 협업은 코드 커밋 이전 설계 단계(design phase)에 개입할 때 가장 큰 영향을 발휘한다.

Key Ideas

  • 프로덕션 미팅(Production Meeting)
    • 주 1회 30~60분, 의장(chair)을 로테이션, 모든 팀원과 핵심 이해관계자(stakeholders) 참석.
    • 표준 의제: 예정된 프로덕션 변경, 핵심 지표, 주요 장애, 페이징 이벤트(paging events), 비페이징 이벤트(non-paging events), 이전 액션 아이템 추적.
    • Google Docs 같은 협업 도구로 의제를 상향식(bottom-up)으로 사전 채움.
  • 팀 구성과 역할(Team Composition)
    • 테크 리드(TL, Tech Lead), 사이트 신뢰성 매니저(SRM, Site Reliability Manager), 프로젝트 매니저(PM)의 균형.
    • 다양한 스킬셋이 협업 성과를 향상.
  • SRE 내부 협업(Within SRE)
    • 단독 프로젝트(singleton project)는 실패하기 쉽다.
    • 시간대를 넘는 작업에는 탁월한 서면 커뮤니케이션과 정기적인 대면 만남이 필요.
  • Viceroy 사례 연구(Viceroy Case Study)
    • Spanner, Ads Frontend 등 여러 팀이 모니터링 콘솔을 중복 개발 → 2012년 통합, 2014년 JavaScript 기반 Consoles++와 통합.
    • 도전 과제: 원격 커뮤니케이션 부재, 기여자 churn, 기능 인도 후 오너십 희석, 범위 확장(scope creep).
  • 사이트 간 프로젝트 권장 사항(Cross-Site Projects)
    • 단일 사이트가 맡을 수 있는 적정 크기의 컴포넌트로 분할.
    • 명확한 산출물/마감/의사결정 프로세스, 충실한 설계 문서화, 표준화된 코딩 관행, 분쟁의 신속한 해결.
    • 리더와 팀의 대면 정상회의(in-person summit) 우선시, 프로젝트 규모에 맞춰 PM 오버헤드 확장.
  • 제품 개발팀과의 협업(Collaboration with Product Development)
    • 가장 큰 영향력은 설계 단계에서 발휘.
    • DFP→F1 데이터베이스 마이그레이션 사례: 시작부터 주간 동기화, SRE 주도의 인프라 설계, 명확한 인터페이스 정의로 병렬 작업.
  • 상호 존중의 분위기(Mutual Respect)
    • "프로덕션과 제품의 공동 관심사가 상호 존중의 분위기에서 만나는 것"이 측정 가능한 개선을 만든다.

Ch32. 발전하는 SRE 참여 모델

TL;DR

  • 단순 PRR(Simple PRR, Production Readiness Review) 단일 모델에서 시작해, 조기 참여 모델(Early Engagement Model)과 프레임워크/SRE 플랫폼(Frameworks and SRE Platform) 모델로 진화하며 더 이른 개입과 확장성을 확보했다.
  • SRE는 시스템 아키텍처, 계측/모니터링(instrumentation and monitoring), 비상 대응, 용량 계획, 변경 관리, 성능 지표 6개 차원에서 신뢰성을 향상시킬 수 있는 중요한 서비스를 맡는다.
  • 전통적 PRR의 확장 한계(분기 단위 리드타임, 직렬 온보딩, 수정 공유 불가)를 프레임워크 코드화로 해결.
  • 프레임워크는 SRE를 외부 리뷰어가 아니라 신뢰성을 처음부터 내재화하게 해주는 플랫폼 제공자로 변모시켰다.

Key Ideas

  • SRE 참여(SRE Engagement)
    • 신뢰성에 의미 있게 기여할 수 있는 중요 서비스에 대해 6개 차원(아키텍처, 계측/모니터링, 비상 대응, 용량 계획, 변경 관리, 성능 지표(가용성/지연/효율성))에서 책임을 진다.
  • 단순 PRR 모델(Simple PRR Model)
    • 이미 출시된 서비스 대상의 기반 모델.
    • 단계: 참여(Engagement, SLO/SLA 합의) → 분석(Analysis, 도메인 체크리스트) → 개선/리팩터링(Improvements & Refactoring) → 훈련(Training) → 온보딩(Onboarding, 점진적 책임 이양) → 지속 개선(Continuous Improvement).
  • 조기 참여 모델(Early Engagement Model)
    • 설계와 개발 단계부터 SRE가 합류해 새로운 기능/복잡성이 큰 서비스를 대상으로 함.
    • 설계 단계에서 트레이드오프를 조기에 노출, 빌드 단계에서 라이브러리/제어 권고, 출시 단계에서 다크 런치(dark launch) 같은 패턴 적용.
  • 다크 런치(Dark Launch)
    • 사용자에게 응답을 노출하지 않고 트래픽을 새 서비스로 보내 사용자 영향 없이 검증.
  • 출시 조정 엔지니어링(LCE, Launch Coordination Engineering)
    • 출시 전 컨설팅을 제공하는 전담 팀.
  • 프레임워크와 SRE 플랫폼(Frameworks and SRE Platform)
    • 언어별(Java, C++, Go) 표준 구현, 통합 API와 일관된 동작 제공.
    • 계측/메트릭, 요청 로깅, 트래픽/부하 관리 제어를 표준화.
    • 비온보딩 서비스도 SRE 검증 인프라를 사용 가능, 단일 SRE/단일 분기로 빠른 참여.
  • 책임 공유 모델(Shared Responsibility Model)
    • SRE는 플랫폼 인프라를 유지, 개발팀은 애플리케이션 고유 이슈를 담당.
  • 프로덕션 가이드(Production Guide)
    • 서비스 개발/운영 베스트 프랙티스를 담은 내부 문서.
  • 진화의 동인(Lessons Learned)
    • 전통적 PRR은 분기 단위 리드타임, 서비스당 2~3분기의 직렬 온보딩, 수정 사항을 다른 서비스와 공유 불가라는 한계.
    • 마이크로서비스 트렌드가 수요는 늘리고 개별 지원 비용은 키움 → 프레임워크로 베스트 프랙티스를 코드화하고 재사용해 해결.

Part V. 결론 (Conclusions)

Ch33. 타 산업 분야에서 얻은 교훈

TL;DR

  • 구글 SRE의 핵심 원칙(준비성(preparedness), 포스트모템(postmortem), 자동화(automation), 데이터 기반 의사결정)은 항공, 의료, 군, 원자력, 통신, 제조, 금융, 인명 구조 등 타 산업에서도 공통적으로 발견된다.
  • 인명·자산 손실 위험이 큰 산업은 보수적이고 규제 중심의 접근을 택하는 반면, 구글은 소프트웨어 장애의 결과가 비교적 가볍기 때문에 에러 예산(error budget)을 활용해 속도와 신뢰성의 균형을 맞춘다.
  • 보편적 원칙은 같지만, 구현 방식은 실패의 결과·시스템 성숙도·변화 속도에 따라 산업별로 다르다.
  • 구글의 차별점은 검증된 고신뢰 산업의 원칙을 빠르게 변화하는 환경에 적응시켜 "빠르면서도 안정적인" 운영을 가능하게 했다는 점이다.

Key Ideas

  • Preparedness and Disaster Testing (준비성과 재해 테스트)
    • 항공의 시뮬레이터 훈련, 원자력 해군의 주간 실제 장비 파손 훈련(live drill), 인명 구조원의 모의 익수 훈련처럼 현실적 훈련을 강조.
    • 통신사의 이동식 교환 센터(swing capacity) 등 여유 용량 확보, 원자로의 다중 보호 계층(defense in depth).
    • 사소한 점검 누락이 시스템 전체 장애로 연쇄(cascade)될 수 있다는 디테일 중시.
  • Postmortem Culture (포스트모템 문화)
    • FAA, FDA, FCC, OSHA 등 규제기관이 체계적 사고 조사를 의무화.
    • 제조업은 아차사고(near-miss)를 "발생을 기다리는 재해"로 간주하고 분석.
    • 인명 구조 분야는 "구조원의 발이 물에 들어가면 무조건 보고서 작성"처럼 비난 없는(blameless) 문화로 정착.
  • Automation and Reduced Operational Overhead (자동화와 운영 부담 절감)
    • 원자력 해군은 인적 검증을 동반한 수동 절차 선호, 금융권은 2012년 Knight Capital의 4억 4천만 달러 손실 이후 자동화에 신중.
    • 제조업은 비용·일관성을 위해 자동화 적극 도입, 항공은 페일오버는 자동화하되 제어 시스템은 사람 검증.
    • 라식(LASIK) 수술의 홍채 매칭 자동화처럼 특정 오류 클래스를 통째로 제거하는 자동화도 효과적.
    • 영국 원자력 산업의 "30분 안에 대응해야 하면 자동화" 같은 시간 기반 규칙 존재.
  • Structured and Rational Decision Making (구조적·합리적 의사결정)
    • 통신·원자력은 검증된 노후 기술에 기반해 "고장나지 않으면 건드리지 마라(if it ain't broke, don't fix it)" 원칙 선호.
    • 변화가 느린 산업은 체크리스트와 "바인더(the binder)"에 의존한 처방적(prescriptive) 절차 사용.
    • 제조·연구는 가설 검정과 통계적 검증 등 데이터 중심 문화.
    • 자기자본 트레이딩(proprietary trading)은 트레이더와 통제팀(enforcement)을 분리해 위험 감수 한도를 즉시 차단할 수 있는 권한 부여.

Ch34. 결론

TL;DR

  • SRE는 운영(operations)과 엔지니어링(engineering)의 이중 역할을 통해 조종사이자 설계자로서 인프라를 다룬다.
  • 책에서 제시한 SRE의 핵심 책무들은 10여 년의 성장에도 불구하고 여전히 유효하며, 미래에도 적용 가능한 원칙으로 남는다.
  • SRE의 확장은 인력 증원이 아닌 잘 설계된 인터페이스와 중복 시스템(redundant systems)을 통한 추상화(abstraction)로 이루어진다.
  • 신뢰성, 유연성, 비상 대응, 모니터링, 용량 계획은 시스템 규모와 기술 변화를 초월한 SRE의 항구적 관심사다.

Key Ideas

  • Dual Role of SRE (이중 역할)
    • 온콜(on-call), 트러블슈팅 등 운영 업무와 도구 개발 등 엔지니어링 업무를 병행.
    • 인프라의 "조종사"이자 "설계자"라는 정체성.
  • Scaling Through Abstraction (추상화를 통한 확장)
    • 사람을 더 늘리는 대신 잘 설계된 인터페이스와 중복 시스템으로 확장.
    • 현대 항공기가 복잡도 증가에도 두 명의 조종사로 운영되는 것과 유사.
  • Maturation Over Time (시간에 따른 성숙)
    • 20대 머신용 대시보드에서 수만 대 자동화로 활동 범위는 확장되었지만 핵심 원칙은 동일.
  • Comprehension Through Operation (운영을 통한 이해)
    • 추상화된 시각과 동시에 일상 운영을 통해 얻은 깊은 실무 지식이 결합되어야 효과적인 비상 대응과 의사결정이 가능.
  • Enduring Concerns (항구적 관심사)
    • 신뢰성(reliability), 유연성(flexibility), 비상 관리(emergency management), 모니터링(monitoring), 용량 계획(capacity planning)은 기술 변화에 무관하게 유지.

부록 (Appendices)

Appendix A. 가용성 표 (Availability Table)

  • 가용성(availability) 백분율 — 즉 9의 개수(number of nines) — 와 허용 가능한 다운타임(downtime)을 시간 단위별로 매핑한 참조 표.
  • 계획된 다운타임이 0이라고 가정하며, 9가 늘수록 허용 다운타임이 급격히 짧아짐.
  • 다중 복제본(replica)이나 변동 부하가 있는 서비스에서는 단순 다운타임보다 실패한 요청 비율 같은 집계 가용성 지표(aggregate unavailability) 사용을 권장.
가용성 (nines) 연간 다운타임 분기
90% (1-nine) 36.5 일 9 일 72 시간 16.8 시간
99% (2-nines) 3.65 일 21.6 시간 7.2 시간 1.68 시간
99.9% (3-nines) 8.76 시간 2.16 시간 43.2 분 10.1 분
99.99% (4-nines) 52.56 분 12.96 분 4.32 분 1.01 분
99.999% (5-nines) 5.26 분 1.30 분 25.9 초 6.05 초
99.9999% (6-nines) 31.5 초 7.78 초 2.59 초 0.605 초

Appendix B. 프로덕션 서비스 모범 사례 모음 (Best Practices for Production Services)

  • 장애 처리(failures): 잘못된 입력은 검증하고 이전 설정을 유지하면서 운영을 지속, 알림은 별도로 발송.
  • 모니터링(monitoring): 페이지(page), 티켓(ticket), 로그(log)로 알림을 긴급도에 따라 분류 — 메일로 모든 알림을 보내는 방식은 지양.
  • 변경 관리(change management): 단계적 롤아웃과 지역별 배포로 회귀 위험을 낮추고 즉시 롤백할 수 있도록 감독.
  • 용량 계획(capacity planning): 가장 큰 두 시스템이 죽어도 피크 트래픽을 처리할 수 있는 N+2 구성, 부하 테스트로 예측 검증.
  • 과부하 대응: 과부하 시 우아한 성능 저하(graceful degradation)와 지터(jitter)를 동반한 지수 백오프(exponential backoff)로 연쇄 장애 방지.
  • 팀 효율성: 운영 업무를 50% 이하로 제한, 지리적으로 분산된 최소 8인 온콜 로테이션, 비난 없는 포스트모템(blameless postmortem) 정기 실시.

Appendix C. 장애 상태 문서 예시 (Example Incident State Document)

  • 장애 진행 중 모든 대응자가 공유하는 실시간(live) 단일 진실 공급원(single source of truth) 템플릿.
  • 포함 항목: 제목·날짜·장애 번호, 요약(summary), 현재 상태(status), 지휘소(command post) 위치.
  • 지휘 구조: 현재 사고 책임자(Incident Commander), 운영(Operations)·계획(Planning)·커뮤니케이션(Communications) 리드, 후임자, 업데이트 주기.
  • 종료 조건(exit criteria), 액션 아이템과 버그 트래커 링크, 역시간순(reverse chronological) 타임라인을 통해 중복 작업 방지와 의사결정 컨텍스트 제공.

Appendix D. 포스트모템 예시 (Example Postmortem)

  • 가상 사례 "Shakespeare Search 장애"(2015-10-21)를 통한 표준 포스트모템 양식 제시.
  • 신규 발견된 셰익스피어 소네트가 기존 인덱스에 없는 단어를 포함, 트래픽이 88배로 폭증하면서 잠재 자원 누수(resource leak) 버그가 활성화되어 66분간 연쇄 장애(cascading failure) 발생.
  • 트래픽 리다이렉트와 10배 용량 증설로 완화 후 누락 단어를 포함한 신규 인덱스 배포로 해결.
  • 섹션: 요약(Summary), 영향(Impact, 12.1억 쿼리 손실), 근본 원인(Root Causes), 트리거(Trigger), 해결(Resolution), 탐지(Detection), 액션 아이템(Action Items), 교훈(Lessons Learned), 타임라인(Timeline), 참고 자료(Supporting Information).

Appendix E. 출시 조정 체크리스트 (Launch Coordination Checklist)

  • 2005년경 구글에서 사용한 신규 서비스 프로덕션 출시 준비 종합 체크리스트.
  • 카테고리: 아키텍처(architecture), 머신·데이터센터(N+2 redundancy, network QoS, DNS), 트래픽·용량 추정과 부하 테스트, 시스템 신뢰성과 페일오버(머신/랙/클러스터 단위 장애 대응).
  • 모니터링·관리(내부 상태, 종단(end-to-end) 동작, 알림), 보안(설계 리뷰·코드 감사·접근 제어), 자동화·수동 작업(반복 가능한 빌드, 라이브 트래픽 카나리(canary), 단계적 롤아웃).
  • 성장 이슈(캐싱, 샤딩(sharding)), 외부 의존성 보호, 일정과 롤아웃 계획 — 사후 대응이 아닌 사전 예방을 강조.

Appendix F. 프로덕션 미팅 회의록 예시 (Example Production Meeting Minutes)

  • SRE 팀의 정기 프로덕션 미팅에서 시스템 건강 상태와 운영 지표를 점검하는 표준 포맷 예시(2015-10-23).
  • 어젠다: 공지(announcements), 이전 액션 아이템 리뷰, 장애 리뷰(outage review), 페이징/비페이징 이벤트, 모니터링 변경, 예정된 프로덕션 변경, 리소스 사용량, 핵심 서비스 지표(SLO 대비), 토론·프로젝트 업데이트, 신규 액션 아이템.
  • 에러 예산(error budget)을 초과한 장애의 후속 조치 추적과 책임 소재(accountability)를 유지하기 위한 핵심 운영 포럼 역할.