클라우드 인프라

클라우드 데이터베이스 분산 합의, Raft/Paxos 직접 파헤쳐보니 핵심은 이것!

강코의 코딩 일기 2026. 7. 23. 15:10
반응형

클라우드 네이티브 데이터베이스의 고가용성을 책임지는 분산 합의 프로토콜(Raft/Paxos)의 내부 동작 원리를 깊이 있게 분석하고, 실무에서 바로 적용할 수 있는 점검 항목들을 공유합니다.

안녕하세요, 클라우드 환경에서 데이터베이스를 구축하고 운영하며 수많은 시행착오를 겪어온 개발자입니다. 분산 시스템이 대세가 되면서 클라우드 네이티브 데이터베이스의 중요성은 날로 커지고 있죠. 그런데 혹시 이런 궁금증 가져보신 적 없나요? "장애가 나도 데이터 유실 없이 어떻게 계속 동작하지?", "노드를 추가하거나 제거할 때 내부적으로 무슨 일이 일어날까?" 저 역시 주니어 시절에는 그저 '알아서 잘 되겠지' 하고 넘어갔던 부분입니다. 하지만 시스템이 커지고 복잡해질수록, 이 '알아서 잘 되는' 부분의 핵심인 분산 합의 프로토콜을 이해하지 못하면 문제 해결은 물론, 성능 최적화나 안정적인 운영 자체가 불가능하다는 것을 뼈저리게 느꼈습니다.

특히 클라우드 환경에서는 노드가 언제든 추가되거나 사라질 수 있고, 네트워크 지연이나 파티션이 빈번하게 발생할 수 있습니다. 이런 예측 불가능한 상황에서도 데이터 일관성과 서비스 연속성을 보장하는 것이 바로 분산 합의 프로토콜의 역할입니다. 이 글에서는 클라우드 네이티브 데이터베이스의 핵심 기반 기술인 Raft와 Paxos 프로토콜의 내부 동작 원리를 깊이 파헤쳐보고, 실무에서 고가용성 DB를 운영할 때 반드시 점검해야 할 항목들을 제 경험을 바탕으로 공유하고자 합니다. 복잡하게만 느껴졌던 분산 합의의 세계, 저와 함께 한 걸음씩 들어가 보시죠!

클라우드 네이티브 데이터베이스의 분산 합의(Raft/Paxos) 프로토콜: 고가용성을 위한 내부 동작 원리 - vietnamese girl, asian woman, nature, lotus flower, river, water, bamboo raft

Image by Jupilu on Pixabay

클라우드 네이티브 DB 고가용성의 시작: 분산 합의 프로토콜 이해하기

클라우드 환경에서 데이터베이스를 구축할 때 가장 먼저 고려하는 것 중 하나가 바로 고가용성(High Availability)입니다. 단일 장애 지점(Single Point of Failure)을 없애고, 특정 노드에 문제가 생기더라도 서비스가 중단 없이 지속되도록 하는 것이 목표죠. 이를 달성하기 위해 여러 대의 서버에 데이터를 복제하고, 이 복제된 데이터들 간의 일관성(Consistency)을 유지하는 것이 핵심입니다. 바로 이 일관성을 보장하기 위한 메커니즘이 분산 합의 프로토콜입니다.

제가 처음 분산 시스템을 접했을 때, 단순히 데이터를 여러 군데 복사해두면 되는 줄 알았습니다. 하지만 실제로는 "어떤 데이터가 최신 데이터인지", "모든 노드가 같은 상태를 보고 있는지", "노드 장애 시 누가 리더가 되어야 하는지" 등 복잡한 문제들이 발생하더군요. 이런 문제들을 해결하고, 분산된 노드들이 마치 하나의 시스템처럼 동작하게 만드는 것이 분산 합의 프로토콜의 존재 이유입니다. 특히 클라우드 네이티브 DB에서는 마이크로서비스 아키텍처와 컨테이너 환경의 유연성 덕분에 노드의 동적 스케일링이 빈번한데, 이때 분산 합의 프로토콜은 멤버십 변경까지도 안전하게 처리하며 시스템의 견고함을 유지합니다.

