맨위로가기

팩소스 (컴퓨터 과학)

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

팩소스(Paxos)는 1980년대 후반 레슬리 램포트에 의해 고안된 분산 시스템에서 합의 문제를 해결하기 위한 알고리즘이다. 팩소스는 프로세서, 네트워크, 역할, 안전성 및 생존성 속성을 기반으로 하며, 베이직 팩소스, 멀티 팩소스, 패스트 팩소스, 일반화된 팩소스, 비잔틴 팩소스 등 다양한 변형이 존재한다. 팩소스는 구글, 아마존, IBM, 마이크로소프트 등 다양한 기업의 분산 시스템에서 실제 구현 사례를 찾아볼 수 있으며, 데이터베이스 및 분산 시스템의 데이터 일관성을 유지하는 데 기여한다.

더 읽어볼만한 페이지

  • 분산 알고리즘 - 병렬 알고리즘
    병렬 알고리즘은 여러 프로세서가 동시에 문제를 해결하도록 설계되었으며, 병렬화 가능성에 따라 분류되고 통신 오버헤드와 부하 분산이 중요하며, 다양한 하드웨어에서 구현될 수 있다.
  • 분산 알고리즘 - 콘텐츠 전송 네트워크
    콘텐츠 전송 네트워크(CDN)는 지리적으로 분산된 서버 네트워크를 이용하여 사용자에게 콘텐츠를 효율적으로 전송하는 시스템으로, 엣지 서버 캐싱, 데이터 전송 시간 단축, 대역폭 비용 절감, 가용성 향상 등의 이점을 제공하지만 보안 및 개인 정보 보호, 특정 업체 의존성 등의 과제도 존재한다.
  • 장애 허용 컴퓨터 시스템 - 컴퓨터 클러스터
    컴퓨터 클러스터는 여러 대의 상용 컴퓨터를 고속 네트워크로 연결하여 고성능 컴퓨팅 시스템을 구축하는 방식으로, 슈퍼컴퓨터를 포함한 다양한 분야에서 높은 가용성과 확장성을 제공하며, 클러스터 미들웨어를 통해 시스템 관리, 부하 분산, 통신 방식, 데이터 공유 등을 지원하고 노드 장애 관리를 위한 펜싱 기술을 활용한다.
  • 장애 허용 컴퓨터 시스템 - 트랜잭션 처리
    트랜잭션 처리는 데이터베이스 시스템에서 데이터의 일관성과 무결성을 보장하기 위한 기술이며, ACID 속성을 통해 데이터 정확성을 유지하고 롤백, 데드락 처리 등의 기술을 활용한다.
  • 분산 컴퓨팅 - 클라우드 컴퓨팅
    클라우드 컴퓨팅은 인터넷을 통해 컴퓨팅 자원을 서비스 형태로 제공하는 모델로, 다양한 서비스 및 배치 모델을 가지며 비용 효율성과 확장성을 제공하지만 보안 및 의존성 문제도 존재하며 지속적으로 발전하고 있다.
  • 분산 컴퓨팅 - 그리드 컴퓨팅
    그리드 컴퓨팅은 지리적으로 분산된 컴퓨터 자원을 연결하여 가상 슈퍼컴퓨터를 구축하는 기술이며, 유휴 자원을 활용하고 과학 연구 등 다양한 분야에 활용된다.
팩소스 (컴퓨터 과학)
개요
유형합의 알고리즘
문제분산 합의
해결책내결함성
발명가레슬리 램포트
발표 년도1989년 (초안), 1998년 (공식 발표)
영감을 준 것그리스의 팍소스 섬의 의사 결정 과정
특징
합의 보장안정적인 환경에서 합의 보장
비동기 시스템에서 합의 보장
내결함성비잔틴 결함 허용
액티브 복제 지원
주요 용도분산 데이터베이스
클라우드 컴퓨팅
블록체인
기본 원리
역할제안자 (Proposer)
수락자 (Acceptor)
학습자 (Learner)
메시지 교환제안 (Propose)
약속 (Promise)
수락 (Accept)
학습 (Learn)
합의 과정제안자가 제안을 준비하고 수락자에게 보냄
수락자는 제안을 평가하고 약속 또는 거부
제안자는 수락자 과반수의 약속을 받으면 수락 요청
수락자는 제안을 수락하고 학습자에게 알림
학습자는 합의된 값을 학습
변형
Multi-Paxos여러 개의 합의를 순차적으로 처리
Raft이해하기 쉽게 단순화된 Paxos 알고리즘
Fast Paxos성능 향상을 위한 Paxos 변형
Cheap Paxos자원 효율성을 높인 Paxos 변형
장점 및 단점
장점강력한 합의 알고리즘
분산 시스템의 안정성 및 신뢰성 향상
단점복잡한 구현
성능 저하 가능성
참고 자료
관련 논문Reaching Agreement in the Presence of Faults (논문 링크)
Time, Clocks and the Ordering of Events in a Distributed System (논문 링크)
The Part-Time Parliament (논문 링크)
Fast Paxos (논문 링크)
Generalized Consensus and Paxos (논문 링크)
Practical Byzantine Fault Tolerance (논문 링크)
관련 서적Implementing Fault-Tolerant Services Using the State Machine Approach: A Tutorial (서적 링크)

2. 역사

