한국어

분산 트랜잭션과 2단계 커밋(2PC) 프로토콜을 심층 탐구합니다. 아키텍처, 장단점, 글로벌 시스템에서의 실제 적용 사례를 알아봅니다.

분산 트랜잭션: 2단계 커밋(2PC) 심층 분석

오늘날 점점 더 상호 연결되는 세상에서 애플리케이션은 종종 여러 독립적인 시스템에 저장된 데이터와 상호 작용해야 합니다. 이는 단일 논리적 작업이 여러 데이터베이스 또는 서비스에 걸쳐 변경되어야 하는 분산 트랜잭션이라는 개념을 탄생시킵니다. 이러한 시나리오에서 데이터 일관성을 보장하는 것이 가장 중요하며, 이를 달성하기 위한 가장 잘 알려진 프로토콜 중 하나는 2단계 커밋(2PC)입니다.

분산 트랜잭션이란 무엇인가?

분산 트랜잭션은 지리적으로 분산된 여러 시스템에서 수행되는 일련의 작업을 단일 원자 단위로 처리하는 것입니다. 이는 트랜잭션 내의 모든 작업이 성공하거나(커밋), 어떤 작업도 성공하지 않아야 함(롤백)을 의미합니다. 이 "전부 아니면 전무" 원칙은 전체 분산 시스템에서 데이터 무결성을 보장합니다.

도쿄의 고객이 한 항공사 시스템에서 도쿄에서 런던으로 가는 항공편을 예약하고, 동시에 다른 호텔 예약 시스템에서 런던의 호텔 객실을 예약하는 시나리오를 생각해 보십시오. 이 두 가지 작업(항공편 예약 및 호텔 예약)은 이상적으로는 단일 트랜잭션으로 처리되어야 합니다. 항공편 예약은 성공했지만 호텔 예약이 실패하면, 시스템은 고객이 런던에 숙소 없이 발이 묶이는 것을 방지하기 위해 항공편 예약을 취소하는 것이 이상적입니다. 이러한 조정된 동작이 분산 트랜잭션의 본질입니다.

2단계 커밋(2PC) 프로토콜 소개

2단계 커밋(2PC) 프로토콜은 여러 리소스 관리자(예: 데이터베이스) 간의 원자성을 보장하는 분산 알고리즘입니다. 이는 중앙 코디네이터와 여러 참여자로 구성되며, 각 참여자는 특정 리소스를 관리할 책임이 있습니다. 이 프로토콜은 두 가지 명확한 단계로 작동합니다.

1단계: 준비 단계

이 단계에서 코디네이터는 트랜잭션을 시작하고 각 참여자에게 트랜잭션을 커밋하거나 롤백할 준비를 하도록 요청합니다. 관련된 단계는 다음과 같습니다.

  1. 코디네이터가 준비 요청을 보냄: 코디네이터는 모든 참여자에게 "준비" 메시지를 보냅니다. 이 메시지는 코디네이터가 트랜잭션을 커밋할 준비가 되었으며 각 참여자에게 그렇게 할 준비를 요청한다는 신호입니다.
  2. 참여자 준비 및 응답: 각 참여자는 준비 요청을 받고 다음 작업을 수행합니다:
    • 트랜잭션을 커밋하거나 롤백할 수 있도록 필요한 조치(예: redo/undo 로그 작성)를 취합니다.
    • 코디네이터에게 "커밋 준비 완료"(즉 "예" 투표) 또는 "커밋 불가"(즉 "아니요" 투표)를 나타내는 "투표"를 다시 보냅니다. "아니요" 투표는 리소스 제약, 데이터 유효성 검사 실패 또는 기타 오류로 인해 발생할 수 있습니다.

참여자가 "예"라고 투표한 후 변경 사항을 커밋하거나 롤백할 수 있음을 보장하는 것이 중요합니다. 이는 일반적으로 변경 사항을 안정적인 저장소(예: 디스크)에 영구 저장하는 것을 포함합니다.

2단계: 커밋 또는 롤백 단계

이 단계는 준비 단계에서 참여자로부터 받은 투표를 기반으로 코디네이터에 의해 시작됩니다. 가능한 결과는 두 가지입니다.

결과 1: 커밋

코디네이터가 모든 참여자로부터 "예" 투표를 받으면 트랜잭션을 커밋합니다.

  1. 코디네이터가 커밋 요청을 보냄: 코디네이터는 모든 참여자에게 "커밋" 메시지를 보냅니다.
  2. 참여자 커밋: 각 참여자는 커밋 요청을 받고 트랜잭션과 관련된 변경 사항을 해당 리소스에 영구적으로 적용합니다.
  3. 참여자 확인 응답: 각 참여자는 커밋 작업이 성공했음을 확인하기 위해 코디네이터에게 확인 응답 메시지를 보냅니다.
  4. 코디네이터 완료: 모든 참여자로부터 확인 응답을 받은 후, 코디네이터는 트랜잭션을 완료된 것으로 표시합니다.