점검 항목 1: 현재 운영 중인 클라우드 DB의 합의 프로토콜은 무엇인가?

  • 이유: 내가 사용하는 데이터베이스가 어떤 분산 합의 프로토콜을 사용하는지 아는 것은 그 DB의 동작 방식, 장애 대응 방식, 성능 특성을 이해하는 첫걸음입니다. 예를 들어, CockroachDB, TiDB, etcd 등은 Raft를 기반으로 하고, Google Spanner는 Paxos의 변형을 사용합니다. 각 프로토콜의 특성을 알면 예상치 못한 동작이나 성능 저하의 원인을 빠르게 파악할 수 있습니다.

점검 항목 2: 분산 합의의 기본적인 CAP 이론 이해도

  • 이유: 분산 시스템의 기본 중의 기본인 CAP 이론은 일관성(Consistency), 가용성(Availability), 분할 내성(Partition Tolerance) 중 두 가지만 만족할 수 있다는 것을 설명합니다. 분산 합의 프로토콜은 주로 P(분할 내성)를 전제로 C(일관성)나 A(가용성) 중 하나를 선택하여 최적화됩니다. 사용하는 DB가 어떤 선택을 했는지 이해하면, 특정 상황에서 어떤 데이터 일관성 보장을 기대할 수 있는지 명확히 알 수 있습니다.

Raft 프로토콜 심층 분석: 쉽고 강력한 합의의 설계

Paxos가 워낙 복잡하고 이해하기 어렵다는 평이 많았던 반면, Raft는 "Understandable Consensus Algorithm"을 목표로 설계되었습니다. 실제로 Raft는 Paxos에 비해 이해하기 쉽고 구현도 비교적 용이하여 많은 클라우드 네이티브 시스템에서 채택되고 있습니다. 저 역시 Raft를 처음 공부했을 때, 그 명확한 역할 분담과 상태 전이 덕분에 분산 합의의 핵심을 비교적 빠르게 파악할 수 있었습니다.

리더 선출(Leader Election): 안정적인 시스템의 첫걸음

Raft의 가장 중요한 특징 중 하나는 강력한 리더(Strong Leader)의 존재입니다. 클러스터 내에서 오직 하나의 노드만이 리더가 되며, 모든 클라이언트 요청은 리더를 통해 처리됩니다. 리더가 죽거나 네트워크 문제로 다른 노드들과 단절되면, 새로운 리더를 선출하는 과정이 시작됩니다.

  • Follower(팔로워): 리더나 후보자에게서 요청을 받거나 리더로부터 로그를 복제받습니다.
  • Candidate(후보자): 리더 선출 과정에서 리더가 되기 위해 다른 노드들에게 투표를 요청하는 노드입니다.
  • Leader(리더): 모든 클라이언트 요청을 처리하고 팔로워들에게 로그를 복제합니다.

리더 선출은 다음과 같은 방식으로 진행됩니다.

  1. 팔로워는 일정 시간(Election Timeout) 동안 리더로부터 하트비트(Heartbeat)를 받지 못하면 후보자 상태로 전환합니다.
  2. 후보자는 자신의 Term(임기)을 증가시키고, 자신에게 투표한 후 다른 노드들에게 RequestVote RPC를 보냅니다.
  3. 다른 팔로워들은 자신의 임기보다 큰 임기를 가진 후보자에게 한 번만 투표할 수 있습니다.
  4. 과반수(N/2 + 1) 이상의 투표를 받은 후보자는 리더가 됩니다.
  5. 만약 여러 후보자가 동시에 투표를 요청하여 과반수를 얻지 못하면, 임의의 시간(Randomized Election Timeout)을 기다린 후 다시 선출 과정을 시작합니다.