팩소스 알고리즘은 1980년대 후반 레슬리 램포트에 의해 처음 고안되었으며, 분산 시스템에서 합의 문제를 해결하는 데 있어 중요한 이정표를 세웠다.[26] 팩소스는 1988년 린치, 드워크, 스톡마이어의 연구와 오키와 리스코프의 뷰 스탬프 복제(viewstamped replication)와 같은 선행 연구에 기반을 두고 있다. 팩소스는 특히 우아한 형식론을 제공했으며, 내결함성 분산 합의 프로토콜에 대한 초기 안전성 증명 중 하나를 포함했다.

램포트, 말키, 그리고 저우의 논문에서 팩소스 프로토콜과 관련된 내용이 자세히 설명되어 있다. 팩소스 프로토콜은 크래시 실패 시 균일한 합의로 형식화된 문제에 대한 이론적 솔루션 클래스의 구성원이다. 이 문제에 대한 하한은 케이더와 슈레어에 의해 증명되었다. 클라우드 규모의 상태 머신 복제를 위한 C++ 소프트웨어 라이브러리인 데레초는 자체 관리 가상 동기 멤버십과 통합된 팩소스 프로토콜을 제공한다. 이 프로토콜은 케이더와 슈레어의 최적 경계와 일치하며, 최신 원격 DMA (RDMA) 데이터센터 하드웨어에 효율적으로 매핑된다 (하지만 RDMA를 사용할 수 없는 경우 TCP를 사용한다).

2. 1. 한국 IT 환경에의 적용

3. 전제

팩소스 알고리즘은 다음과 같은 전제를 기반으로 한다.:3-4


  • 프로세서:
  • 프로세서는 임의의 속도로 동작하며, 실패할 수 있다.[1]
  • 안정적인 저장소를 가진 프로세서는 실패 후 프로토콜에 다시 참여할 수 있다.[1]
  • 프로세서는 담합, 거짓말, 또는 프로토콜을 파괴하려는 시도를 하지 않는다. (즉, 비잔틴 오류는 발생하지 않는다.)[1]
  • 네트워크:
  • 프로세서 간 메시지 전송은 비동기적으로 이루어지며, 전달 시간은 임의적이다.[1]
  • 메시지는 손실, 순서 변경, 중복될 수 있지만, 손상되지는 않는다.[1]
  • 메시지 채널 내의 임의/악의적 행위로 인한 오염된 메시지에 대한 해법은 비잔틴 팩소스를 참조한다.


일반적으로, 합의 알고리즘은 2F+1개의 프로세서가 있을 때 F개의 프로세서가 실패해도 시스템은 정상 작동한다.[1] 즉, 비결함 프로세스 수가 결함 프로세스 수보다 반드시 많아야 한다. 그러나 재구성을 사용하면, 동시에 F개 이하의 프로세서가 고장나는 한, 총 고장 수에 상관없이 작동하는 프로토콜을 사용할 수 있다.

4. 역할

팩소스는 프로세서의 행동을 프로토콜 상의 그들의 역할(클라이언트, 수락자, 제안자, 학습자, 리더)에 따라 설명한다. 일반적인 구현에서 단일 프로세서는 하나 이상의 역할을 동시에 수행한다. 이것은 프로토콜의 정확성에 영향을 미치지 않는다. (일반적으로 프로토콜 내 메시지 지연이나 횟수를 향상시키기 위해 역할을 결합한다.)

; 클라이언트

:: 클라이언트는 ''요청'' 을 분산 시스템에 게시하고, ''응답''을 기다린다. 분산 파일 서버 안에 있는 파일 쓰기 요청을 예로 들 수 있다.

:; 수락자(유권자)

:: 수락자는 프로토콜의 장애 허용 "메모리"로 동작한다. 그룹 내 모인 수락자는 쿼럼이라고 불린다. 수락자에게 보내진 메시지는 반드시 수락자들의 쿼럼에 보내져야한다. 쿼럼의 수락자로 받은 복사본 외 수락자로부터 받은 메시지는 무시된다.

:; 제안자

:: 제안자는 클라이언트를 대변하며 수락자에게 동의하도록 설득을 시도하고 옹호한 클라이언트 요청을 설득하고 충돌이 발생할 경우 프로토콜을 진전시키기 위해 중재자처럼 행동한다.

:; 학습자

:: 학습자는 프로토콜을 위한 응답 요소로 행동한다. 클라이언트의 요청이 수락자에 의해 동의되면 학습자는 움직인다 (즉, 요청을 실행하고 클라이언트에게 응답을 보낸다). 처리의 가용성을 높이기 위해 추가적인 학습자를 추가할 수 있다.

:; 리더

:: 팩소스는 진행을 위해 식별 가능한 제안자(리더)를 필요로 한다. 많은 프로세스가 자신이 리더라고 믿을 수 있지만, 프로토콜은 그들 중 하나가 선택될 때만 진행을 보장한다. 만약 두 프로세스가 그들이 리더라고 믿는다면, 그들은 지속적으로 충돌하는 업데이트를 제안하여 프로토콜을 지연시킬 수 있다. 하지만 이 경우에도 안전성은 유지된다.

대부분의 팩소스 배포에서, 각 참여 프로세스는 제안자, 수락자 및 학습자의 세 가지 역할을 수행합니다. 이렇게 하면 정확성을 훼손하지 않으면서 메시지 복잡성이 크게 줄어듭니다.

