Two-Phase Commit-2PC

상윤·2024년 4월 11일
0

BackEnd

목록 보기
2/11

개요

분산 환경에서 데이터 일관성을 보존하는 법?
Two-phase commit은 분산 환경에서 데이터 일관성을 보장하기 위해 사용되는 트랜잭션 관리 프로토콜이다.트랜잭션의 커밋을 두 단계로 나누어 처리하여 모든 데이터베이스 인스턴스에서의 원자성을 보존한다.

** 2PC의 탄생 배경**

단일서버 운영에서 분산환경으로 확장되면서 다중 서버간의 트랜잭션 관리가 필요해짐에 따라, 여러 데이터 베이스 인스턴스 간에 데이터 일관성을 보장하기 위한 프로토콜이 필요.
싱글 노드의 원자성은 보통 스토리지 엔진에 의해 구현된다. 만약 트랜잭션이 실패 시, 노드가 재시작 할 때 로그부터 트랜잭션을 회복하고, 커밋 레코드가 실행 전 디스크를 확인 후, 커밋 성공 여부를 확인하여 실패시 롤백을 진행한다. 따라서 싱글 노드 상에서, 트랜잭션 커밋은 데이터가 디스크에 쓰여진 순서에 의존한다. (트랜잭션의 성공 여부는 disk에 write되는 순간)
만약 분산 데이터 저장소의 경우 노드 하나만 롤백되거나 커밋이 된다면 데이터의 일관성을 잃을 수 있다.

2PC란?

2PC 동작 순서 : begin -> end -> prepare -> commit
싱글 노드 동작 순서 : begin -> end -> commit

글로벌 트랜잭션을 위해 필수적인 2PC
여러 리소스 사이에서 처리하는 작업이기 때문에 "분산" 트랜잭션(Distribute Transaction)이라고도 함. = XA
싱글 노드 트랜잭션에 존재하지 않는 새로운 컴포넌트인 코디네이터(또는 트랜잭션 매니저)를 사용.

First Phase(또는 Prepare Phase)
First Phase는 각 데이터베이스 노드에 커밋을 하기 위한 준비 요청 단계이다.
First Phase 과정

TM은 각 데이터베이스 노드에 커밋을 준비하라는 prepare 메시지 전송.
요청을 받은 각 데이터베이스는 커밋을 준비한다.
(커밋을 하기 위한 준비 작업에는 필요한 리소스에 잠금(Lock)을 설정하거나 로그 파일을 저장하는 작업 등이 있다.)
각 데이터베이스는 커밋 준비 여부에 따라 TM에 성공 또는 실패 여부를 알린다.
커밋 준비가 모두 끝나면 prepare가 성공, 커밋 준비를 실패하면 prepare가 실패.

Second Phase(또는 Commit Phase)
TM은 참여한 모든 데이터베이스 노드로부터 prepare의 완료 메시지를 받을 때까지 대기한다.
이 단계에서는 전달 받은 prepare의 메시지에 따라 해당 결과가 다르다.

롤백: 한 데이터베이스 노드라도 prepare ok 메시지를 받지 않으면 이 트랜잭션은 커밋할 수 없다고 판단, 모든 데이터베이스 노드에 롤백 메세지 전송.
커밋 :모든 데이터베이스 노드로부터 prepare ok 메세지 응답 시 커밋 메시지 전송.

XAResource 메소드

Start
XID와 관련된 트랜잭션의 특정 브랜치를 시작하거나 이미 존재하는 트랜잭션을 재시작 또는 변경 사항을 조인시키기 위해 사용하는 메소드이다.
문법
void start(Xid xid, int flags)

End
XID와 관련된 트랜잭션의 특정 브랜치에 대한 종료 상태(정상 또는 실패)를 알리거나 이미 존재하는 트랜잭션을 멈추기 위해 사용하는 메소드이다.
문법
void end(Xid xid, int flags)

Prepare
문법
int prepare(Xid xid)

Commit
문법
void commit(Xid xid, boolean isOnePhase)

Rollback
문법
void rollback(Xid xid)

Forget
문법
void forget(Xid xid)
파라미터

Recover
Xid[] recover(int flag)

isSameRM
boolean isSameRM(XAResource aResource)

2PC 취약점

코디네이터가 다운되는 경우

0개의 댓글