1️⃣ 확장성
증가한 트래픽을 지원하도록 시스템을 확장할 수 있는 건 분산 시스템의 주요 특성이다. 데이터 볼륨이나 트래픽 증가시 퍼포먼스 저하 없이 시스템 확장을 달성해야 한다.
2️⃣ 수평적 확장과 수직적 확장
수평적 확장은 서버를 증가함으로써 시스템을 확장하는 방식이며, 수직적 확장은 서버의 스펙(RAM, CPU 등등)을 높여서 시스템을 확장하는 방식이다.
카산드라와 몽고DB는 서버를 추가함으로써 수평적 확장을 쉽게하고, MySQL을 좀 더 스펙이 좋은 머신으로 바꿀 수 있게 함으로써 좋은 수직적 확장의 예를 보여준다.
📌 덧붙여서
확장성을 비지니스에 실제로 대립해 보면 아티클에서 언급되지 않은 ‘서버 비용’이 아주 중요합니다. 서버를 추가하거나 업그레이드 하면 시스템 사이즈에 따라 엄청난 비용이 발생합니다. 시스템의 데이터 볼륨과 트래픽 증가를 capacity model이라는 수학식을 만들어서 필요한 서버 수를 추려내는 것이 좋습니다. 시스템이 너무 커버린 상태에서 식을 성립하는 건 복잡할 수 있으므로 분산 시스템의 초기 단계에 성립하는 것이 개인적으로 좋다고 생각합니다. 보통 시스템을 확장할 때 수직적, 수평적 확장은 한 가지만 하는 게 아니라 두 가지 방법을 같이 사용하기도 합니다.
3️⃣ 신뢰성
분산 시스템은 소프트웨어 또는 하드웨어(예: 서버 다운) 구성 요소 중에 장애가 발생하더라도 서비스를 지속적으로 제공하는 경우 신뢰할 수 있는 시스템으로 간주된다. 안정적인 분산 시스템은 소프트웨어 구성 요소와 데이터의 이중화를 통해 신뢰성을 달성한다. 이중화는 큰 비용이 발생할 수 있다.
4️⃣ 가용성
가용성은 시스템이 특정 기간에 기능을 수행하기 위해 작동 상태를 유지하는 것을 의미한다.
📌 덧붙여서
작동 상태에 장애 발생시 빠른 회복 타임과 큰 장애 발생이 오기 전에 모니터링 가능한 시스템을 설계하는 것도 함께 중요합니다.
5️⃣ 신뢰성과 가용성
시스템에 신뢰성이 있으면 자연적으로 가용성도 있다. 하지만 반대로 시스템이 가용성이 있다고 반드시 신뢰성이 있는 건 아니다(이건 아주 중요한 개념입니다). 즉 높은 신뢰성은 높은 가용성으로 이어지나, 높은 가용성을 유지하더라도 장애 발생시 늦은 회복 타임으로 인해 신뢰할 수 없는 시스템이 될 수 있다.
📌 덧붙여서
시스템을 빠르게 회복하려면 모니터링이 중요합니다. 서비스를 만들 때, 단순히 유저에게 기능을 제공한다는 마인드 보다는 장애 또는 실패 모드를 빠르게 파악하고 회복하도록 설계하는 것이 좋습니다. 따라서 시스템 설계는 단순히 구성 요소를 이것 저것 넣는 것을 떠나서 기본적으로 모니터링 가능한 메트릭을 다각도에서 분석하고 추가하며 더 나아가 특정 메트릭 발생시 자동으로 회복 또는 방어하는 기능까지 넣어줘야 합니다.
👉 마지막으로, 시스템 면접 또는 설계시 위 특성을 모두 고려하는 게 좋아요. 시스템 설계는 단순하게 필요한 구성 요소를 파악하는 게 다가 아닙니다. 특히 라지 스케일의 확장 가능한 시스템을 설계하려면 위 요소 모두 고려해서 디자인하는 게 좋습니다.