역할을 병합함으로써 프로토콜은 데이터베이스 커뮤니티에서 전형적인 효율적인 클라이언트-마스터-복제 스타일 배포로 "축소"됩니다. 팩소스 프로토콜(병합된 역할을 가진 구현 포함)의 장점은 안전성 속성을 보장한다는 것입니다.

일반적인 구현의 메시지 흐름은 Multi-Paxos 섹션에서 다룹니다.

4. 1. 클라이언트 (Client)

클라이언트는 분산 시스템에 요청을 보내고 응답을 기다린다. 분산 파일 서버에 파일 쓰기 요청을 하는 것이 그 예이다. 팩소스에서 클라이언트는 리더에게 명령을 보낸다.

4. 2. 제안자 (Proposer)

제안자는 클라이언트를 대신하여 수락자(Acceptor)에게 동의를 얻도록 설득하고, 클라이언트 요청을 옹호하며, 충돌 발생 시 프로토콜을 진행시키기 위한 중재자 역할을 수행한다. 팩소스는 진행을 위해 식별 가능한 제안자인 리더(Leader)를 필요로 한다. 대부분의 팩소스 배포에서 각 참여 프로세스는 제안자, 수락자, 학습자(Learner)의 세 가지 역할을 모두 수행하여 메시지 복잡성을 줄인다.

팩소스에서 제안자는 "나는 리더다" (또는 "제안자 X가 리더다")를 제안할 수 있다.[2] 팩소스의 합의 및 유효성 보장에 따라, 과반수에 의해 수락되면 제안자는 다른 모든 노드에 리더로 알려지게 된다.[3]

4. 3. 수락자 (Acceptor)

수락자(Acceptor)는 팩소스 프로토콜에서 제안자(Proposer)로부터 제안을 받아 수락 여부를 결정하며, 프로토콜의 장애 허용 "메모리"로 동작한다. 수락자 그룹은 쿼럼(Quorum)을 형성하며, 쿼럼은 일반적으로 과반수의 수락자로 구성된다. 예를 들어, 수락자 집합 {A, B, C, D}가 주어졌을 때, 주요 쿼럼은 적어도 세 개의 수락자를 포함해야 한다.

수락자에게 보내진 메시지는 반드시 수락자들의 쿼럼에 보내져야 하며, 쿼럼의 수락자로부터 받은 복사본 외 수락자로부터 받은 메시지는 무시된다. 쿼럼은 결과에 대한 정보를 유지하는 것을 보장하여 팩소스의 안전성을 확보한다.

일반적으로 각 수락자의 가중치가 다를 수 있으며, 이런 경우 쿼럼은 전체 수락자 가중치의 절반보다 큰 가중치를 가진 수락자들의 집합으로 정의될 수 있다.

4. 4. 학습자 (Learner)

학습자(Learner)는 프로토콜의 응답 요소로 행동한다. 클라이언트의 요청이 수락자(Acceptor)에 의해 합의되면, 학습자는 요청을 실행하고 클라이언트에게 응답을 보내는 등의 동작을 수행한다. 처리 가용성을 높이기 위해 추가적인 학습자를 둘 수 있다. 대부분의 팩소스 배포에서 각 참여 프로세스는 제안자(Proposer), 수락자 및 학습자의 세 가지 역할을 수행한다.

5. 안전성과 생존성 속성

팩소스는 다음과 같은 안전성과 생존성 속성을 보장한다.


  • 유효성 (또는 비자명성): 제안된 값만이 선택 받고 학습될 수 있다.
  • 일치 (또는 일관성, 안전성): 단 하나의 값만이 학습될 수 있다. 즉, 다른 두 학습자는 서로 다른 값을 배울 수 없다.
  • 종결 (또는 생존성): 충분한 프로세서가 정상 작동 중일 때 어떤 값이 제안되면 학습자는 결국 어떤 값을 학습한다.


팩소스는 "안전성"(또는 "일관성")을 보장하기 위해 세 가지 속성을 정의하며, 장애 패턴에 관계없이 처음 두 가지가 항상 유지되도록 한다.

팩소스는 종료를 보장하지 않으므로 활성 속성이 없다. 이는 Fischer Lynch Paterson (FLP) 불가능성 결과에 의해 뒷받침되는데, 이 결과는 일관성 프로토콜이 "안전성", "활성", "결함 허용 오차" 중 두 가지만 가질 수 있다는 것이다. 팩소스는 결함 허용 오차를 보장하는 데 중점을 두고 안전성을 보장하므로 활성 또한 보장할 수 없다.

팩소스(Paxos)는 안전성을 보장하기 위해 3가지 안전성 특성을 정의하며, 어떠한 장애 패턴에도 불구하고 이를 반드시 준수하도록 보장한다.

;비자명성: 제안된 값만 습득된다.[23]

;완전성: 최대 하나의 값만 습득 가능하다. (즉, 두 개의 습득 노드가 서로 다른 값을 습득하는 경우는 없다)[23][24]

;활성(C;L): 만약 값 C가 제안되었다면, 습득 노드 L은 어떠한 값을 습득한다. (단, 충분한 수의 프로세서가 장애를 일으키지 않은 경우)[24]

5. 1. 안전성 (Safety)

