System Architecture & Distributed Systems
확장성 있는 서비스 구조와 분산 환경에서의 데이터 정합성, 합의 메커니즘을 정의하는 학습 노드입니다.
Article
M
Me
hyunyoun's Blog
system-architecture-distributed-systemssystem-architecturedistributed-systemslearningkuberneteskafkaenvoyetcd9 min read
1. Overview
시스템 아키텍처 및 분산 시스템(System Architecture & Distributed Systems, SADS)은 단일 컴퓨팅 노드의 물리적 한계를 극복하고, 수많은 독립된 장치들이 하나의 유기적인 서비스로 동작하게 만드는 설계 원리와 분산 제어 기술을 다룹니다. 본 카테고리는 단순한 서버 구성을 넘어, 컴포넌트 간 느슨한 결합(Loose Coupling), 부분 장애 상황에서의 복구력(Resilience), 그리고 네트워크 지연 하에서의 전역적 상태 정합성 보장 메커니즘을 탐구합니다.
CS2023의 Parallel and Distributed Computing (PDC) 지식 영역과 SWEBOK의 시스템 설계 역량을 근간으로 삼아, 모놀리식 계층형 아키텍처부터 클라우드 네이티브 마이크로서비스(MSA), 서버리스(Serverless), 그리고 분산 합의 알고리즘까지 체계적으로 다룹니다.
최신 시스템 아키텍처는 컨테이너 오케스트레이션(Kubernetes)과 서비스 메시(Service Mesh)를 기반으로 인프라 복잡성을 추상화하는 방향으로 발전하고 있습니다. DIM(06)이 '데이터가 어떻게 저장되는가'를 다룬다면, SADS는 '그 저장된 데이터와 비즈니스 로직을 어떤 컴포넌트 구조로 네트워크에 분산 배치할 것인가'를 결정하는 상위 설계 도메인입니다.
2. Scope & Boundaries
In-Scope
- 아키텍처 패턴(Patterns): 모놀리식 3-Tier, 헥사고날(Hexagonal/Clean Architecture), 마이크로서비스(MSA), 이벤트 기반(EDA), CQRS(Command Query Responsibility Segregation).
- 분산 시스템 이론: CAP/PACELC 정리, 논리적 시계(Lamport Clock/Vector Clock), 리더 선출(Leader Election), 분산 합의(Raft, Paxos), 2PC(Two-Phase Commit) / Saga 패턴.
- 신뢰성 및 확장성: 로드 밸런싱(L4/L7), 서킷 브레이커(Circuit Breaker), 재시도(Retry)와 지수 백오프(Exponential Backoff), 오토스케일링 전략, 무상태(Stateless) 설계.
- 관측 가능성(Observability): 분산 트레이싱(Distributed Tracing - OpenTelemetry), 중앙 집중식 로깅, 메트릭 모니터링 체계.
Out-of-Scope
- 저수준 패킷 캡처 및 통신 프로토콜: TCP 핸드셰이크 상세, 라우팅 테이블 계산, 물리 계층 신호 처리 → 08. NC 노드로 위임.
- 단일 노드 커널 최적화: 로컬 디스크 I/O 스케줄링, 메모리 페이징 인터널 → 03. OSSM 노드로 위임.
- CI/CD 파이프라인 구축: Jenkins/GitHub Actions를 이용한 배포 스크립트 작성 및 애자일 릴리스 프로세스 → 09. SEDO 노드로 위임.
Boundaries
- SADS는 데이터의 '물리적 네트워크 전송(08. NC)' 자체보다는, 전송된 데이터를 바탕으로 한 **'서비스 간의 구조적 배치(Topology)'**와 '분산된 상태의 최종 일관성(Eventual Consistency)' 조율에 집중합니다.
- 클라우드 인프라 자원(EC2, VPC)을 구성하는 실무 작업은 CLIC(10)에서 다루지만, 그 인프라 위에 올라가는 컴포넌트들의 상호 작용 **'설계도'**를 그리는 것은 SADS의 역할입니다.
3. Counterexample
- 특정 클라우드 벤더 도구만 숙달: AWS Lambda나 API Gateway의 GUI 설정법을 외우는 것은 단순 '도구 활용' 단계입니다. 왜 해당 로직이 **상태 비저장(Stateless)**이어야만 수평 확장이 가능한지, 콜드 스타트(Cold Start) 지연이 아키텍처에 미치는 영향은 무엇인지 분석하는 것이 SADS의 핵심입니다.
- 단순한 서버 쪼개기(MSA 만능주의): 애플리케이션을 일단 여러 개로 쪼개는 행위가 아키텍처 설계는 아닙니다. 서비스 분리 시 필연적으로 발생하는 네트워크 파티션(Partition) 상황에서 분산 트랜잭션을 어떻게 처리할지(예: Saga 패턴, Outbox 패턴) 방안 없이 모놀리스를 쪼개기만 하는 것은 '분산 모놀리스(Distributed Monolith)'라는 재앙을 낳습니다.
- 서버리스/오케스트레이션 개념 혼동: Docker로 띄웠다고 해서 클라우드 네이티브가 아니며, Kubernetes를 쓴다고 해서 MSA가 아닙니다. 이들은 도구일 뿐, 비즈니스 도메인 간의 강결합을 끊는 응집도(Cohesion) 높은 경계(Bounded Context) 설계가 선행되어야 합니다.
4. Prerequisites
- 네트워크 및 통신 (Basic): HTTP/gRPC 프로토콜의 차이, DNS 작동 방식, TCP/UDP 기반 소켓 통신의 기본 특성 파악. (P1
) 분산 컴포넌트는 결국 네트워크 위에서 통신하므로 지연(Latency)과 패킷 손실을 이해해야 합니다. - 데이터베이스 엔진 기초 (Recommended): 샤딩(Sharding), 리플리케이션(Replication), 낙관적 락(Optimistic Lock) 등 단일 노드 DB를 넘어서는 데이터 복제 개념적 이해. (P1
) - 운영체제 프로세스 모델 (Practical): 프로세스 간 통신(IPC), 스레드 동시성 문제, 컨테이너(cgroups/namespaces) 격리의 기본 원리 이해. (P1
)
5. Learning Map
6. Learning Topics
Basic
Core Topic 01: 소프트웨어 아키텍처 기초와 레이어링 (Architecture Foundations)
- Why to Learn: 시스템 규모가 커지고 요구사항이 복잡해질 때, 코드가 스파게티처럼 얽히는 것을 방지하고 비즈니스 핵심 논리를 인프라 기술로부터 독립시키기 위함입니다.
- What to Learn:
- Concepts: 관심사 분리(Separation of Concerns), 계층화 아키텍처(3-Tier: Presentation-Logic-Data), 의존성 역전 원칙(DIP), 육각형 아키텍처(Hexagonal/Ports and Adapters), 도메인 주도 설계(DDD) 기초.
- Skills: 모놀리식 코드에서 핵심 비즈니스 레이어를 추출하여 인프라(DB, Web) 의존성을 외부로 밀어내는 클린 아키텍처 구조로 재배치.
- Tools: UML / C4 Model 다이어그램 도구(Structurizr, PlantUML), ArchUnit(아키텍처 테스트).
- Trade-offs: 설계의 엄밀함으로 인한 간접 레이어(Interface, DTO) 증가 및 초기 보일러플레이트 코드 작성 비용 vs 장기적인 유지보수성과 테스트 용이성.
- How to Learn:
- 1단계: 라우터 파일에 SQL 쿼리와 비즈니스 로직이 혼재된 단순한 CRUD 앱을 Presentation, Service, Repository 레이어로 엄격히 분리해 봅니다.
- 2단계: Repository 패턴의 인터페이스를 적용하여, MySQL에서 MongoDB로 데이터베이스를 교체할 때 Service 레이어의 코드가 단 한 줄도 변경되지 않음을 증명합니다.
- Implement: 특정 요구사항을 반영하여 변동성이 높은 영역(UI, DB)과 안정적인 영역(Domain)을 분리한 C4 모델 기반 시스템 아키텍처 다이어그램.
Recommended
Core Topic 02: 분산 시스템의 정리와 트레이드오프 (Dist. Theory & CAP)
- Why to Learn: 네트워크 지연과 단절이 필연적인 분산 환경에서, 어떤 비즈니스 가치(예: 완벽한 데이터 일관성 vs 24시간 무중단 가용성)를 우선할지 공학적 근거로 결정하기 위함입니다.
- What to Learn:
- Concepts: CAP 이론(Consistency, Availability, Partition Tolerance), PACELC 정리, 최종 일관성(Eventual Consistency) vs 강한 일관성(Strong Consistency), 논리적 시계(Lamport Clock).
- Skills: 장애 상황 시나리오에 따른 시스템 응답 모델(CP 시스템 vs AP 시스템) 타당성 검토, 분산 데이터 충돌 해결 전략(Vector Clock, LWW).
- Tools: Jepsen (분산 시스템 정합성/파티션 테스트 도구) 컨셉 및 결과 리포트 이해.
- Trade-offs: 완벽한 데이터 일관성 보장(결제 등)으로 인한 응답 지연(Latency) 증가 vs 무중단 가용성 및 성능 확보(소셜 피드 등)로 인한 구버전 데이터 노출 위험.
- How to Learn:
- 1단계: 분산 DB 클러스터에서 노드 간 네트워크 단절(Network Partition)을 인위적으로 발생시키고, 클라이언트의 읽기/쓰기 요청이 노드별로 어떻게 처리(또는 거부)되는지 테스트합니다.
- 2단계: '장바구니' 서비스(AP)와 '결제' 서비스(CP)에서 요구하는 일관성 수준의 차이를 분석하고, 장애 발생 시 각 시스템의 복구 시나리오를 작성합니다.
- Implement: 특정 비즈니스 도메인 요구사항에 따른 분산 전략 타당성 분석 및 PACELC 기반 시스템 설계 보고서.
Practical
Core Topic 03: 마이크로서비스와 클라우드 네이티브 (MSA & K8s)
- Why to Learn: 서비스별 독립적인 배포와 수평 확장을 가능케 하여 트래픽 폭주에 유연하게 대응하고, 조직 단위의 자율적인 개발 라이프사이클을 구축하기 위함입니다.
- What to Learn:
- Concepts: 서비스 경계(Bounded Context), API Gateway, BFF(Backend For Frontend), 서킷 브레이커(Circuit Breaker), Saga 패턴(보상 트랜잭션), 이벤트 소싱(Event Sourcing), CQRS.
- Skills: 컴포넌트 간 동기 호출(REST/gRPC)과 비동기 호출(Message Queue: Kafka/RabbitMQ)의 적절한 혼합 배치, 무상태(Stateless) 컨테이너 설계.
- Tools: Kubernetes(Pod, Service, Ingress), Docker, Service Mesh (Istio/Linkerd).
- Trade-offs: 서비스 자율성 증대 및 개별 스케일링 이점 vs 네트워크 호출 지연(Hop), 분산 트랜잭션 복잡도, 디버깅/추적 난이도의 기하급수적 증가.
- How to Learn:
- 1단계: 두 개의 분리된 서비스를 컨테이너화하고, 메시지 브로커(Kafka)를 통해 주문 생성 시 이벤트를 발행하여 비동기로 재고를 차감하는 구조를 구현합니다.
- 2단계: 하위 서비스에 고의로 지연(Delay)을 발생시키고, 상위 서비스의 서킷 브레이커(Resilience4j)가 열려서 전체 시스템 장애(Cascading Failure)를 방지하는 과정을 시뮬레이션합니다.
- Implement: 2PC(Two-Phase Commit) 분산 트랜잭션을 대체하는 이벤트 기반 보상 트랜잭션(Saga) 설계 및 구현 가이드.
Advanced
Core Topic 04: 분산 합의 알고리즘과 조정 (Consensus & Coordination)
- Why to Learn: 중앙 제어 장치 없는 P2P 환경에서 여러 노드가 하나의 상태에 안전하게 동의하게 함으로써, 단일 장애점(SPOF)이 없는 최상위 신뢰성 인프라를 구축하기 위함입니다.
- What to Learn:
- Concepts: 정족수(Quorum) 기반 읽기/쓰기, 리더 선출(Leader Election), 복제 상태 머신(Replicated State Machine), Raft 알고리즘, Paxos 기반 합의 프로토콜.
- Skills: 스플릿 브레인(Split-Brain) 현상 예방 설계, 특정 노드 장애 시에도 클러스터 전체의 합의가 유지되는 과정(Log Replication) 분석.
- Tools: etcd (Kubernetes Storage Engine), Apache ZooKeeper, HashiCorp Consul.
- Trade-offs: 다수결 합의 과정으로 인한 엄밀성 보장(Latency 발생) vs 복제 성능 및 시스템 확장성.
- How to Learn:
- 1단계: 웹 기반 Raft 알고리즘 시뮬레이터를 통해 리더 선출 타임아웃, 로그 복제 메커니즘, 패킷 유실 시의 충돌 해결 과정을 시각적으로 추적합니다.
- 2단계: 3개의 노드로 분산 구성 정보 관리 도구(etcd) 클러스터를 구성하고, 리더 노드 강제 종료(Kill) 후 새로운 리더가 선출되어 서비스가 복구되는 과정을 모니터링합니다.
- Implement: 다중 리전(Multi-region) 환경에서 데이터 정합성을 유지하기 위한 코디네이터(Coordinator) 엔진 또는 리더 선출 메커니즘 아키텍처 제안.
7. Terminology
8. References
Primary References
- [P1] CS2023: PDC — Parallel and Distributed Computing.
- [P2] SWEBOK v4: Software Design — Software Architecture and Styles.
- [P5] SFIA v9: Solution Architecture — 솔루션 설계 및 아키텍처 수립 역량.
Secondary References
- [DDIA] Designing Data-Intensive Applications — Martin Kleppmann (분산 시스템 설계의 사실상 표준).
- [Building Microservices] Sam Newman — 마이크로서비스 설계와 분할의 원칙.
Industry References
- [AWS Well-Architected Framework] — 안정성, 성능 효과, 보안을 아우르는 실무 아키텍처 지침.
- [CNCF Landscape] — 클라우드 네이티브 기술 생태계 및 표준화 동향.
9. Final Checklist
Primary Checklist
- 시스템 설계 시 단일 장애점(SPOF)을 식별하고 이중화 및 장애 복구(Failover) 시나리오를 수립했는가? (P2)
- 신규 노드 추가 시 선형적으로 성능이 향상되는 수평 확장(Horizontal Scaling) 구조인지 증명 가능한가? (P1-PDC)
Secondary Checklist
- 서비스 간 통신 요구사항에 맞춰 동기(RPC)와 비동기(Messaging) 방식의 트레이드오프를 결정했는가?
- 대규모 트래픽 분산을 위해 L4(IP/Port)와 L7(Content/Path) 중 적절한 로드 밸런싱 정책을 제안했는가?
Industry Checklist
- 분산된 서비스 전 구간에서 발생하는 지연 시간(Tail Latency)을 추적하기 위한 트레이싱(Tracing)을 구현했는가?
- 네트워크 재시도 폭풍을 방지하기 위한 지수 백오프(Exponential Backoff)와 지터(Jitter)를 적용했는가?