점검 항목 3: Raft 클러스터의 Election Timeout 설정 및 모니터링

  • 이유: Election Timeout은 리더 장애 시 새로운 리더가 선출되기까지 걸리는 시간을 결정합니다. 너무 짧으면 불필요한 리더 선출이 자주 발생하여 시스템 부하를 높이고, 너무 길면 리더 장애 시 서비스 중단 시간이 길어집니다. 일반적으로 150ms ~ 300ms 사이의 랜덤한 값으로 설정하며, 네트워크 환경과 노드 스펙에 따라 최적화가 필요합니다.
    # etcd 예시 설정 (Raft 기반)
    election-timeout: 200ms
    heartbeat-interval: 50ms
    운영 중인 DB에서 이 값을 어떻게 설정했는지 확인하고, 리더 변경 이벤트가 발생했을 때 실제 소요 시간을 모니터링하여 적절한지 판단해야 합니다.

로그 복제(Log Replication): 데이터 일관성의 핵심

리더가 선출되면, 모든 클라이언트 요청(쓰기 작업)은 리더를 통해 처리되고 로그 엔트리(Log Entry) 형태로 기록됩니다. 이 로그는 팔로워 노드들에게 복제되어 데이터 일관성을 유지합니다.

  1. 클라이언트가 리더에게 쓰기 요청을 보냅니다.
  2. 리더는 요청을 로그 엔트리로 변환하여 자신의 로그에 추가합니다.
  3. 리더는 팔로워들에게 AppendEntries RPC를 보내 로그 엔트리를 복제합니다.
  4. 팔로워들은 로그를 성공적으로 추가했음을 리더에게 응답합니다.
  5. 리더는 과반수 이상의 팔로워로부터 성공 응답을 받으면 해당 로그를 커밋(Commit)하고 클라이언트에게 응답합니다.
  6. 커밋된 로그 엔트리는 모든 노드에 적용(Apply)되어 상태 머신을 업데이트합니다.

점검 항목 4: 로그 복제 지연 및 일관성 모니터링

  • 이유: 로그 복제는 데이터 일관성을 보장하는 핵심입니다. 복제 지연이 발생하면 리더와 팔로워 간의 데이터 불일치가 발생할 수 있으며, 이는 읽기 일관성 문제나 장애 시 데이터 유실로 이어질 수 있습니다. 각 노드별 Last Applied IndexCommit Index를 모니터링하여 모든 노드가 동일한 최신 상태를 유지하는지 확인해야 합니다.
    # etcdctl로 Raft 상태 확인 예시
    etcdctl endpoint status --write-out=table
    # 출력 결과에서 Raft Index, Commit Index 등을 확인
    클라우드 환경에서는 네트워크 지연으로 복제 지연이 발생할 수 있으므로, 주기적인 모니터링과 알림 설정이 필수적입니다.

안전성 원칙: 데이터 유실 방지

Raft는 몇 가지 안전성 원칙을 통해 데이터 유실을 방지하고 일관성을 보장합니다. 대표적인 것이 Commit RuleLog Matching Property입니다. 커밋된 로그는 절대로 롤백되지 않으며, 리더는 항상 최신 커밋된 로그를 포함하는 노드 중에서 선출됩니다. 이를 통해 분산 시스템의 복잡한 시나리오에서도 데이터의 무결성을 지킬 수 있습니다.

점검 항목 5: 스냅샷(Snapshot) 정책 및 주기

  • 이유: Raft 로그는 계속해서 누적됩니다. 로그가 너무 많아지면 노드 복구 시 시간이 오래 걸리고, 디스크 공간을 많이 차지하게 됩니다. 이를 해결하기 위해 일정 시점의 상태를 스냅샷으로 저장하고, 그 이전의 로그는 삭제하는 로그 컴팩션(Log Compaction)을 수행합니다. 스냅샷 정책(생성 주기, 보관 개수 등)이 적절한지, 백업/복구 시 스냅샷을 활용하는지 점검해야 합니다. 부적절한 스냅샷 정책은 복구 시간 지연이나 디스크 부족으로 이어질 수 있습니다.

