분산 컴퓨팅 2. 중재자와 2단계 커밋 프로토콜

    들어가기 전

    • 이 글은 핵심 이론부터 프로그래밍 실습까지 분산 컴퓨팅을 읽고 정리한 글입니다. 

     

     

    핵심 요약

     

     

     


    2.1 계좌 이체 문제

    A → B로 1,000원을 이체하는 경우를 고려해보자. 이를 위해서는 다음 두 가지 동작이 원자적으로 일어나야 한다.

    • A 계좌에서 1,000원 감소.
    • B 계좌에서 1,000원 증가 

    A, B가 서로 직접 소통하는 경우에는 이 작업은 원자적으로 이루어지지 않거나, 평생 아무런 일도 발생하지 않을 것이다. 

    1. A → B : B 계좌 1,000원 증액 요청
    2. B → A : B 계좌 1,000원 확인 응답
    3.  A → B : 메세지 2번의 확인 응답
    4. ...

    먼저 메세지 1번에 대해 B가 적절히 응답하지 못하는 경우, A는 자신의 계좌에서 1,000원 감소시킬 수 없다. 만약 그렇게 한다면 A의 계좌에서만 1,000원이 줄어들고 B의 계좌에는 그대로 유지되는 셈이다. 

    반면 2번에서 B가 응답을 적절히 했지만, A에게 응답이 전송되지 않을 수도 있다. 이 때, B가 무시하고 자신의 계좌에서 1,000원을 증가시킨다면 공짜돈 1,000원이 B에게 생기는 셈이다. 

    메세지 2번에서 B가 보낸 응답을 A가 정상적으로 받았더라도, A - B는 서로 계좌를 업데이트 할 수 없다. B는 A가 자신의 응답을 받았다는 것을 정확히 알 수 없기 때문이다. 

    여기서 알 수 있는 것은 분산 컴퓨팅에서 두 서버 간의 합의 (양자 합의)는 결함을 수반할 수 있음을 의미한다. 

     


    2.2 안정성과 라이브니스 

    분산 컴퓨팅에서는 안정성과 라이브니스라는 개념이 나온다. 각 개념은 무엇을 의미할까?

     

    안정성 (Safety)

    안정성은 잘못된 결과가 일어나지 않는 성질을 의미한다. 

    • 예시 : A 계좌에서 1,000원 감소하였으나 B 계좌는 그대로 유지 (잘못된 결과) 

     

    라이브니스 (Liveness)

    원하는 결과가 어느 시점에는 Eventually 실행되는 것을 의미한다.

    • 예시 : A - B는 서로의 응답만 기다리다가 작업을 수행하지 못함. 

     

    앞의 예시에서 볼 수 있듯이 분산 컴퓨팅에서 양자 합의(두 서버 간의 합의)만으로는 안정성 + 라이브니스를 둘다 만족시킬 수 없다. 이것은 안정성 + 라이브니스를 동시에 만족시키기 위해서는 제 3자가 필요할 것을 암시한다. 


    2.3 2단계 커밋 프로토콜 (Two Phase Commit)

    여기서는 스트로우맨 프로토콜과 Two Phase Commit에 대한 내용을 살펴볼 것이다. 

     

    스트로우맨 프로토콜 (Straw Man Protocol)

    앞서 이야기 했던 것처럼 양자 합의로는 분산 시스템에서 Safety + Liveness를 모두 잡을 수 없다. 따라서 이를 도와줄 제 3자가 필요한데, 계좌 이체를 위해 추가된 제 3자를 Transaction Coordinator라고 명명한다. 

    트랜잭션 코디네이터를 이용한 프로토콜은 다음과 같다.

    1. A는 트랜잭션 코디네이터에게 출금 요청을 보냄. (Go!)
    2. 트랜잭션 코디네이터는 K 은행, S 은행에게 요청을 보냄. 
    3. 트랜잭션 코디네이터는 요청을 보낸 후, A에게 바로 응답함. 

    이 프로토콜은 꽤나 안정적인 것처럼 보인다. 그런데 좀 더 들여다보면 전혀 안정적이지 않다. 아래 경우가 발생할 수 있기 때문이다. 

    1. A 계좌에 잔고가 0원인 경우 → A 계좌는 그대로, B 계좌에는 1,000원이 입금됨. 
    2. B 계좌가 존재하지 않는 경우 → A 계좌에서만 1,000원이 출금됨. 
    3. K 은행에게만 전달되거나, S 은행에게만 전달되는 경우. (서버가 죽었거나, 네트워크 파티셔닝) → 특정 계좌에서만 돈이 입/출금됨. 
    4. TC가 작업 도중 중단되는 경우. (K 은행에게만 요청 보내고 중단되어 S 은행에게는 보내지 못한 경우) 

    이런 여러가지 경우들을 고려해보면 러프하게 작성한 위 스케치는 분산 컴퓨팅에서는 Safety + Liveness 어느 하나 만족시키는 것이 없다. 이 프로토콜은 장애 내성(Fault Tolerance)가 전혀 없는 상태다. 2 페이즈 커밋 프로토콜을 이용하면 이 문제를 개선할 수 있다

     

    Two Phase Commit 

     

     

     

     

     

     

     

     

    댓글

    Designed by JB FACTORY