분산 트랜잭션: 2단계 커밋 패턴

2단계 커밋(Two Phase Commit: 이하 2PC)은 DB 소스를 2개 이상 사용하는 상황에서 전체적인 원자성을 보장하기 위한 아키텍쳐, 분산 트랜잭션 패턴이다.

꽤 고전적인 개념이기도 하다. 아이디어 자체는 80년대쯤에 등장한 것 같다.



기본 개념

2PC는 분산 트랜잭션 관리를 위해 코디네이터라는 관리자 시스템을 추가한다.
코디네이터는 그냥 코드로 구현해서 임베딩할 수도 있고, 코디네이터 서버를 따로 띄워서 쓸 수도 있다.

2PC는 prepare와 commit이라는 2개 단계를 사용해서 원자성을 구현한다.

https://medium.com/@balrajasubbiah/consensus-two-phase-and-three-phase-commits-4e35c1a435ac


- 1단계 - prepare

  1. 클라이언트는 분산 트랜잭션 생성을 위해 코디네이터에게서 unique한 트랜잭션 ID를 요청한다. 이를 통해 개별 트랜잭션과 작업을 그룹화해서 추적/관리한다.
  2. 클라이언트는 개별 DB의 단일 트랜잭션을 열어서 쓰기를 진행한다.
  3. 클라이언트가 DB들의 write를 완료했다면, 코디네이터는 각 DB 노드에 prepare 이벤트를 날린다.
  4. prepare를 받은 DB들은 write가 가능하면 "yes"를, 불가능하면 "no"라는 응답을 코디네이터에게 보낸다.

- 2단계 - commit or rollback

  1. 코디네이터가 모든 DB에 대해 "yes"를 받는다면, 전체 커밋을 완료하고 분산 트랜잭션도 완료된 것으로 처리한다.
  2. 코디네이터가 모든 DB에 대해 하나라도 "no"를 받는다면, DB들에 대해서 전체 rollback을 진행한다.


단점

코디네이터를 별도 서버로 분리할 경우, 단일 장애 지점이 된다. 관리포인트가 늘어나는 것이다.

리소스 효율성이나 성능면에서는 좋지 않을 수 있다. 분산 트랜잭션이 진행되는 동안에는 거의 블록킹으로 딜레이된다.


참조
https://distributedalgorithm.wordpress.com/2015/06/13/two-phase-commit/
https://kadensungbincho.tistory.com/m/125
https://ko.m.wikipedia.org/wiki/2%EB%8B%A8%EA%B3%84_%EC%BB%A4%EB%B0%8B_%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C
https://martinfowler.com/articles/patterns-of-distributed-systems/two-phase-commit.html