CS공부

Two-phase commit 이란?(2PC)

티코딩 2024. 10. 16. 21:54

최근 회사에서 프로젝트를 진행하면서 배포에서 문제를 겪었다. 정확히는 내가 로컬에서 코드를 고치고 커밋하고 푸쉬까지 하면 SourceTree에서 보이긴 하지만 배포할때 쓰이는 이미지엔 반영이 안되는것이었다. 내가 고전하고 있을 때 대표님이 로컬에서만 푸쉬한거아냐? 원격저장소에도 푸쉬를 해야지~ 라고 하시고 2pc 에 대해 공부해오라는 과제를 내주셨다. 먼저 2pc에 대해 간단하게 알아보자.

 

Two-phase commit이란?

MSA, 분산 데이터베이스, 분산 파일 시스템과 같은 분산 트랜잭션 환경에서 데이터의 일관성을 유지시켜 줄 수 있는 트랜잭션 관리 프로토콜이다. 정처기 할때 공부했던 트랜잭션의 ACID 특징중 원자성(Atomicity)을 보장 해준다는 것이다. 뿐만 아니라 데이터의 일관성과 무결성도 보장해준다.

분산 시스템에서 여러 데이터베이스가 참여하는 트랜잭션을 수행 할 때, 각 데이터베이스가 성공적으로 트랜잭션을 수행했는지 확인해야 한다.  그렇지 않으면 데이터가 뒤죽박죽이 될 가능성이 높다.

Two-phase commit의 구성요소

Coordinator(조정자) : 트랜잭션을 관리하고 참여자들에게 상태를 요청하고 최종적으로 커밋할지, 롤백할지를 지시한다.

Participants(참여자) : 트랜잭션의 일부를 처리하는 노드로, 각 참여자들은 조정자의 명령에 따라 트랜잭션을 처리한다.

 

Two-phase commit의 프로세스

1.  Prepare 단계

  1. Coordinator가 트랜잭션 시작: 트랜잭션이 시작되면 조정자는 트랜잭션에 참여하는 모든 참여자에게 트랜잭션 준비 요청을 보낸다.  “CanCommit?” 메시지로 표현됨.
  2. Participants가 준비 상태 확인: 각 참여자는 자신이 트랜잭션을 커밋할 수 있는 상태인지 확인합니다. 이때 참여자는 트랜잭션이 성공적으로 처리될 수 있을지를 검토한 후, 로컬에서 트랜잭션을 일시적으로 기록하고 트랜잭션 로그에 저장한다.
  3. Participants의 응답: 모든 참여자들은 트랜잭션을 처리할 수 있으면 Yes 응답을 조정자에게 보내고, 처리할 수 없는 상황이면 No 응답을 보낸다.
  4. Coordinator의 결정: 모든 참여자로부터 응답을 바등면 조정자는 결과를 검토한다. 모든 응답이 Yes면 커밋을 결정하고, 하나라도 No가 나오면 롤백을 결정하게 된다.

2. Commit 단계

  1. Coordinator가 커밋 또는 롤백 명령 전송: 위에서 결정한 결과대로 커밋 또는 롤백 명령을 전송하게 된다.
  2. Participants의 처리:
    • Commit 명령을 받은 참여자는 트랜잭션을 실제로 적용하고, 완료되면 조정자에게 통보한다.
    • Rollback 명령을 받은 참여자는 트랜잭션을 취소하고, 조정자에게 롤백이 조정자에게 통보합니다.
  3. Coordinator의 최종 완료 확인:
    • 모든 참여자로부터 커밋 또는 롤백이 완료되었다는 확인을 받으면, 트랜잭션이 완료되었음을 기록하고 종료한다.

 

Two-phase commit의 한계

참여자가 응답을 안하면 무한 대기할 수 도 있고, 만약 중재자가 에러가 나면 트랜잭션 전체가 중단될 수 도 있고, 네트워크의 지연 및 성능저하가 일어날 수 도 있다.

 

 

MSA에서 의 Two-phase commit

MSA에선 여러 독립된 마이크로서비스가 각각 자체 데이터베이스를 가지고 있을 수 있다. 각 서비스는 독립적으로 운영되는데, 가끔 어떤 트랜잭션은 여러 서비스에 걸쳐서 수행되어야 할 때가 있다. 이때 각 서비스가 데이터 일관성을 유지하면서 트랜잭션을 완료하려면 분산 트랜잭션 관리가 필요하고, 이 때 Two-phase commit 프로토콜을 쓸 수 있다.

하지만 MSA에서 2PC는 잘 사용되지 않다고 한다. 왜냐면 2PC가 성능 및 복잡성 문제를 야기할 수도 있고, MSA의 가장 큰 장점 중 하나인 서비스 독립성이 약화될 수 있다고 한다. MSA에서는 비동기적인 트랜잭션 관리 기법이 더 자주 사용된다고 한다.

 

출처:https://www.youtube.com/watch?v=gVp7N-mfhs8