Home 차량용 사이버보안 블로그
차량용 사이버보안

분산 데이터베이스의 최종 일관성 보장을 위한 합의 프로토콜 연구

2026년 2월 18일
데이터 연결 이상을 시각화한 이미지로, 붉은색과 푸른색으로 맥박치는 두 개의 불일치 데이터 노드가 불안정하게 깜빡이는 끊어진 연결선으로 이어져 있습니다.

증상 진단: 데이터베이스 노드 간 상태 불일치

여러 지리적 위치에 분산된 데이터베이스 노드에서 동일한 키(key)에 대한 조회 결과가 일관되지 않게 나타납니다. 가령, 서울 리전의 노드 A에서는 사용자 잔고가 100으로 조회되지만, 프랑크푸르트 리전의 노드 B에서는 동일한 사용자의 잔고가 95로 조회됩니다. 쓰기(Write) 연산이 발생한 후, 일정 시간 내에 모든 노드가 동일한 최신 값으로 수렴하지 않는 상태입니다. 이는 CAP 정리(CAP Theorem)에서 일관성(Consistency)과 가용성(Availability) 사이의 트레이드오프가 분산 시스템 설계의 근본적 난제임을 보여주는 전형적인 증상입니다.

데이터 연결 이상을 시각화한 이미지로, 붉은색과 푸른색으로 맥박치는 두 개의 불일치 데이터 노드가 불안정하게 깜빡이는 끊어진 연결선으로 이어져 있습니다.

원인 분석: 네트워크 분할과 비동기 복제의 한계

분산 데이터베이스의 최종 일관성(Eventual Consistency) 모델은 기본적으로 높은 가용성과 낮은 지연 시간을 위해 설계되었습니다. 쓰기 작업이 하나의 노드(예: 리더)에서 즉시 승인된 후, 해당 변경 사항은 비동기적으로 다른 팔로워 노드들로 복제됩니다. 이 복제 지연 시간 동안 다른 노드에서의 읽기 작업은 오래된 데이터를 반환할 수 있습니다. 더 근본적인 문제는 네트워크 분할(Partition)이나 노드 장애 시, 시스템이 쓰기 작업의 승인 여부를 결정하는 데 필요한 합의(Consensus)에 도달하지 못할 수 있다는 점입니다. 따라서 데이터 불일치가 영구화되거나 시스템이 중단될 위험이 있습니다.

백업의 중요성: 합의 프로토콜의 매개변수(예: Raft의 타임아웃, Paxos의 제안 번호)를 변경하거나, 데이터베이스 클러스터의 구성을 변경하기 전에는 반드시 현재의 구성 상태와 데이터를 스냅샷으로 백업해야 합니다. 합의 알고리즘의 잘못된 구성은 전체 클러스터의 운영 중단을 초래할 수 있으며, 백업 없이는 복구가 극히 어려움.

해결 방법 1: Raft 합의 알고리즘 구현을 통한 강한 일관성 보장

최종 일관성에서 강한 일관성(Strong Consistency)으로의 전환은 시스템의 복잡도를 높이지만, 데이터 정확성이 최우선인 금융, 주문 처리 시스템에서는 필수적입니다. 이처럼 raft 알고리즘은 이해하기 상대적으로 쉬운 합의 프로토콜로, 리더 선출(Leader Election), 로그 복제(Log Replication), 안전성(Safety)을 보장합니다. 모든 쓰기 요청은 리더 노드를 통해 처리되며, 과반수(Quorum) 이상의 팔로워 노드에 로그 항목이 복제되어야 클라이언트에게 성공 응답을 반환합니다.

Raft 클러스터 구성 핵심 단계