팩소스는 안전성을 보장하기 위해 3가지 속성을 정의하며, 실패 패턴과 관계없이 처음 두 가지 속성이 항상 유지되도록 한다.[23]

  • 유효성 (Validity): 제안된 값만이 선택될 수 있다.[23]
  • 일치 (Agreement): 단 하나의 값만이 학습될 수 있다. 즉, 다른 두 학습자는 서로 다른 값을 배울 수 없다.[23][24]

5. 2. 생존성 (Liveness)

팩소스는 종결(Termination)을 보장하지 않으므로 활성 속성이 없다. 이는 Fischer Lynch Paterson (FLP) 불가능성 결과[24]에 의해 뒷받침되는데, 이 결과는 일관성 프로토콜이 "안전성", "활성", "결함 허용 오차" 중 두 가지만 가질 수 있다는 것이다. 팩소스는 결함 허용 오차를 보장하는 데 중점을 두고 안전성을 보장하므로 활성 또한 보장할 수 없다.[23][24] 충분한 프로세서가 정상 작동 중일 때 어떤 값이 제안되면 학습자는 결국 어떤 값을 학습한다.[24]

6. 베이직 팩소스 (Basic Paxos)

베이직 팩소스 프로토콜은 팩소스 계열 중 가장 기본적인 프로토콜이다. 베이직 팩소스 프로토콜의 각 "인스턴스"(또는 "실행")는 단일 출력 값을 결정한다. 이 프로토콜은 여러 라운드에 걸쳐 진행되며, 성공적인 라운드는 2단계로 구성된다.

== 1단계: 준비 (Prepare) ==

제안자는 제안 번호로 쓰기 위한 숫자 ''N''을 선택하며, 이 숫자는 이전의 제안 번호들보다 커야 한다. 제안자는 ''N''을 포함한 ''준비'' 요청을 수락자들의 쿼럼에 보낸다. 제안자는 쿼럼을 구성할 만큼 충분한 수락자와 통신할 수 없다면 Paxos를 시작해서는 안 된다.

수락자들은 제안자로부터 ''준비'' 요청을 기다린다. 만약 수락자가 ''준비'' 요청을 받았을 경우, 수락자는 반드시 받은 ''준비'' 요청의 식별 번호 ''N''을 확인해야 한다.

두 가지 경우가 있을 수 있다:


  • ''N''이 이전에 제안자들로부터 수락자가 받은 어떤 제안 번호들보다 높은 경우, 수락자는 제안자에게 n보다 크지 않은 제안 번호(더 오래된 제안 번호)를 허용하지 않겠다는 ''약속''으로 응답한다. 이전에 수락한 제안이 있을 경우, 이전에 수락한 제안 번호 ''M''과 대응하는 승인된 값 ''W''는 제안자에 대한 응답에 반드시 포함되어야 한다.
  • ''N''이 이전에 제안자로부터 수락자가 받은 제안 번호보다 작거나 같은 경우, 수락자는 받은 요청을 무시할 수 있다. 응답하지 않아도 팩소스는 동작하나 최적화를 위해 제안 번호 n으로 합의를 만들려는 시도를 멈추도록 거절 (''NAK'') 응답을 보내 제안자에게 알려주는 것이 좋다.


''약속(Promise)'' 메시지에서 반환되는 값은 제안이 처음 이루어질 때 "null"이다 (이 라운드에서 어떤 수용자도 이전에 값을 수락한 적이 없기 때문).

1명의 클라이언트, 1명의 제안자, 3명의 승인자(쿼럼 크기는 3) 및 2명의 학습자를 보여주는 그림. 첫 번째 라운드가 성공적인 경우(네트워크에서 프로세스에 오류가 없음)를 나타낸다.


== 2단계: 수락 (Accept) ==

제안자는 수락자 쿼럼으로부터 충분한 "약속"을 받으면, 제안 값 ''V''를 선택하여 수락자 쿼럼에 "수락" 요청을 보낸다. 이전에 승인된 값을 받았다면 제안자는 승인된 값 중에서 ''V'' 값을 선택해야 하고, 전달받은 승인된 값이 없다면 원하는 값을 ''V''로 선택할 수 있다. 제안자는 선택한 값 ''V''와 제안 번호 ''N''을 포함한 "수락" 메시지 ''(N, V)''를 수락자 쿼럼에 보낸다.

수락자는 제안자로부터 ''수락'' 메시지 ''(N, V)''를 받으면, 제안 번호 ''N''이 마지막으로 약속한 제안 번호와 같은지 확인한다. 만약 같다면, 수락자는 값 ''V''를 수락하고, "수락됨" 메시지를 제안자와 모든 학습자에게 보낸다. 마지막으로 약속한 제안번호가 아니라면 수락자는 받은 메시지를 무시하거나 거절(''Nack'') 응답을 보낼 수 있다.

합의는 과반수의 수락자가 동일한 식별자 번호를 수락할 때 달성된다. 각 식별자는 제안자에게 고유하며 식별자당 하나의 값만 제안될 수 있으므로, 동일한 식별자를 수락하는 모든 수락자는 동일한 값을 수락하게 된다.

6. 1. 1단계: 준비 (Prepare)

제안자는 제안 번호로 쓰기 위한 숫자 ''N''을 선택하며, 이 숫자는 이전의 제안 번호들보다 커야 한다. 제안자는 ''N''을 포함한 ''준비'' 요청을 수락자들의 쿼럼에 보낸다. 제안자는 쿼럼을 구성할 만큼 충분한 수락자와 통신할 수 없다면 Paxos를 시작해서는 안 된다.

