248. 분산 트랜잭션 (Distributed Transaction) - 분산 데이터베이스 원자성 여러 노드 데이터 동기화 네트워크 지연 2PC
핵심 인사이트: (물리적 한계를 부수고 우주를 하나로 묶는 마법) "야! 1대의 컴퓨터 쇳덩어리(단일 DB) 안에서 '내 통장에서 돈 빼고 니 통장에 돈 넣는 거(트랜잭션)' 묶어내는 원자성(Atomicity)은 너무 뻔하고 쉽잖아! 근데 우리 회사가 미친 듯이 커져서, '내 통장 DB'는 서울에 있고 '네 통장 DB'는 미국 뉴욕에 있어!! 내가 서울 DB에서 돈 10만 원을 빼고(성공), 태평양 해저 케이블 랜선을 타고 미국 DB로 날아가서 미국 놈 통장에 10만 원을 꽂아야(성능) 해!! 근데 미국 DB에 꽂기 0.01초 전에 태평양 랜선을 상어가 물어뜯어서 끊어지면?! 서울에서 내 돈 10만 원만 증발하고 미국 놈은 돈을 못 받는 반갈죽(모순) 대재앙이 터지잖아!! 당장 서울 서버랑 미국 서버를 거대한 '보이지 않는 밧줄(분산 트랜잭션)'로 하나로 꽁꽁 묶어버려!! 서울이 10만 원 뺐어도, 미국이 10만 원 입금을 실패하면, 그 즉시 서울 서버도 자기가 뺐던 10만 원을 100% 강제 토해내서 태초마을(Rollback)로 되돌리란 말이야!! 태평양을 건너서라도 All or Nothing을 무자비하게 지켜내는 궁극의 원자성 밧줄, 분산 트랜잭션이다!!" 지리적으로 찢어진 DB들을 하나의 영혼으로 합체시키는 극한의 데이터 동기화 마술이다.
Ⅰ. 단일 DB의 평화와 분산(MSA)의 지옥
- 옛날엔 커다란 오라클(Oracle) 서버 1대 안에 회원 테이블, 결제 테이블이 다 있어서 트랜잭션 COMMIT 한 방이면 끝이었습니다.
- 현대의 **마이크로서비스 아키텍처(MSA, 213번)**나 분산 클라우드는 서버를 100개로 찢고 각자 전용 DB를 따로 가지게 만듭니다. 결제 DB는 AWS 코리아에, 배송 DB는 AWS 미국에 둡니다.
Ⅱ. 분산 트랜잭션 (Distributed Transaction)의 개념 🌟
- 개념: 하나의 논리적인 작업(예: 상품 결제 및 배송 지시)을 완료하기 위해, 지리적 또는 물리적으로 서로 떨어져 있는 2개 이상의 독립적인 네트워크 노드(데이터베이스)들에 걸쳐서 분산되어 실행되는 데이터 갱신 작업들을, 마치 단 1대의 DB에서 도는 것처럼 완벽한 원자성(All or Nothing)으로 묶어 통제하는 거시적 트랜잭션 처리 기법입니다.
Ⅲ. 태평양을 건너는 원자성(Atomicity)의 극한 딜레마 🌟 핵심 🌟
왜 이게 악마의 기술이라 불릴까요? 네트워크는 절대 믿을 수 없기 때문입니다.
1. 부분 실패 (Partial Failure)의 끔찍함
- 트랜잭션
T1이 [서울 DB]에서 "내 잔고 -10만"을 치고 성공했습니다. - 이제 [미국 DB]로 넘어가서 "상인 잔고 +10만"을 치려는데, 갑자기 태평양 케이블에서 **네트워크 지연(Network Partition)**이 터지거나 미국 DB가 뻗어버립니다.
- 서울 DB는 "미국 놈이 성공했나? 아씨 나 혼자 COMMIT 찍을까, 아님 취소하고 ROLLBACK 칠까?" 알 길이 없어 영원한 패닉 상태에 빠지고, 돈은 10만 원 증발합니다.
2. 글로벌 락(Lock)의 미친 오버헤드
- 이 에러를 막으려면 서울 DB와 미국 DB 양쪽에 동시에 자물쇠(Lock)를 걸고, 둘 다 완벽하게 성공할 때까지 양쪽 서버의 락을 쥐고 버텨야 합니다.
- 만약 미국 서버가 랜선이 끊겨 대답을 안 하면? 서울 서버는 미국이 대답해 줄 때까지 10시간이든 20시간이든 서울 쪽 엑셀 자물쇠를 풀지 못하고 꽉 쥐고 버티며 서울 고객 100만 명을 무한 대기열(Blocking)에 빠뜨리는 대형 트래픽 참사를 낳습니다.
Ⅳ. 이 지옥을 통제하는 절대 룰 (249번, 252번 스포일러)
- 이 찢어진 노드들을 하나의 밧줄로 엮어 "모두가 예스(Yes)라고 할 때만 다 같이 도장 찍자!"라고 강제하는 심판관 룰이 바로 다음 장(249번)의 **'2단계 커밋(2PC)'**입니다.
- 하지만 2PC를 썼더니 서버가 통째로 멈춰버리는(블로킹) 끔찍한 문제가 터졌고, 현대 MSA 진영은 2PC를 쓰레기통에 박아버리고 비동기 쪽지 통신을 쓰는 **'사가(Saga) 패턴 (252번)'**이라는 완전히 새로운 비동기 분산 트랜잭션 룰을 만들어 클라우드를 정복하게 됩니다.
📢 섹션 요약 비유: **분산 트랜잭션(Distributed Transaction)**은 서울과 뉴욕에 떨어져 있는 두 명의 요원이 0.1초의 오차도 없이 **'정확히 동시에 양쪽 핵폭탄 스위치를 눌러야만 터지는 첩보 작전'**과 같습니다. 옛날 단일 트랜잭션은 요원 1명이 책상 위 버튼 2개를 손가락 두 개로 탁 누르면 끝나는 평화로운 미션(단일 DB)이었습니다. 분산 트랜잭션은 서울의 찰스(결제 DB)와 뉴욕의 제임스(배송 DB)가 위성 전화를 들고 "하나, 둘, 셋! 눌러!" 해야 합니다. 만약 찰스가 "하나, 둘.." 하는 찰나에 위성 전화가 지지직 끊겨버렸습니다(네트워크 장애). 찰스는 버튼을 눌렀는데 제임스는 전화가 끊겨 버튼을 누르지 않았습니다. 서울은 버튼이 눌려 해치가 열렸는데 뉴욕은 안 열려서 폭탄이 역류해 본부가 날아갑니다(데이터 모순 폭발). 거대한 대양을 건너는 네트워크는 필연적으로 지연되고 끊어지는(불안정한) 공간입니다. 이 혼돈의 랜선 속에서 수천 킬로미터 떨어진 서버들이 서로 멱살을 쥐고 **"네가 실패하면 나도 즉시 자폭(ROLLBACK)한다!"라는 피의 서약(All or Nothing)**을 100% 보장하도록 통신 규약을 짜 맞추는 것, 그것이 분산 환경 아키텍트가 직면하는 최고 난이도의 데이터 동기화 지옥입니다.