3노드 기반의 기본 Raft 클러스터 설정을 위한 핵심 로직입니다. 실제 구현에는 etcd, Consul 또는 직접 Raft 라이브러리(예: HashiCorp의 raft 라이브러리)를 사용합니다.

  1. 노드 역할 정의: 각 노드는 Follower, Candidate, Leader 중 하나의 상태를 가집니다. 초기화 시 모든 노드는 Follower 상태로 시작합니다.

  2. 리더 선출(타임아웃 메커니즘): Follower 노드는 무작위로 설정된 선출 타임아웃(Election Timeout, 예: 150-300ms) 동안 리더로부터 하트비트(Heartbeat)를 받지 못하면 Candidate 상태로 전환하고, 새로운 선거(Term) 번호를 증가시켜 다른 노드에게 투표 요청을 보냅니다. 과반수 이상의 투표를 받은 노드가 Leader가 됩니다.

  3. 로그 복제 절차:

    • 클라이언트의 쓰기 요청은 리더 노드에서만 수락됨.
    • 리더는 해당 명령을 자신의 로그에 추가한 후, AppendEntries RPC를 통해 모든 팔로워에게 병렬로 전송.
    • 과반수 이상의 팔로워가 로그 항목의 저장을 확인하면, 리더는 해당 항목을 커밋(Commit)하고 상태 머신(State Machine)에 적용한 후 클라이언트에게 결과를 반환.
    • 리더는 다음 하트비트에서 커밋 인덱스(Commit Index)를 팔로워들에게 전파하여 그들도 동일한 로그 항목을 적용하도록 함.
  4. 구성 변경 처리: 노드 추가/제거와 같은 클러스터 구성 변경은 특수한 로그 항목으로 처리되어야 하며, 동시에 두 개의 과반수가 형성되지 않도록 주의해야 합니다. 일반적으로 Joint Consensus나 단일 서버 변경 방식을 사용합니다.

해결 방법 2: 멀티 리전 배포를 위한 Paxos 파생 프로토콜 적용

Raft는 단일 리전 내에서의 합의에 최적화되어 있습니다. 그러나 서울, 북미, 유럽과 같이 광범위한 지리적 영역(고 네트워크 지연)에 걸쳐 데이터센터를 분산 배포할 경우, 리더에 대한 모든 쓰기가 높은 지연 시간을 초래합니다. 이를 해결하기 위해 Paxos 알고리즘의 파생 프로토콜인 Multi-Paxos를 활용하거나, 리더를 지역별로 두는 계층적 합의 방안을 고려할 수 있습니다.

Multi-Paxos는 기본 Paxos의 준비(Prepare) 단계를 최초 한 번 수행하여 ‘안정적인 리더’를 de facto로 선출함으로써, 이후의 제안(Proposal) 과정을 단순화하여 성능을 향상시킵니다. 광역 분산 환경에서는 각 데이터센터 내부에 Raft 클러스터를 구성하고, 데이터센터 간의 최종 글로벌 합의에는 Paxos 계열 프로토콜을 사용하는 하이브리드 모델이 효과적일 수 있습니다.

  1. 글로벌 로그 설계: 모든 데이터센터에 걸쳐 유일한 순서를 가지는 글로벌 트랜잭션 로그를 유지합니다. 이 로그의 각 슬롯에 값을 결정하는 것이 하나의 Paxos 인스턴스입니다.

  2. 리더 임대(Leader Lease): Multi-Paxos에서 한 프로포저(Proposer)가 일정 시간 동안 대부분의 인스턴스에 대한 리더 역할을 임대하여, 반복적인 준비 단계를 생략하고 직접 제안 단계(Accept)부터 시작할 수 있도록 합니다. 이는 네트워크 왕복 지연(RTT)을 줄입니다.

  3. 지역 읽기 최적화: 강한 일관성 읽기를 위해 항상 리더를 읽지 않아도 되도록, 리더는 자신의 리더십과 커밋 인덱스를 주기적으로 릴리스하며, 팔로워는 이 정보를 바탕으로 자신이 최신 데이터를 가지고 있을 때만 강한 일관성 읽기를 서비스할 수 있습니다.

해결 방법 3: 비즈니스 요구사항에 따른 합의 프로토콜 튜닝 및 모니터링

모든 시스템에 완벽한 프로토콜은 존재하지 않습니다. 비즈니스의 내구성(Durability), 지연 시간(Latency), 처리량(Throughput) 요구사항에 따라 합의 프로토콜의 매개변수와 구성을 세밀하게 조정해야 합니다. 또한, 합의 과정에서 발생하는 지표를 실시간으로 모니터링하여 병목 현상을 사전에 감지하는 것이 시스템 안정성의 핵심입니다.