Paxos 프로토콜 엿보기: 이론의 정수, 그러나 복잡성

Paxos는 람포트(Lamport)가 제안한 최초의 분산 합의 프로토콜입니다. Raft보다 먼저 나왔으며, 분산 시스템 분야의 수많은 연구와 구현에 지대한 영향을 미쳤습니다. Google의 Chubby, Spanner 등 핵심 인프라 서비스들이 Paxos의 변형을 사용하고 있습니다. 하지만 그 복잡성 때문에 "이해하기 어렵다"는 평을 많이 받습니다. 저 역시 Paxos 논문을 처음 읽었을 때, 그 추상적인 설명과 여러 역할들 때문에 혼란스러웠던 기억이 있습니다.

Paxos는 크게 두 단계로 나뉩니다.

  1. Prepare 단계: 제안자(Proposer)가 제안 번호를 포함한 Prepare 요청을 수락자(Acceptor)들에게 보냅니다. 수락자들은 자신이 이전에 수락했던 값 중 가장 큰 제안 번호를 가진 값을 제안자에게 응답하고, 이후로는 해당 제안 번호보다 작은 번호를 가진 제안은 수락하지 않겠다고 약속합니다.
  2. Accept 단계: 제안자는 Prepare 단계에서 받은 응답들을 바탕으로 새로운 값을 결정하고, 이를 포함한 Accept 요청을 수락자들에게 보냅니다. 수락자들은 약속에 따라 Accept 요청을 수락하거나 거부합니다. 과반수 이상의 수락자가 Accept하면 값이 합의됩니다.

Raft와 달리 Paxos는 명시적인 리더가 없습니다. 어떤 노드든 제안자가 되어 합의를 시도할 수 있습니다. 이것이 유연성을 주기도 하지만, 동시에 복잡성을 증가시키는 요인이 됩니다. 합의가 깨졌을 때 누가 주도적으로 문제를 해결해야 할지 명확하지 않을 수 있기 때문입니다.

점검 항목 6: Paxos 기반 시스템의 제안자 경합(Contention) 모니터링

  • 이유: Paxos는 여러 제안자가 동시에 합의를 시도할 때 경합이 발생할 수 있습니다. 이는 시스템의 성능 저하로 이어질 수 있으며, 특정 상황에서는 라이브록(Livelock) 상태에 빠질 수도 있습니다. Paxos 기반 시스템을 운영한다면, 제안자 간의 경합이 얼마나 자주 발생하는지, 그리고 이로 인해 합의 지연이 얼마나 발생하는지 모니터링해야 합니다.
클라우드 네이티브 데이터베이스의 분산 합의(Raft/Paxos) 프로토콜: 고가용성을 위한 내부 동작 원리 - pipe system, tube, construction site, light, cable, industry, system, connection, flow through, embarrassed, plug-in system, round, circles, channel, industry, industry, industry, industry, industry, circles, circles

Image by Kranich17 on Pixabay

Raft vs Paxos: 어떤 선택을 할 것인가?

두 프로토콜 모두 분산 환경에서 합의를 이루기 위한 강력한 도구이지만, 그 특성과 복잡성에서 차이를 보입니다. 실무에서 이들을 직접 경험하며 느낀 가장 큰 차이점은 '개발 및 운영 편의성'이었습니다.

특징 Raft Paxos
이해도 및 구현 난이도 비교적 쉬움. 명확한 역할과 상태 전이. 매우 어려움. 추상적이고 복잡한 동작.
리더십 모델 강력한 리더(Strong Leader) 기반. 모든 쓰기 요청은 리더를 통해 처리. 명시적인 리더 없음 (어떤 노드든 제안자 가능).
복제 방식 로그 기반 상태 머신 복제. 값 기반 합의.
주요 사용처 분산 키-값 저장소 (etcd, Consul), 분산 SQL DB (CockroachDB, TiDB) 등 Google Chubby, Spanner (변형), Zookeeper (ZAB 프로토콜은 Paxos 기반) 등
성능 특성 리더 중심이라 쓰기 작업 시 단일 지점 부하 가능. (확장성 고려 필요) 경합이 적을 경우 분산된 쓰기 성능에 유리할 수 있으나, 경합 발생 시 복잡한 처리 필요.
멤버십 변경 Raft는 Joint Consensus 방식을 통해 안전하게 멤버십 변경 가능. Paxos는 멤버십 변경 자체가 복잡한 합의 과정.