수락자들은 제안자로부터 ''준비'' 요청을 기다린다. 만약 수락자가 ''준비'' 요청을 받았을 경우, 수락자는 반드시 받은 ''준비'' 요청의 식별 번호 ''N''을 확인해야 한다.

두 가지 경우가 있을 수 있다:

  • ''N''이 이전에 제안자들로부터 수락자가 받은 어떤 제안 번호들보다 높은 경우, 수락자는 제안자에게 n보다 크지 않은 제안 번호(더 오래된 제안 번호)를 허용하지 않겠다는 ''약속''으로 응답한다. 이전에 수락한 제안이 있을 경우, 이전에 수락한 제안 번호 ''M''과 대응하는 승인된 값 ''W''는 제안자에 대한 응답에 반드시 포함되어야 한다.
  • ''N''이 이전에 제안자로부터 수락자가 받은 제안 번호보다 작거나 같은 경우, 수락자는 받은 요청을 무시할 수 있다. 응답하지 않아도 팩소스는 동작하나 최적화를 위해 제안 번호 n으로 합의를 만들려는 시도를 멈추도록 거절 (''NAK'') 응답을 보내 제안자에게 알려주는 것이 좋다.


''약속(Promise)'' 메시지에서 반환되는 값은 제안이 처음 이루어질 때 "null"이다 (이 라운드에서 어떤 수용자도 이전에 값을 수락한 적이 없기 때문).

6. 2. 2단계: 수락 (Accept)

제안자는 수락자 쿼럼으로부터 충분한 "약속"을 받으면, 제안 값 ''V''를 선택하여 수락자 쿼럼에 "수락" 요청을 보낸다. 이전에 승인된 값을 받았다면 제안자는 승인된 값 중에서 ''V'' 값을 선택해야 하고, 전달받은 승인된 값이 없다면 원하는 값을 ''V''로 선택할 수 있다. 제안자는 선택한 값 ''V''와 제안 번호 ''N''을 포함한 "수락" 메시지 ''(N, V)''를 수락자 쿼럼에 보낸다.

수락자는 제안자로부터 ''수락'' 메시지 ''(N, V)''를 받으면, 제안 번호 ''N''이 마지막으로 약속한 제안 번호와 같은지 확인한다. 만약 같다면, 수락자는 값 ''V''를 수락하고, "수락됨" 메시지를 제안자와 모든 학습자에게 보낸다. 마지막으로 약속한 제안번호가 아니라면 수락자는 받은 메시지를 무시하거나 거절(''Nack'') 응답을 보낼 수 있다.

합의는 과반수의 수락자가 동일한 식별자 번호를 수락할 때 달성된다. 각 식별자는 제안자에게 고유하며 식별자당 하나의 값만 제안될 수 있으므로, 동일한 식별자를 수락하는 모든 수락자는 동일한 값을 수락하게 된다.

7. 멀티 팩소스 (Multi-Paxos)

멀티 팩소스는 베이직 팩소스를 확장하여 일련의 값에 대한 합의를 효율적으로 처리하는 프로토콜이다. 팩소스의 일반적인 적용법에서는 연속된 합의 값이 분산 상태 기계에 대한 명령처럼 동작하길 요구한다. 각 명령이 베이직 팩소스 프로토콜의 단일 인스턴스의 결과라면, 상당량의 오버헤드가 발생한다.

하지만 리더가 비교적 안정적이면 1단계(준비, 약속)는 불필요해진다. 따라서 미래의 프로토콜 인스턴스이 동일한 리더로 진행된다면 1단계를 생략할 수 있다. 이를 위해 각 라운드에서 같은 리더에 의해 증가되는 라운드 번호 I를 메시지에 넣는다. 멀티 팩소스는 장애 방지 메시지 횟수를 4번에서 2번으로 줄인다.

일반적인 멀티 팩소스의 적용법은 제안자, 수락자 그리고 학습자 역할을 "서버"로 합친다. 따라서 "클라이언트"와 "서버"만이 남는다.

다음 다이어그램은 제안자, 수락자, 학습자 역할이 "서버"로 합쳐진 베이직 팩소스 프로토콜의 첫 인스턴스를 보여준다.

```

Client Servers

| | | | --- First Request ---

X-------->| | | Request

| X->|->| Prepare(N)

| |<-X--X Promise(N, I, {Va, Vb})

| X->|->| Accept!(N, I, Vn)

| X<>X<>X Accepted(N, I)

|<--------X | | Response

| | | |

```

이전 베이직 팩소스 프로토콜 인스턴스들과 같은 리더를 쓰는 베이직 팩소스 프로토콜의 인스턴스들 중 일부는 1단계를 생략할 수 있다.

