최근 회사에서 프로젝트를 진행하면서 배포에서 문제를 겪었다. 정확히는 내가 로컬에서 코드를 고치고 커밋하고 푸쉬까지 하면 SourceTree에서 보이긴 하지만 배포할때 쓰이는 이미지엔 반영이 안되는것이었다. 내가 고전하고 있을 때 대표님이 로컬에서만 푸쉬한거아냐? 원격저장소에도 푸쉬를 해야지~ 라고 하시고 2pc 에 대해 공부해오라는 과제를 내주셨다. 먼저 2pc에 대해 간단하게 알아보자.
Two-phase commit이란?
MSA, 분산 데이터베이스, 분산 파일 시스템과 같은 분산 트랜잭션 환경에서 데이터의 일관성을 유지시켜 줄 수 있는 트랜잭션 관리 프로토콜이다. 정처기 할때 공부했던 트랜잭션의 ACID 특징중 원자성(Atomicity)을 보장 해준다는 것이다. 뿐만 아니라 데이터의 일관성과 무결성도 보장해준다.
분산 시스템에서 여러 데이터베이스가 참여하는 트랜잭션을 수행 할 때, 각 데이터베이스가 성공적으로 트랜잭션을 수행했는지 확인해야 한다. 그렇지 않으면 데이터가 뒤죽박죽이 될 가능성이 높다.
Two-phase commit의 구성요소
Coordinator(조정자) : 트랜잭션을 관리하고 참여자들에게 상태를 요청하고 최종적으로 커밋할지, 롤백할지를 지시한다.
Participants(참여자) : 트랜잭션의 일부를 처리하는 노드로, 각 참여자들은 조정자의 명령에 따라 트랜잭션을 처리한다.
Two-phase commit의 프로세스
1. Prepare 단계
- Coordinator가 트랜잭션 시작: 트랜잭션이 시작되면 조정자는 트랜잭션에 참여하는 모든 참여자에게 트랜잭션 준비 요청을 보낸다. “CanCommit?” 메시지로 표현됨.
- Participants가 준비 상태 확인: 각 참여자는 자신이 트랜잭션을 커밋할 수 있는 상태인지 확인합니다. 이때 참여자는 트랜잭션이 성공적으로 처리될 수 있을지를 검토한 후, 로컬에서 트랜잭션을 일시적으로 기록하고 트랜잭션 로그에 저장한다.
- Participants의 응답: 모든 참여자들은 트랜잭션을 처리할 수 있으면 Yes 응답을 조정자에게 보내고, 처리할 수 없는 상황이면 No 응답을 보낸다.
- Coordinator의 결정: 모든 참여자로부터 응답을 바등면 조정자는 결과를 검토한다. 모든 응답이 Yes면 커밋을 결정하고, 하나라도 No가 나오면 롤백을 결정하게 된다.
2. Commit 단계
- Coordinator가 커밋 또는 롤백 명령 전송: 위에서 결정한 결과대로 커밋 또는 롤백 명령을 전송하게 된다.
- Participants의 처리:
- Commit 명령을 받은 참여자는 트랜잭션을 실제로 적용하고, 완료되면 조정자에게 통보한다.
- Rollback 명령을 받은 참여자는 트랜잭션을 취소하고, 조정자에게 롤백이 조정자에게 통보합니다.
- Coordinator의 최종 완료 확인:
- 모든 참여자로부터 커밋 또는 롤백이 완료되었다는 확인을 받으면, 트랜잭션이 완료되었음을 기록하고 종료한다.
Two-phase commit의 한계
참여자가 응답을 안하면 무한 대기할 수 도 있고, 만약 중재자가 에러가 나면 트랜잭션 전체가 중단될 수 도 있고, 네트워크의 지연 및 성능저하가 일어날 수 도 있다.
MSA에서 의 Two-phase commit
MSA에선 여러 독립된 마이크로서비스가 각각 자체 데이터베이스를 가지고 있을 수 있다. 각 서비스는 독립적으로 운영되는데, 가끔 어떤 트랜잭션은 여러 서비스에 걸쳐서 수행되어야 할 때가 있다. 이때 각 서비스가 데이터 일관성을 유지하면서 트랜잭션을 완료하려면 분산 트랜잭션 관리가 필요하고, 이 때 Two-phase commit 프로토콜을 쓸 수 있다.
하지만 MSA에서 2PC는 잘 사용되지 않다고 한다. 왜냐면 2PC가 성능 및 복잡성 문제를 야기할 수도 있고, MSA의 가장 큰 장점 중 하나인 서비스 독립성이 약화될 수 있다고 한다. MSA에서는 비동기적인 트랜잭션 관리 기법이 더 자주 사용된다고 한다.
'CS공부' 카테고리의 다른 글
Spring Cloud - MSA (7) | 2024.10.20 |
---|---|
supabase? 가 뭘까? 맛좀 보자. (3) | 2024.10.18 |
MSA 구조에대해 (0) | 2024.06.19 |
SQL 복습, HTTP 복습 - 그냥 기록용 (0) | 2024.01.26 |
기본기 닦기(5) - API,Rest API (2) | 2024.01.03 |