대부분의 최신 클라우드 네이티브 데이터베이스나 분산 시스템은 Raft 혹은 Raft의 변형을 채택하는 추세입니다. 이는 Raft가 제공하는 '이해도'와 '구현 용이성' 덕분이라고 생각합니다. 물론 Paxos는 이론적으로 더 일반적이고 강력하지만, 실제 시스템에 적용하기에는 훨씬 많은 노력과 전문성이 필요합니다.

클라우드 네이티브 데이터베이스의 분산 합의(Raft/Paxos) 프로토콜: 고가용성을 위한 내부 동작 원리 - blockchain, businessman, chain, man, masculine, person data, records, concept, system, communication, consensus, mechanism, transaction, integrity, management, block, data block, concatenation, blockchain, blockchain, blockchain, blockchain, blockchain

Image by geralt on Pixabay

실전 적용을 위한 점검: Raft 기반 DB 운영 시 고려사항

제가 Raft 기반의 분산 데이터베이스를 운영하면서 가장 중요하다고 느꼈던 점들을 점검 항목 형태로 정리해 보았습니다. 이 부분은 특히 주니어 개발자분들이 실무에 바로 적용할 수 있는 팁이 될 것입니다.

1. Raft 그룹 멤버 수와 구성 확인

점검 항목 7: Raft 그룹은 홀수 개의 노드로 구성되어 있는가?

  • 이유: Raft는 과반수 동의(Quorum)를 통해 합의를 이룹니다. 홀수 개의 노드(예: 3, 5, 7개)로 구성하면, N개의 노드 중 (N/2)+1개의 노드가 살아있으면 합의가 가능하여 장애 상황에서 더 효율적입니다. 짝수 개의 노드는 동일한 수의 노드가 장애 났을 때 합의가 불가능해지는 경우가 발생할 수 있습니다 (예: 4개 노드 중 2개 장애 시 과반수 3개가 안됨). 일반적으로 3개 또는 5개 노드 구성이 가장 흔하며, 7개 이상은 네트워크 오버헤드와 복잡성 증가로 잘 사용되지 않습니다.

점검 항목 8: Raft 그룹 노드들이 물리적으로 분리되어 있는가?

  • 이유: 클라우드 환경에서는 가용 영역(Availability Zone, AZ)을 활용하여 노드들을 분산 배치하는 것이 중요합니다. 동일한 AZ 내에 모든 노드가 있다면, 해당 AZ에 장애가 발생했을 때 전체 클러스터가 다운될 위험이 있습니다. 최소 3개 이상의 AZ에 노드를 분산 배치하여 단일 AZ 장애에도 고가용성을 유지하도록 설계해야 합니다.

2. 리더 변경(Failover) 시나리오 테스트 및 모니터링

점검 항목 9: 리더 노드 강제 종료 시 서비스 전환 시간(RTO) 측정

  • 이유: 실제 장애 상황을 가정하여 리더 노드를 강제로 종료시키고, 새로운 리더가 선출되어 서비스가 정상화되기까지의 시간을 측정해야 합니다. 이 시간이 비즈니스 요구사항(RTO, Recovery Time Objective)을 만족하는지 확인하고, 만족하지 못한다면 Election Timeout 등의 설정을 조정하거나 네트워크 환경을 개선해야 합니다. 이는 클라우드 환경에서 정기적으로 수행해야 할 중요한 테스트입니다.