```

Client Servers

X-------->| | | Request

| X->|->| Accept!(N,I+1,W)

| X<>X<>X Accepted(N,I+1)

|<--------X | | Response

| | | |

8. 패스트 팩소스 (Fast Paxos)

패스트 팩소스(Fast Paxos)는 베이직 팩소스를 일반화하여 종단 간 메시지 지연을 줄인 프로토콜이다. 베이직 팩소스에서는 클라이언트의 요청부터 학습까지 3번의 메시지 지연이 발생하는 반면, 패스트 팩소스는 충돌이 없을 경우 2번의 메시지 지연으로 합의를 이룰 수 있다.

이를 위해 패스트 팩소스는 클라이언트가 리더를 거치지 않고 수락자에게 직접 ''Accept!'' 메시지를 보내도록 허용한다. 수락자는 베이직 팩소스와 마찬가지로 리더와 학습자에게 ''Accepted'' 메시지를 전달하며, 이를 통해 클라이언트에서 학습자까지 2번의 메시지 지연이 발생한다.

하지만 패스트 팩소스는 베이직 팩소스보다 더 많은 수락자(3f+1)를 필요로 한다. 또한, 제안이 충돌하는 경우 복구 과정이 필요하며, 이 과정에서 추가적인 메시지 지연이 발생할 수 있다. 리더가 충돌을 감지하고 중재하는 경우(중재된 복원) 4번의 메시지 지연이, 리더의 중재 없이 수락자들이 자체적으로 복구하는 경우(중재가 없는 복원) 3번의 메시지 지연이 발생한다. (학습자가 수락자 역할을 겸할 경우 2번)

```

클라이언트 리더 수락자 학습자

| | | | | | | |

| X--------->|->|->|->| | | Any(N,I,Recovery)

| | | | | | | |

X------------------->|->|->|->| | | Accept!(N,I,W)

| |<---------X--X--X--X------>|->| Accepted(N,I,W)

|<------------------------------------X--X Response(W)

| | | | | | | |

```

```

클라이언트 리더 수락자 학습자

| | | | | | | | |

| | | | | | | | |

| | | | | | | | | !! 동시 충돌 제안

| | | | | | | | | !! 수락자에 의해 다른 순서로 수신됨

| | | | | | | | | !!

| X--------------?|-?|-?|-?| | | Accept!(N,I,V)

X-----------------?|-?|-?|-?| | | Accept!(N,I,W)

| | | | | | | | |

| | | | | | | | | !! 수락자는 값에 동의하지 않음

| | |<-------X--X->|->|----->|->| Accepted(N,I,V)

| | |<-------|<-|<-X--X----->|->| Accepted(N,I,W)

| | | | | | | | |

| | | | | | | | | !! 충돌 감지 및 복구

| | X------->|->|->|->| | | Accept!(N+1,I,W)

| | |<-------X--X--X--X----->|->| Accepted(N+1,I,W)

|<---------------------------------X--X Response(W)

| | | | | | | | |

```

```

클라이언트 서버

| | | | | |

| | X->|->|->| Any(N,I,Recovery)

| | | | | |

| | | | | | !! 동시적인 상충하는 제안

| | | | | | !! 서버에 서로 다른 순서로 수신됨

| | | | | |

| X--------?|-?|-?|-?| Accept!(N,I,V)

X-----------?|-?|-?|-?| Accept!(N,I,W)

| | | | | |

| | | | | | !! 서버가 값에 대해 동의하지 않음

| | X<>X->|->| Accepted(N,I,V)

| | |<-|<-X<>X Accepted(N,I,W)

| | | | | |

| | | | | | !! 충돌 감지 및 복구

| | X<>X<>X<>X Accepted(N+1,I,W)

|<-----------X--X--X--X Response(W)

| | | | | |

9. 일반화된 팩소스 (Generalized Paxos)

일반화된 팩소스는 복제 상태 머신의 연산과 이를 구현하는 합의 프로토콜 간의 관계를 탐구한다. 주요 발견은 상충하는 제안이 어떤 순서로든 적용될 수 있을 때, 즉 제안된 연산이 상태 머신에 대한 교환 연산일 때 팍소스의 최적화와 관련이 있다. 이러한 경우, 상충하는 연산이 모두 수락될 수 있으며, 충돌 해결 및 거부된 연산의 재제안에 필요한 지연을 피할 수 있다.

일반화된 합의는 분산 상태 기계의 명령과 상태 머신들의 일관성을 유지하기 위해 쓰이는 합의 프로토콜 사이의 관계를 다룬다. 주된 연구는 충돌된 제안이 어떠한 순서로든지 상태 머신에 반영될 수 있을 때의 합의 프로토콜의 최적화를 포함한다. 충돌된 제안의 명령들이 자리 바꿈이 가능한 상태 기계의 명령인 경우이다. 이러한 사례에서 충돌된 명령들은 충돌을 해결하거나 반복 제안, 거절 등에 필요한 지연을 피하기 위해 동시에 수용될 수 있다.

이 개념은 더욱 일반화되어 끊임없이 증가하는 교환 연산 시퀀스로 발전하며, 이 중 일부는 안정된 것으로 알려져 있으며 (따라서 실행될 수 있다). 프로토콜은 이러한 시퀀스를 추적하여 하나의 시퀀스에 속한 모든 제안된 연산이 안정화되기 전에 이와 교환되지 않는 연산이 안정화되는 것을 허용하지 않도록 한다.

일반화된 팩소스는 연산 의미론을 활용하여 충돌을 피할 수 있다. 이를 통해 프로토콜은 실제로 패스트 팩소스보다 더 빠르게 작동할 수 있다. 그러나 충돌이 발생하면 복구를 위해 두 번의 왕복 통신이 추가로 필요하다.

