데이터 일관성 유지

남예준·2025년 10월 28일
📌 대규모 시스템에서는 데이터 일관성을 유지하는 것이 중요 이를 위해 **분산 트랜잭션, 이벤트 소싱, CQRS(Command Query Responsibility Segregation)** 등의 기법을 사용

분산 트랜잭션

  • 분산 트랜잭션은 여러 개의 독립된 시스템이나 데이터베이스에서 동시에 일어나는 트랜잭션을 일관되게 관리하는 방법
  • 단일 트랜잭션이 여러 시스템에 걸쳐 발생할 때, 모든 시스템이 해당 트랜잭션을 성공적으로 완료하거나, 모든 시스템이 트랜잭션을 실패로 처리하도록 보장
  • 분산 트랜잭션이 필요한 이유는 마이크로서비스 아키텍처에서 여러 서비스가 독립적으로 운영되기 때문

주요개념

  • 트랜잭션(Transaction):
    • 데이터베이스의 상태를 변환하는 작업의 단위로, ACID(원자성, 일관성, 고립성, 지속성) 속성을 보장
      • 원자성 (Atomicity): 트랜잭션은 전부 성공하거나 전부 실패하여, 부분적인 작업 수행이 없는 것을 보장합니다.
      • 일관성 (Consistency): 트랜잭션이 완료된 후에도 데이터베이스는 모든 무결성 제약 조건을 유지
      • 격리성 (Isolation): 동시에 실행되는 트랜잭션이 서로 간섭하지 않도록 보장
      • 지속성 (Durability): 트랜잭션이 성공적으로 완료된 후의 결과는 시스템 장애가 발생해도 영구적으로 유지
  • 분산 트랜잭션(Distributed Transaction):
    • 여러 분산된 데이터 소스에 걸쳐 트랜잭션을 수행하는 작업
    • 예를 들어, 여러 마이크로서비스나 데이터베이스에서 데이터를 동시에 업데이트하는 경우
  • 2PC (Two-Phase Commit):
    • 분산 트랜잭션을 관리하는 프로토콜로, 준비(Prepare) 단계커밋(Commit) 단계로 나누어 트랜잭션을 처리
      • 준비 단계(Prepare Phase): 각 참여 노드는 트랜잭션 준비 상태를 확인하고, 준비 완료를 마스터 노드에 알림.
      • 커밋 단계(Commit Phase): 마스터 노드는 모든 참여 노드가 준비되었음을 확인하고, 트랜잭션을 커밋하도록 지시. 만약 준비가 완료되지 않은 노드가 있다면 트랜잭션을 롤백.
  • 사가 패턴(Saga Pattern):
    • 트랜잭션을 여러 단계로 나누어 처리하고, 각 단계가 독립적으로 커밋. 실패 시 보상 트랜잭션을 실행하여 상태를 롤백합니다.
      • 주문 생성 단계: 사용자가 주문을 생성.
      • 결제 처리 단계: 결제 서비스가 주문 결제를 처리.
      • 재고 감소 단계: 재고 서비스가 주문된 상품의 재고를 감소.
      • 각 단계가 성공적으로 완료되면 다음 단계로 넘어가고, 실패하면 이전 단계에서 수행된 작업을 취소합니다.
  • 이벤트 소싱(Event Sourcing):
    • 상태 변화를 이벤트로 기록하고, 해당 이벤트를 재생하여 현재 상태를 유지합니다. 이를 통해 분산 트랜잭션의 일관성을 유지.

분산 트랜잭션의 장점

  • 데이터 일관성 보장:
    • 분산된 여러 데이터 소스에 걸쳐 일관된 데이터 상태를 유지
  • 확장성:
    • 분산 트랜잭션을 통해 여러 시스템이 독립적으로 동작하면서도, 필요한 경우 협력하여 일관된 상태를 유지. ⇒ 시스템의 확장성
  • 신뢰성:
    • 트랜잭션의 ACID 속성을 분산 환경에서도 유지할 수 있어 시스템의 신뢰성을 높임. 데이터 무결성과 일관성을 유지
  • 복구 가능성:
    • 트랜잭션 실패 시 롤백 메커니즘을 통해 상태를 복구할 수 있어, 시스템 안정성을 높임

분산 트랜잭션의 단점

  • 복잡성 증가:
    • 분산 트랜잭션을 구현하고 관리하는 것은 복잡, 특히, 여러 시스템 간의 트랜잭션 동기화와 데이터 일관성을 유지하는 것은 어려운 작업
  • 성능 저하:
    • 2PC와 같은 프로토콜을 사용할 경우, 트랜잭션의 준비와 커밋 단계에서 지연이 발생 ⇒ 시스템의 성능을 저하
  • 네트워크 오버헤드:
    • 여러 시스템 간의 통신이 필요하므로 네트워크 오버헤드가 증가트랜잭션 처리 속도를 저하.
  • 복구의 어려움:
    • 분산 트랜잭션 실패 시, 모든 시스템에서 일관된 상태로 롤백하는 것이 어려움. 특히, 부분적으로 실패한 트랜잭션을 처리하는 데 어려움

분산 트랜잭션의 예시

  • 주문 생성과 결제 처리:
    • 한 사용자가 온라인 쇼핑몰에서 주문을 생성하고, 결제를 진행, 이 과정에서 주문 서비스와 결제 서비스가 각각 독립된 데이터베이스를 사용한다고 가정
    • 분산 트랜잭션을 통해 두 서비스가 일관되게 주문과 결제를 처리. 트랜잭션이 성공적으로 완료되면 두 데이터베이스에 주문 및 결제 정보가 일관되게 저장.
  • 2PC를 사용한 트랜잭션 처리:
    • 준비 단계: 주문 서비스와 결제 서비스가 트랜잭션을 준비. 두 서비스가 모두 준비 완료 상태를 마스터 노드에 알림.
    • 커밋 단계: 마스터 노드는 두 서비스가 모두 준비되었음을 확인하고, 트랜잭션을 커밋하도록 지시. 만약 하나의 서비스라도 준비되지 않았으면, 트랜잭션을 롤백.

0개의 댓글