Paxos
Paxos (합의 알고리즘)
1. 개요
Paxos는 비동기 네트워크 환경에서 여러 개의 노드가 하나의 값에 대해 합의(Consensus)를 이룰 수 있도록 설계된 분산 컴퓨팅 알고리즘이다.
분산 시스템에서는 네트워크 지연, 패킷 손실, 혹은 일부 노드의 장애(Crash)가 빈번하게 발생한다. 이러한 환경에서 시스템의 일관성을 유지하기 위해서는 모든 정상 노드가 동일한 상태를 공유해야 하며, 이를 위해 '합의' 과정이 필수적이다. Paxos는 일부 노드에 장애가 발생하더라도 시스템 전체가 중단되지 않고 올바른 결정을 내릴 수 있는 결함 허용(Fault Tolerance) 능력을 제공하며, 특히 '비잔틴 장애(Byzantine Fault, 악의적인 데이터 조작)'가 없는 환경에서 강력한 일관성을 보장한다.
2. 동작 원리 및 프로세스
2.1 역할 정의
Paxos 알고리즘 내에서 각 노드는 다음과 같은 세 가지 역할을 수행할 수 있다. 한 노드가 여러 역할을 동시에 수행하는 것이 일반적이다.
| 역할 | 정의 | 주요 책임 | 상태 관리 |
|---|---|---|---|
| Proposer | 제안자 | 클라이언트의 요청을 받아 합의할 값을 제안함 | 제안 번호(Proposal Number) 관리 |
| Acceptor | 수락자 | 제안된 값을 검토하고 수락 여부를 결정함 | 수락한 가장 높은 제안 번호 및 값 저장 |
| Learner | 학습자 | 합의된 최종 값을 전달받아 자신의 상태에 반영함 | 최종 합의 값 기록 |
2.2 2단계 합의 메커니즘 (Basic Paxos)
Paxos는 제안-수락의 2단계 과정을 통해 합의에 도달한다.
Phase 1: Prepare (준비 단계)
- Prepare Request: Proposer는 이전에 사용된 그 어떤 제안 번호보다도 큰, 고유하고 증가하는 제안 번호(
n)를 생성하여 과반수(Quorum)의 Acceptor에게 전송한다. - Promise: Acceptor는 수신한
n이 이전에 받은 어떤 제안 번호보다 크다면, 앞으로n보다 작은 번호의 제안은 거절하겠다는 약속(Promise)을 보낸다. 이 제약 조건은 새로운 제안자가 이전의 합의 내용을 무시하지 못하게 함으로써 Paxos의 안전성을 보장하는 핵심 장치이다. 이때 이전에 수락했던 값이 있다면 그 값과 번호를 함께 응답한다.
Phase 2: Accept (수락 단계)
- Accept Request: Proposer는 과반수의 Promise를 받으면, 제안할 값(
v)을 결정한다. 이때 수신한 Promise 응답 중 가장 높은 제안 번호(n)와 함께 전달된 값(v)을 선택하며, 만약 전달된 값이 없다면 임의의 값을 선택한다. 이후 이를 Acceptor들에게 전송한다. - Accepted: Acceptor는 자신이 약속한 번호보다 큰 제안이 오지 않았다면, 해당 값을 수락하고 Learner에게 알린다.
2.3 메시지 흐름도
sequenceDiagram
participant P as Proposer
participant A as Acceptors (Quorum)
participant L as Learner
Note over P, A: Phase 1: Prepare
P->>A: Prepare(n)
A-->>P: Promise(n, [prev_v])
Note over P, A: Phase 2: Accept
P->>A: Accept(n, v)
A-->>L: Accepted(n, v)
Note over L: Value v is chosen
3. 안전성과 생존성 (Safety & Liveness)
3.1 안전성 (Safety)
Paxos의 핵심은 "한 번 합의된 값은 절대 바뀌지 않는다"는 안전성을 보장하는 것이다. - 과반수 원칙(Quorum): 어떤 두 과반수 집합은 반드시 최소 한 개의 공통 노드를 가진다. 이 공통 노드가 이전 합의 내용을 기억하고 전달함으로써, 새로운 제안자가 이전의 합의 내용을 무시하고 다른 값을 제안하는 것을 방지한다.
3.2 생존성 (Liveness)
생존성은 "결국에는 어떤 값으로든 합의에 도달해야 한다"는 성질이다. Paxos는 안전성은 완벽히 보장하지만, 특정 상황에서 생존성 문제가 발생할 수 있다. 특히 비동기 네트워크 환경에서는 단 하나의 노드만 고장 나더라도 결정론적인 합의에 도달하는 것이 불가능하다는 FLP Impossibility(FLP 불가능성 정리)에 따라, Paxos 역시 최악의 경우 합의가 지연될 수 있다.
3.3 Livelock 발생 상황과 해결책
Livelock(라이브락)은 두 개 이상의 Proposer가 서로 더 높은 제안 번호로 계속해서 Prepare 요청을 보내, 서로의 제안을 무효화하며 무한 루프에 빠지는 현상을 말한다.
-
발생 시나리오:
- Proposer A가
n=1로 Prepare 전송 $\rightarrow$ Acceptor들이 Promise. - 그 사이 Proposer B가
n=2로 Prepare 전송 $\rightarrow$ Acceptor들이 Promise (A의n=1무효화). - Proposer A가
n=3으로 다시 Prepare 전송 $\rightarrow$ Acceptor들이 Promise (B의n=2무효화). - 이 과정이 반복되어
Accept단계로 진입하지 못함.
- Proposer A가
-
해결책:
- 지수 백오프(Exponential Backoff): 충돌 발생 시 무작위 대기 시간을 부여하여 제안 시점을 분산시킨다.
- 단일 리더 선출(Distinguished Proposer): 시스템 내에서 단 한 명의 Proposer(리더)만 제안권을 갖도록 하여 충돌을 원천 차단한다. (Multi-Paxos의 핵심)
4. Paxos의 변형 및 확장: Multi-Paxos
Basic Paxos는 단 하나의 값에 대해서만 합의하므로, 실제 시스템의 로그(Log)나 상태 머신 복제(State Machine Replication)에 사용하기에는 오버헤드가 너무 크다. 이를 해결한 것이 Multi-Paxos이다.
4.1 Multi-Paxos의 최적화
Multi-Paxos는 리더(Distinguished Proposer)를 선출하여 성능을 최적화한다. Basic Paxos에서는 매 값마다 Prepare $\rightarrow$ Promise $\rightarrow$ Accept $\rightarrow$ Accepted 과정을 거쳐야 하지만, Multi-Paxos는 리더가 한 번 선출되면 해당 리더가 모든 슬롯에 대해 Phase 1(Prepare)을 미리 완료한 것으로 간주한다. 따라서 이후의 제안들은 Phase 1을 생략하고 즉시 Phase 2(Accept)로 진입하여 네트워크 왕복 횟수(RTT)를 절반으로 줄인다.
4.2 로그 복제 과정
- 리더 선출: 노드들이 합의하여 한 명의 리더를 정한다. 이 리더는 한동안 모든 제안을 주도한다.
- 로그 슬롯 할당: 리더는 합의해야 할 각 요청에 대해 고유한 로그 인덱스(Slot)를 부여한다.
- 단축된 합의: 리더는 이미 Phase 1을 통과한 상태로 간주되므로, 클라이언트 요청이 오면 즉시
Accept(slot, value)메시지를 Acceptor들에게 보낸다. - 커밋(Commit): 과반수의 Acceptor가 수락하여 해당 슬롯의 값이 Chosen(선택됨) 상태가 되면, 이를 Commit(커밋) 하여 상태 머신에 적용하고 Learner(및 클라이언트)에게 알린다.
- 로그 일관성: 만약 리더가 교체되면, 새 리더는 비어있거나 확정되지 않은 이전 슬롯들을 모두 확인하여 합의를 마무리하는 과정을 거친다.
5. Raft와의 비교
Paxos의 복잡한 논리 구조와 구현의 어려움을 해결하기 위해 등장한 것이 Raft 알고리즘이다. Raft는 '이해 가능성(Understandability)'을 최우선 목표로 설계되었다.
| 비교 항목 | Paxos | Raft |
|---|---|---|
| 설계 목표 | 수학적 증명 및 효율성 | 이해 가능성 및 구현 용이성 |
| 구조 | 대칭적 (역할 분담 가능) | 강한 리더 중심 (Strong Leader) |
| 리더 선출 | 명시적이지 않음 (Multi-Paxos에서 추가) | 하트비트 기반의 명시적 선출 과정 존재 |
| 로그 복제 | 슬롯별 독립적 합의 가능 (Out-of-order) | 순차적 로그 복제 (Strictly Sequential) |
| 복잡도 | 매우 높음 (구현체마다 세부 동작 다름) | 상대적으로 낮음 (명세가 명확함) |
6. 실제 적용 사례
Paxos 및 그 변형 알고리즘은 높은 신뢰성이 필요한 대규모 인프라의 핵심 컴포넌트에 사용된다.
- Google Chubby: 구글의 분산 락 서비스(Lock Service)로, Paxos를 기반으로 구현되어 클러스터 내의 마스터 선출 및 설정 정보 공유를 관리한다.
- Apache ZooKeeper (ZAB): ZAB(ZooKeeper Atomic Broadcast) 프로토콜은 Paxos의 아이디어를 차용하여 구현되었다. 엄격한 순서 보장과 고성능 복제를 위해 Paxos를 최적화한 형태이다.
- Google Spanner: 전 세계적으로 분산된 데이터베이스인 Spanner는 데이터 샤드(Shard) 간의 일관성을 유지하기 위해 Paxos 그룹을 사용하여 복제본 간의 합의를 수행하며, 이를 통해 강력한 일관성(Strong Consistency)을 제공한다.
- Cassandra: 경량 합의 프로토콜(LWT, Lightweight Transactions)을 구현하기 위해 Paxos를 사용하여 데이터 업데이트 시 충돌을 방지한다.
이 문서는 AI 모델(gemma-4-31b)에 의해 생성된 콘텐츠입니다.
주의사항: AI가 생성한 내용은 부정확하거나 편향된 정보를 포함할 수 있습니다. 중요한 결정을 내리기 전에 반드시 신뢰할 수 있는 출처를 통해 정보를 확인하시기 바랍니다.