일반적인 경우, 이러한 왕복 통신은 불가피하며 여러 명령이 한 라운드 동안 허용될 수 있다는 사실에서 비롯된다. 이로 인해 충돌이 자주 발생할 경우 이 프로토콜은 팩소스보다 더 많은 비용이 든다. 일반화된 팩소스의 복구 시간을 개선하기 위해 다음과 같은 두 가지 가능한 개선 사항이 있다.


  • 코디네이터가 모든 승인자의 쿼럼에 속하는 경우 (라운드 N을 '중앙 집중식'이라고 함), 라운드 N에서 충돌이 발생하여 라운드 N+1에서 복구하기 위해 코디네이터는 1단계를 건너뛰고 라운드 N 동안 마지막으로 승인한 시퀀스를 2단계에서 제안한다. 이렇게 하면 복구 비용이 한 번의 왕복 통신으로 줄어든다.
  • 라운드 N과 N+1 모두 고유하고 동일한 중앙 집중식 쿼럼을 사용하는 경우, 승인자가 라운드 N에서 충돌을 감지하면 (i) 라운드 N에서 코디네이터가 승인한 시퀀스와 (ii) 라운드 N에서 승인한 가장 큰 비충돌 접두사를 모두 접미사로 하는 시퀀스를 라운드 N+1에서 자발적으로 제안한다. 이 변형을 사용하면 복구 비용이 단일 메시지 지연으로 줄어들어 최적이다. 여기서 라운드에서 고유한 쿼럼을 사용하는 것은 라이브니스에 해를 끼치지 않는다. 이는 이 쿼럼의 모든 프로세스가 다음 라운드의 준비 단계에 대한 읽기 쿼럼이기 때문이다.[4]

10. 비잔틴 팩소스 (Byzantine Paxos)

팩소스는 거짓말, 메시지 조작, 다른 참가자와의 공모, 선택적 불참 등 참가자의 임의적인 오류를 지원하도록 확장될 수 있다. 이러한 유형의 오류는 비잔틴 장애라고 불린다.

리스코프와 카스트로가 도입한 비잔틴 팩소스[5]는 다른 프로세서의 작업을 분배하고 검증하는 역할을 하는 추가 메시지(''증명'')를 추가하여 정보를 분배하고 다른 프로세서의 행동을 증명한다.[27]

```

Client Proposer Acceptor Learner

| | | | | | |

X-------->| | | | | | Request

| X--------->|->|->| | | Accept!(N,I,V)

| | X<>X<>X | | Verify(N,I,V) - BROADCAST

| |<---------X--X--X------>|->| Accepted(N,V)

|<---------------------------------X--X Response(V)

| | | | | | |

```

마틴과 알비시가 소개한 빠른 비잔틴 팍소스[6]는 클라이언트가 명령을 승인자에게 직접 보내기 때문에 지연을 제거한다. 빠른 비잔틴 팍소스에서 ''승인됨'' 메시지는 모든 승인자와 모든 학습자에게 전송되는 반면, 빠른 팍소스는 ''승인됨'' 메시지를 학습자에게만 전송한다.

```

Client Acceptor Learner

| | | | | |

X----->|->|->| | | Accept!(N,I,V)

| X<>X<>X------>|->| Accepted(N,I,V) - BROADCAST

|<-------------------X--X Response(V)

| | | | | |

```

두 프로토콜에서 실패 시나리오는 같다. 각 학습자는 서로 다른 승인자로부터 F+1개의 동일한 메시지를 받기를 기다린다. 수락자는 정보를 공유하기 때문에 학습자의 상태를 예측할 수 있다. 학습자가 F+1개의 동일한 메시지를 받을 수 없는 경우 정상인 수락자는 합의된 값을 다시 브로드캐스팅한다.