점검 항목 10: 리더 변경 이벤트에 대한 알림 시스템 구축

  • 이유: 리더 변경은 정상적인 상황에서도 발생할 수 있지만, 시스템에 문제가 있을 때도 발생합니다. 리더 변경 이벤트가 발생했을 때 즉시 알림을 받을 수 있도록 모니터링 시스템을 구축해야 합니다. 특정 노드에서 리더 변경이 빈번하게 발생한다면 해당 노드나 네트워크에 문제가 있을 가능성이 높습니다.

3. 데이터 일관성 및 복구 전략

점검 항목 11: 비정상 종료 노드 재합류 시 데이터 동기화 과정 확인

  • 이유: 장애가 발생하여 클러스터에서 이탈했던 노드가 다시 복구되어 클러스터에 합류할 때, 해당 노드가 최신 데이터를 안전하게 동기화하는 과정을 이해하고 있어야 합니다. Raft는 Log Replay 또는 Snapshot을 통해 이를 처리합니다. 동기화 과정에서 얼마나 많은 네트워크 대역폭과 디스크 I/O가 발생하는지, 그리고 얼마나 시간이 소요되는지 파악해야 대규모 장애 후 복구 계획을 수립할 수 있습니다.

점검 항목 12: 네트워크 파티션 발생 시 클러스터 동작 예측 및 테스트

  • 이유: 클라우드 환경에서는 네트워크 파티션(네트워크 분리)이 발생할 가능성이 있습니다. 이때 클러스터가 어떻게 동작하는지 이해하는 것이 중요합니다. Raft는 Quorum을 유지하는 파티션만 정상적으로 동작하고, 그렇지 않은 파티션은 읽기/쓰기 작업이 중단됩니다. 이를 가상으로 재현하여 클러스터가 예상대로 동작하는지, 그리고 파티션이 해소되었을 때 데이터가 안전하게 합쳐지는지 테스트해야 합니다.

마무리: 고가용성 DB, 이제 두렵지 않다

클라우드 네이티브 데이터베이스의 분산 합의 프로토콜, Raft와 Paxos의 내부 동작 원리를 깊이 파고들고, 실무에서 마주칠 수 있는 상황들을 점검 항목 형태로 살펴보았습니다. 처음에는 복잡하고 어렵게 느껴질 수 있지만, 각 프로토콜의 핵심 개념과 설계 철학을 이해하면 분산 시스템에 대한 통찰력을 크게 키울 수 있습니다.

저 역시 이 과정을 거치면서 단순히 '돌아간다'는 것을 넘어 '어떻게 돌아가는지'를 이해하게 되었고, 이는 곧 더 안정적이고 효율적인 시스템을 설계하고 운영하는 기반이 되었습니다. 주니어 개발자 여러분들도 이 글을 통해 분산 시스템의 고가용성이라는 큰 그림을 이해하고, 실무에서 자신감 있게 문제를 해결해 나가는 데 도움이 되었으면 좋겠습니다.

궁금한 점이나 추가적으로 다뤄줬으면 하는 내용이 있다면 언제든지 댓글로 남겨주세요! 함께 고민하고 성장해 나가는 것이 블로그 글쓰기의 가장 큰 보람입니다. 다음 글에서 더 유익한 내용으로 찾아뵙겠습니다.

📌 함께 읽으면 좋은 글

  • [생산성 자동화] 로우코드 데이터 동기화 성능 튜닝: 실시간 및 배치 처리 모델 최적화 전략
  • [클라우드 인프라] CDK와 Pulumi, 과도한 추상화의 덫: 재사용성인가, 복잡성인가?
  • [이슈 분석] 서비스 응답 시간 30% 단축 비결: 애자일 스프린트에서 성능 병목 해결하는 PM의 전략

이 글이 도움이 되셨다면 공감(♥)댓글로 응원해 주세요!
궁금한 점이나 다루었으면 하는 주제가 있다면 댓글로 남겨주세요.

반응형