잡학

2PC(2 Phase Commit) 에 대하여 (or 2 Transaction)

d-e-v-j 2024. 8. 15. 23:55
반응형

서버간 통신을 하다보면 

통신 중 데이터 손실이 발생하는 경우가 많다.

손실을 방지하는게 가장 좋지만 사실상 불가능하다.

시스템적인 문제 뿐만 아니라 네트워크 문제, 사용자의 부주의 등등... 고려해야 될 사항이 너무 많다

 

결제시스템에서 예로 들자면

서버 A 에서 결제 승인 요청을 B 서버로 보내고

B서버에서 승인 처리 후 결과를 A서버로 리턴 해주는걸 정상적인 시스템이라고 본다면.

 

B서버에서 승인 처리후 결과를 A서버로 리턴을 했지만 data손실이 일어나서 A 서버는 승인된 결과를 못받았을 때

A서버는 결제 실패를, B 서버는 결제 성공을 기록하게 된다.

 

이러한 데이터 정합성이 안맞는걸 방지해야한다.

그런상황에서 시스템간 정합성을 맞추도록 하는 방법중 하나인 2pc 또는 2 transaction 이라 불리는 방법을 알아보자


2PC (Two-Phase Commit) 란 ?

분산 시스템에서 트랜잭션을 관리하기 위한 프로토콜로, 모든 참여 노드가 트랜잭션을 일관성 있게 커밋하거나 롤백하도록 보장합니다. 이를 위해 두 단계로 트랜잭션을 수행합니다: 준비 단계(Prepare Phase)와 커밋 단계(Commit Phase).

 

준비단계

 

  • 코디네이터(Coordinator): 트랜잭션을 관리하는 중앙 역할을 하며, 모든 참여자에게 트랜잭션을 준비할 수 있는지 묻습니다.
  • 참여자(Participants): 트랜잭션에 참여하는 노드들입니다. 각 노드는 트랜잭션을 준비할 수 있다면 "YES" 응답을, 그렇지 않다면 "NO" 응답을 보냅니다.

 

절차

 

 

  1. 코디네이터가 트랜잭션에 참여하는 모든 노드(참여자)에게 "Prepare" 요청을 보냅니다.
  2. 각 노드는 트랜잭션을 수행할 준비가 되었는지 확인한 후, 준비가 되었으면 "YES", 준비가 되지 않았으면 "NO"로 응답합니다.

 

커밋 단계

코디네이터의 결정: 모든 참여자에게서 "YES" 응답을 받았다면, 트랜잭션을 커밋(Commit)하라고 지시합니다. 하나라도 "NO" 응답을 받았다면, 트랜잭션을 롤백(Rollback)하도록 지시합니다.

 


간단히 말하자면 

단순히 기능을 바로 시작하는것이 아니라

준비단계에서 시스템들의 준비 여부를 check 하고 그 다음 로직을 시작함으로써 data 손실이 발생하여 시스템간 정합성이 안맞게 된게 있는지 확인하는 것이다.

근데 이게 또 준비여부 check 했을땐 모두 준비가 되었어도 실제 commit 단계에선 에러가 또 날 수 있고.. 그걸 대비하여 3pc를 하는 경우도 있다.

아무래도 단계가 많아질 수록 정확도는 올라가고 시스템 속도는 느려질 수 있어서 4pc ,5pc 까진 쓰지않는다.

이것 외에도 다른 방법들도 여러개 있으니 그건 다음에 정리해보도록 하자.

 

728x90
반응형
LIST