```

Client Acceptor Learner

| | | ! | | !! One Acceptor is faulty

X----->|->|->! | | Accept!(N,I,V)

| X<>X<>X------>|->| Accepted(N,I,{V,W}) - BROADCAST

| | | ! | | !! Learners receive 2 different commands

| | | ! | | !! Correct Acceptors notice error and choose

| X<>X<>X------>|->| Accepted(N,I,V) - BROADCAST

|<-------------------X--X Response(V)

| | | ! | |

11. 실제 구현 사례


  • 구글은 장애 발생 시 복제본의 일관성을 유지하기 위해 자사의 분산 록 서비스인 Chubby에서 팩소스 알고리즘을 사용한다.[7] Chubby는 현재 구글 애널리틱스 및 기타 제품에서 사용 중인 빅테이블에서 사용된다. 구글 스패너와 메가스토어는 내부적으로 팩소스 알고리즘을 사용한다.
  • IBM은 자사의 IBM SAN 볼륨 컨트롤러 제품에서 팩소스 알고리즘을 사용하여 클러스터에서 제공하는 스토리지 가상화 서비스의 구성 및 제어 구성 요소를 실행하는 범용 내결함성 가상 머신을 구현하는 것으로 알려져 있다.[8]
  • 마이크로소프트는 빙의 오토파일럿 클러스터 관리 서비스와 Windows Server 장애 조치(Failover) 클러스터링에서 팩소스를 사용한다.[9]
  • WANdisco는 DConE 액티브-액티브 복제 기술 내에 팩소스를 구현했다.[10]
  • XtreemFS는 파일 데이터와 메타데이터의 내결함성 및 일관된 복제를 위해 팩소스 기반의 리스 협상 알고리즘을 사용한다.[11]
  • Heroku는 일관된 분산 데이터 저장소를 위해 팩소스를 구현하는 Doozerd를 사용한다.
  • Ceph는 팩소스를 모니터 프로세스의 일부로 사용하여 어떤 OSD가 클러스터에서 가동 중인지 합의한다.
  • MariaDB Xpand 분산 SQL 데이터베이스는 분산 트랜잭션 해결을 위해 팩소스를 사용한다.[12]
  • Neo4j HA 그래프 데이터베이스는 v1.9부터 Apache ZooKeeper를 대체하여 팩소스를 구현한다.
  • Apache Cassandra NoSQL 데이터베이스는 경량 트랜잭션 기능에만 팩소스를 사용한다.[13]
  • ScyllaDB NoSQL 데이터베이스는 경량 트랜잭션에 팩소스를 사용한다.[14]
  • 아마존은 엘라스틱 컨테이너 서비스에서 팩소스를 사용하여 클러스터 상태에 대한 일관된 보기를 유지한다.[15]
  • 아마존 다이나모DB는 리더 선출 및 컨센서스에 팩소스 알고리즘을 사용한다.[16]
  • OpenReplica 복제 서비스는 팩소스를 사용하여 사용자가 내결함성 객체를 생성할 수 있도록 하는 개방형 액세스 시스템의 복제본을 유지한다. 이는 동시 라운드를 통해 고성능을 제공하고 동적 멤버십 변경을 통해 유연성을 제공한다.

11. 1. 구글 (Google)

구글은 분산 록 서비스인 Chubby에서 팩소스 알고리즘을 사용하여 장애 발생 시 복제본의 일관성을 유지한다.[7] Chubby는 현재 구글 애널리틱스 및 기타 제품에서 사용 중인 빅테이블에서 사용된다. 구글 스패너와 메가스토어는 내부적으로 팩소스 알고리즘을 사용한다.[7]

11. 2. 아마존 (Amazon)

아마존은 엘라스틱 컨테이너 서비스에서 팩소스를 사용하여 클러스터 상태에 대한 일관된 보기를 유지하고,[15] DynamoDB에서는 리더 선출 및 합의를 위해 팩소스 알고리즘을 사용한다.[16]

11. 3. 기타

Apache Cassandra, ScyllaDB, MariaDB Xpand, Neo4j, Heroku Doozerd, Ceph 등 다양한 데이터베이스 및 분산 시스템에서 팩소스를 활용하고 있다.[12][13][14]

12. 결론 및 중도진보적 관점

참조

[1] 논문 Paxos Made Moderately Complex https://doi.org/10.1[...] 2015-02-17
[2] 웹사이트 Leader Election, Why Should I Care? https://www.elastic.[...] 2021-02-27
[3] 간행물 A Probabilistically Correct Leader Election Protocol for Large Groups Cornell University 2000
[4] 서적 Proceedings of the 28th ACM symposium on Principles of distributed computing ACM 2009
[5] 논문 Practical Byzantine Fault Tolerance http://pmg.csail.mit[...] 2018-03-05
[6] 논문 Fast Byzantine Consensus https://www.cs.utexa[...] 2018-03-05
[7] 웹사이트 The Chubby lock service for loosely-coupled distributed systems https://static.googl[...] OSDI
[8] URL https://groups.csail[...]
[9] 웹사이트 Microsoft Research – Emerging Technology, Computer, and Software Research https://www.microsof[...] 2024-09-19
[10] Webarchive The Distributed Coordination Engine (DConE) https://www.wandisco[...] 2016-04-15
[11] 간행물 Flease - Lease Coordination without a Lock Server http://www.xtreemfs.[...] 25th IEEE International Parallel & Distributed Processing Symposium (IPDPS 2011)
[12] 웹사이트 Consistency, Fault Tolerance, and Availability with MariaDB Xpand — MariaDB Documentation https://mariadb.com/[...] 2024-09-19
[13] 웹사이트 Lightweight transactions in Cassandra 2.0 https://www.datastax[...] 2024-09-19
[14] 웹사이트 Lightweight Transactions {{!}} ScyllaDB Docs https://opensource.d[...] 2024-09-19
[15] 웹사이트 Under the Hood of Amazon EC2 Container Service https://www.allthing[...] 2024-09-19
[16] URL https://www.usenix.o[...]
[17] 논문 Reaching Agreement in the Presence of Faults http://research.micr[...] 2007-02-02
[18] 논문 Time, Clocks and the Ordering of Events in a Distributed System http://research.micr[...] 2007-02-02
[19] 논문 Implementing Fault-Tolerant Services Using the State Machine Approach: A Tutorial https://web.archive.[...]
[20] 논문 The Part-Time Parliament http://research.micr[...] 2007-02-02
[21] 학회 Viewstamped Replication: A New Primary Copy Method to Support Highly-Available Distributed Systems http://portal.acm.or[...]
[22] 학회 Cheap Paxos http://research.micr[...]
[23] 웹사이트 Fast Paxos http://research.micr[...] 2007-02-02
[24] 논문 Generalized Consensus and Paxos http://research.micr[...] 2007-02-02
[25] 웹사이트 Practical Byzantine Fault Tolerance http://citeseer.ist.[...] 2007-02-02
[26] 저널 1988-04-01
[27] 저널 Fast Byzantine Consensus https://www.cs.utexa[...] 2018-03-05



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com