Chapter 15

중복성과 장애 격리

  • 15.1 Correlation
  • 15.2 Shuffle sharding
  • 15.3 Cellular architecture

**중복성(redundancy)**으로 가용성을 높이려면 한 가지 전제가 필요해 — 장애가 **독립적(uncorrelated)**이어야 한다는 거야. 서버 2대가 각각 99% 가용성이면 이론적으로 99.99%가 되지만, 이건 확률의 곱이 성립할 때만 맞는 이야기거든. 현실에서는 장애가 종종 **상관(correlated)**돼. 같은 물리적 호스트에 있으면 호스트 장애로 전부 죽고, 같은 전원이나 네트워크 스위치를 공유하면 그게 터질 때 같이 죽어. 같은 소프트웨어 버그를 가지면 같은 입력에 전부 크래시하고, 같은 설정 변경이 동시에 적용되면 전부 잘못 동작하지. "It's all about correlated failures." 레플리카를 **서로 다른 가용 영역(AZ)**이나 리전에 분산시키고, 배포는 **점진적(canary/rolling)**으로, 공유 의존성은 최소화해야 해.

그런데 상관 장애를 물리적 격리만으로 완전히 막기는 어렵잖아. 여기서 **셔플 샤딩(shuffle sharding)**이 등장해. 워크로드를 **조합적(combinatorial)**으로 분배해서, 물리적 격리 없이도 논리적 격리를 달성하는 기법이야. 8개 서버가 있고 각 고객에게 2개 서버를 배정한다면, 가능한 조합은 C(8,2) = 28가지지. 두 고객이 완전히 같은 서버 쌍에 배정될 확률은 1/28, 약 3.6%밖에 안 돼. 한 고객의 트래픽 폭발이 배정된 2개 서버에만 영향을 미치니까, 다른 고객 대부분은 무사해. 서버 수나 고객당 배정 수를 늘리면 겹침 확률은 급격히 줄어들어.

더 극단적인 격리가 필요하면 **셀룰러 아키텍처(cellular architecture)**가 있어. 시스템을 **아무것도 공유하지 않는 독립적인 셀(cell)**로 나누는 거지. 각 셀은 사용자의 부분집합을 담당하고 자체적인 완전한 인프라 스택을 가져. 한 셀의 장애는 다른 셀로 전파되지 않아. 셔플 샤딩보다 훨씬 강력한 격리지만, 각 셀이 독립 인프라를 유지하니까 효율성을 희생하게 돼. 실무에서는 셔플 샤딩으로 대부분의 격리를 달성하고, 가장 중요한 서비스에만 셀룰러 아키텍처를 적용하는 식으로 조합하면 돼.

결국 핵심은 폭발 반경(blast radius)을 줄이는 것이야. 장애를 완전히 막을 수 없다면, 영향받는 사용자 수를 최소화하라.


정리

15장 읽고 기억할 거 세 가지:

  1. 중복성의 가용성 공식은 장애 독립성을 가정해 — 같은 호스트, 같은 스위치, 같은 버그, 같은 설정이 상관 장애의 주범이야.
  2. 셔플 샤딩은 조합론으로 논리적 격리를 달성하고, 셀룰러 아키텍처는 완전한 물리적 격리를 제공해 — 둘을 조합해서 쓰는 게 현실적이지.
  3. 장애 격리의 본질은 blast radius를 줄이는 것 — 장애를 막을 수 없다면, 영향받는 범위를 최소화하라.