Hi yoahn 개발블로그

대시설기2: 분산 트랜잭션 본문

스터디

대시설기2: 분산 트랜잭션

hi._.0seon 2024. 8. 17. 16:59
반응형

가상 면접 사례로 배우는 대규모 시스템 설계 기초 2

12장 전자 지갑

스터디하다가 기록해두면 좋을것 같은 주제가 나와 오랜만에 글을 작성해 본다

 

분산 트랜잭션 하면 2Phase Commit - 2PC 만 알고 있었는데 종류가 많아서 정리!

분산 락이랑 분산 트랜잭션이랑 어떻게 다른지도 찾아봐야겠다

 

분산 시스템에서 한 트랜잭션에는 여러 노드의 프로세스가 관여할 수 있다. 분산 트랜잭션은 이들 프로세스를 하나의 트랜잭션으로 묶는 것.

분산 트랜잭션의 구현법으로는 저수준과 고수준 방안이 있다.

1. 2PC (2단계 커밋) - 저수준 방안

저수준 방안 - 데이터베이스에 의존하는 방안

 

1. 조정자가 DB 1, 2 에 읽기 & 쓰기 작업을 수행 -> 1, 2 에 Lock 이 걸린다.

2. Prepare: 애플리케이션이 트랜잭션을 커밋하려고 할 때, 모든 DB 에 트랜잭션 준비를 요청한다.

3. Commit: 준비가 완료되면, 모든 데이터베이스에 트랜잭션 커밋을 요청한다.

- 어느 한 데이터베이스라도 아니요를 응답하면, 모든 데이터베이스에 트랜잭션 중단을 요청한다.

 

이 방안이 저수준 방안인 이유는, 준비 단계를 실행하려면 데이터베이스 트랜잭션 실행 방식을 변경해야 하기 때문이다.

다른 데이터베이스를 사용하는 경우, 2PC 를 사용하려면 모든 데이터베이스가 X/Open XA 표준을 만족해야 한다.

 

단점

1. 다른 노드의 메시지를 기다리는 동안 락이 오랫동안 잠긴 상태로 남을 수 있어 성능이 좋지 않다.

2. 조정자가 SPOF 가 될 수 있다. 조정자 장애 발생 시 준비 상태인 DB 는 커밋 요청을 무한히 기다린다. 조정자가 복구되면 불확실한 트랜잭션들을 확인해서 재시도한다.

 

2. TC/C - 시도-확정/취소 Try-Confirm/Cancel

두 단계로 구성된 보상 트랜잭션

보상 기반 분산 트랜잭션이라고도 함

 

1. 조정자는 모든 데이터베이스에 트랜잭션에 필요한 자원 예약을 요청

- 모두 OK 를 받으면 모든 데이터베이스에 작업 확인 요청 -> '시도-확정'

- 어느 하나라도 NO 를 받으면, 조정자는 모든 데이터베이스에 작업 취소 요청 -> '시도-취소'

 

2PC 의 두 단계는 한 트랜잭션이지만 TC/C 에서는 각 단계가 별도 트랜잭션이다.

 

1단계 - 시도

조정자 역할을 하는 지갑 서비스가 두 개의 트랜잭션 명령을 두 데이터베이스로 전송한다.

 

  1. 조정자는 계정 A 가 포함된 데이터베이스에 A 의 잔액을 1$ 감소 트랜잭션 시작
  2. 계정 C 가 포함된 DB에는 아무 작업도 하지 않음. NOP 명령 가정 (아무 작업도 하지 않음)

2단계 - 확정

두 디비가 모두 OK 하면 확정 단계 시작

계정 A 의 잔액은 이미 갱신되어 C 만 갱신하면 됌

2단계 - 취소

1단계에서 C 디비에 대한 NOP 작업이 실패할 수도 있음

A 에 다시 1달러를 추가해야 함

 

2PC 에서는 두번째 단계가 시작될 때 트랜잭션 완료 X, 락도 잠겨있는 상태

-> 트랜잭션을 중단하거나 커밋하여 종료

 

TC/C 에서는 두번째 단계가 시작될 때 모든 트랜잭션 완료, 락도 풀린 상태

-> 보상 트랜잭션을 실행하거나 새 트랜잭션 실행

 

TC/C 는 특정 DB에 구애받지 않음

하지만 비즈니스 로직에서 세부 사항을 관리하고 분산 트랜잭션의 복잡성을 처리해야 함

3. 분산 트랜잭션: Saga

선형적 명령 수행

  1. 모든 연산은 순서대로 정렬된다. 각 연산은 자기 데이터베이스에 독립 트랜잭션으로 실행된다.
  2. 연산은 첫번째부터 마지막까지 순서대로 실행된다.
  3. 연산 실패 시 전체 프로세스는 실패한 연산부터 맨 처음 연산까지 역순으로 보상 트랜잭션을 통해 롤백
    -> 보상 트랜잭션을 위한 연산도 준비해야 함

두개의 수직선은 오류가 발생했을 때 시스템이 해야 하는 작업

 

연산 실행 순서 조율 방법

  1. 분산 조율: MSA 에서 사가 분산 트랜잭션에 관한 모든 서비스가 다른 서비스의 이벤트를 구독하여 작업을 수행하는 방식.
    완전히 탈 중앙화된 조율 방식
  2. 중앙 집중형 조율: 하나의 조정자가 모든 서비스가 올바른 순서로 작업을 실행하도록 조율

분산 조율 방식은 서비스가 서로 비동기식으로 통신, 모든 서비스는 다른 서비스가 발생시킨 이벤트의 결과로 어떤 작업을 수행할지 정하기 위해 내부적으로 상태 머신을 유지해야한다.

서비스가 많으면 관리가 어려워진다.

 

TC/C vs Saga

모두 애플리케이션 수준 분산 트랜잭션

사가는 순서대로 실행해야 하지만 TC/C 에서는 병렬로 수행할 수 있다.

지연 시간이 중요하다면 TC/C를, 아니면 사가 써도 됌

 

 

반응형

'스터디' 카테고리의 다른 글

좋은 코드란 무엇인가  (0) 2023.09.24
Comments