결과 2: 롤백

코디네이터가 어떤 참여자로부터라도 단 하나의 "아니요" 투표를 받거나, 참여자로부터 응답을 기다리다가 타임아웃되면 트랜잭션을 롤백하기로 결정합니다.

  1. 코디네이터가 롤백 요청을 보냄: 코디네이터는 모든 참여자에게 "롤백" 메시지를 보냅니다.
  2. 참여자 롤백: 각 참여자는 롤백 요청을 받고 트랜잭션 준비 과정에서 이루어진 모든 변경 사항을 취소합니다.
  3. 참여자 확인 응답: 각 참여자는 롤백 작업이 성공했음을 확인하기 위해 코디네이터에게 확인 응답 메시지를 보냅니다.
  4. 코디네이터 완료: 모든 참여자로부터 확인 응답을 받은 후, 코디네이터는 트랜잭션을 완료된 것으로 표시합니다.

예시: 전자상거래 주문 처리

주문 시 재고 데이터베이스를 업데이트하고 별도의 결제 게이트웨이를 통해 결제를 처리하는 전자상거래 시스템을 생각해 보십시오. 이들은 분산 트랜잭션에 참여해야 하는 두 개의 독립적인 시스템입니다.

  1. 준비 단계:
    • 전자상거래 시스템(코디네이터)은 재고 데이터베이스와 결제 게이트웨이에 준비 요청을 보냅니다.
    • 재고 데이터베이스는 요청된 품목의 재고 여부를 확인하고 예약합니다. 성공하면 "예"로 투표하고, 품목이 품절이면 "아니요"로 투표합니다.
    • 결제 게이트웨이는 결제를 사전 승인합니다. 성공하면 "예"로 투표하고, 승인이 실패하면(예: 잔액 부족) "아니요"로 투표합니다.
  2. 커밋/롤백 단계:
    • 커밋 시나리오: 재고 데이터베이스와 결제 게이트웨이 모두 "예"로 투표하면, 코디네이터는 둘 다에게 커밋 요청을 보냅니다. 재고 데이터베이스는 영구적으로 재고 수를 줄이고, 결제 게이트웨이는 결제를 처리합니다.
    • 롤백 시나리오: 재고 데이터베이스나 결제 게이트웨이 중 하나라도 "아니요"로 투표하면, 코디네이터는 둘 다에게 롤백 요청을 보냅니다. 재고 데이터베이스는 예약된 품목을 해제하고, 결제 게이트웨이는 사전 승인을 취소합니다.

2단계 커밋의 장점

2단계 커밋의 단점

2단계 커밋의 대안

2PC의 한계로 인해 분산 트랜잭션 관리를 위한 여러 대안적 접근 방식이 등장했습니다. 여기에는 다음이 포함됩니다.

2단계 커밋의 실제 적용 사례

제한 사항에도 불구하고 2PC는 강력한 일관성이 중요한 요구 사항인 다양한 시나리오에서 여전히 사용됩니다. 몇 가지 예는 다음과 같습니다.

2단계 커밋 구현

2PC를 구현하려면 다음과 같은 다양한 요소를 신중하게 고려해야 합니다.

분산 트랜잭션을 위한 글로벌 고려 사항

글로벌 환경에서 분산 트랜잭션을 설계하고 구현할 때 몇 가지 추가 요소를 고려해야 합니다.

결론

분산 트랜잭션과 2단계 커밋(2PC) 프로토콜은 견고하고 일관된 분산 시스템을 구축하는 데 필수적인 개념입니다. 2PC가 원자성을 보장하는 간단하고 널리 채택된 솔루션을 제공하지만, 블로킹 및 단일 실패 지점과 관련된 그 한계로 인해 사가(Saga) 패턴 및 최종 일관성과 같은 대안적 접근 방식을 신중하게 고려할 필요가 있습니다. 강력한 일관성, 가용성 및 성능 간의 장단점을 이해하는 것은 특정 애플리케이션 요구에 맞는 올바른 접근 방식을 선택하는 데 중요합니다. 또한, 글로벌 환경에서 운영할 때는 분산 트랜잭션의 성공을 보장하기 위해 네트워크 지연, 시간대, 데이터 현지화 및 규제 준수와 같은 추가 고려 사항을 해결해야 합니다.