본문 바로가기

개발

분산시스템(Distributed System) - 6 - 1(Replica Consistency)Two-phase commit

Two-phase commit(2PC)는 여러 노드 사이에서 atomic commitment를 보장하는 가장 대중적인 알고리즘이다.

클라이언트에서 트랜잭션을 시작하면 다른 replica들도 참여를 하고 commit 할 준비가 되면 coordinator에게 요청을 보낸다. (coordinator는 2pc를 관리하는 역할을 하는데 시스템에 따라 클라이언트의 일부로 존재하는 경우도 있다.)

요청을 받은 coordinator는 prepare메시지를 트랜잭션에 참여하고 있는 모든 replica들에게 보낸다. 그리고 replica들은 commit이 가능한지 여부를 보낸다. 이것이 첫 번째 phase이다.

이때 commit은 하지않지만 coordinator에서 OK요청이 오면 무조건 commit을 하는 것을 보장해야 한다.

coordinator는 replica들의 응답을 보고 commit 할지 말지 결정을 한다. 모든 노드가 OK로 응답하면 comit을 하지만 timeout이나 거나 하나라도 OK가 아니라면 중단을 한다. 이러한 결정을 모든 replica들에게 보낸다. 결정에 따라 commit 또는 rollback이 결정된다.

 

여기서도 문제는 coordinator의 SPOF이다. coordinator가 가진 commit이나 abort의 결정을 스토리지에 저장하면 다시 복구되었을 때 계속 이어 나갈 수 있을 것이다. 그리고 prepare는 했지만 commit에 대한 여부를 replica들에게 기다리고 있는데 죽는 경우 coordinator가 살아나서 지시를 주기 전까지 모든 replica들은 기다리게 된다. 여기서 혼자 결정하면 원자성을 위반할 수도 있기 때문이다.

 

하지만 앞서 배운 total-order-broadcast나 consensus를 이용하면 fault-tolerant two-phase commit을 실현할 수 있다.

 

total-order-broadcast를 이용한다라고 하면 모든 노드가 total-order-broadcast를 이용하여 트랜잭션에 참여한다. 여기서 특이한 점은 노드 A가 있고 노드 B가 있는데 노드 B가 노드A가 죽은걸로 예상한다면 노드A가 느려서 메세지를 늦게 보냈더라도 대신에 노드B가 A의 abort메시지를 보낸다. 두 노드가 동시에 메시지를 보낼 수 있긴 하지만 total-order-broadcast는 모든 노드가 메시지를 받는 순서가 보장되기 때문에 둘 중 빠른 메시지가 투표에 반영이 될 것이다. 그렇게 하나라도 abort가 나온다면 트랜잭션은 abort 될것이다. 반대의 경우라면 commit이 될것이다. 모든 노드들은 같은 선택을 할 수 있게 된다.

 

포스트의 모든 이미지는

https://www.youtube.com/channel/UClB4KPy5LkJj1t3SgYVtMOQ/videos 와 Introduction to Reliable and Secure Distributed Second Edition에 있다.