분산 트랜잭션: 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
- 클라이언트는 분산 트랜잭션 생성을 위해 코디네이터에게서 unique한 트랜잭션 ID를 요청한다. 이를 통해 개별 트랜잭션과 작업을 그룹화해서 추적/관리한다.
- 클라이언트는 개별 DB의 단일 트랜잭션을 열어서 쓰기를 진행한다.
- 클라이언트가 DB들의 write를 완료했다면, 코디네이터는 각 DB 노드에 prepare 이벤트를 날린다.
- prepare를 받은 DB들은 write가 가능하면 "yes"를, 불가능하면 "no"라는 응답을 코디네이터에게 보낸다.
- 2단계 - commit or rollback
- 코디네이터가 모든 DB에 대해 "yes"를 받는다면, 전체 커밋을 완료하고 분산 트랜잭션도 완료된 것으로 처리한다.
- 코디네이터가 모든 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