핵심 튜닝 파라미터 및 모니터링 지표

  • 선출 타임아웃(Election Timeout): Raft의 경우 이 값을 너무 짧게 설정하면 네트워크 일시적 불안정 시 불필요한 리더 선거가 빈번히 발생합니다. 너무 길게 설정하면 장애 복구 시간이 길어집니다. 평균 네트워크 RTT의 10배 정도에서 시작하여 조정하는 것이 일반적입니다.
  • 하트비트 간격(Heartbeat Interval): 선출 타임아웃보다 확실히 짧아야 합니다(일반적으로 1/5 ~ 1/10). 하트비트 간격을 줄이면 리더 선출이 빨라지지만 네트워크 부하가 증가합니다.
  • 쿼럼 크기(Quorum Size): N개의 노드 중 (N/2 + 1) 이상이 동의해야 합의가 성립합니다. 노드 수를 늘려 내구성을 높일 수 있지만, 쓰기 성능은 각 노드의 응답을 기다려야 하므로 저하될 수 있습니다.
  • 모니터링 필수 지표:
    • 리더 존재 여부선거 턴(Term) 번호의 안정성.
    • 로그 복제 지연 시간: 팔로워 노드의 로그가 리더보다 얼마나 뒤쳐져 있는지.
    • 커밋 인덱스 진행 속도: 초당 커밋되는 로그 항목 수.
    • RPC 요청 지연 시간 및 에러율 (AppendEntries, RequestVote).

주의사항 및 운영상의 함정

합의 프로토콜을 연구하고 구현할 때는 이론과 실제 운영 환경의 괴리에 주의해야 합니다. 교과서적인 알고리즘은 이상적인 네트워크를 가정하지만, 실제 프로덕션 환경에서는 예측 불가능한 지연, 패킷 손실, 시계 동기화 오차 등이 항상 존재합니다.

  • 시계 동기화(Clock Synchronization): Raft의 타임아웃은 논리적 시간이 아닌 실제 물리적 시계에 의존합니다. 노드 간의 시계 차이(Skew)가 크면 정상적인 노드가 리더로부터 하트비트를 받았음에도 불구하고 타임아웃으로 잘못 판단하여 불필요한 선거를 시작할 수 있습니다. NTP(Network Time Protocol)를 통한 엄격한 시계 동기화는 필수 운영 조건임.
  • 로그 압축과 스냅샷: 로그가 무한정 커질 수 없습니다. 주기적으로 스냅샷을 생성하고 그 이전의 로그를 잘라내는 로그 압축(Log Compaction) 메커니즘을 반드시 구현해야 합니다. 스냅샷 전송 중에도 새로운 로그 항목이 도착할 수 있으므로, 일관성을 해치지 않는 세밀한 동기화 제어가 필요합니다.
  • 브레인 스플릿(Brain Split) 방지: 네트워크 분할 시 두 개의 리더가 생기는 현상을 방지하는 것이 합의 프로토콜의 존재 이유입니다. 그러나 구성 변경 중이나 클라이언트 라이브러리의 잘못된 라우팅 정책으로 인해 여전히 발생할 수 있습니다. 이를 감지하기 위해 외부적인 리더 선출 감시 시스템이나, 지리적으로 분리된 제3의 아비터(Arbiter) 노드를 활용하는 전략을 고려해야 합니다.

전문가 팁: 성능과 일관성의 최적 균형점 찾기
모든 읽기/쓰기에 강한 일관성을 요구하는 것은 비용이 큽니다. 비즈니스 로직을 분석하여 정말로 강한 일관성이 필요한 ‘핵심 트랜잭션’과 최종 일관성으로 충분한 ‘참조 데이터’를 식별하십시오. 예를 들어, 사용자 계정 잔고 변경(쓰기)는 Raft를 통해 강한 일관성으로 처리하되, 해당 사용자의 최근 활동 로그 목록(읽기)은 최종 일관성 모드로 조회하도록 애플리케이션 계층에서 라우팅하는 전략을 적용할 수 있습니다. 이렇게 혼합된 일관성 모델(Mixed Consistency Model)을 설계하면 시스템 전체의 처리량을 획기적으로 높이면서도 비즈니스 무결성을 보장할 수 있습니다. 또한, 합의 프로토콜의 성능은 디스크 I/O 속도에 크게 의존합니다. WAL(Write-Ahead Log)를 위한 전용 고성능 SSD 사용은 지연 시간을 안정적으로 낮추는 가장 효과적인 인프라 투자 중 하나입니다.