에포크 기반 낙관적 동시성 제어
지리 복제 데이터베이스에서 커밋마다 광역 왕복을 치르는 대신, 에포크 단위로 검증과 복제를 묶고 충돌한 트랜잭션만 결정론적으로 재실행하는 설계를 정리합니다.
조정 단위를 트랜잭션에서 에포크로 올리면, 광역 왕복 비용이 트랜잭션 수가 아니라 에포크 수에 비례합니다.
커밋 경로에 끼어드는 광역 왕복
여러 리전에 리더를 두는 다중 리더(multi-leader) 데이터베이스는 어느 리전에서든 쓰기를 받아 가용성을 높입니다. 대신 모든 복제본에 걸쳐 ACID를 지켜야 하므로 전역 동시성 제어가 필요합니다. 그 동기화 프로토콜은 대개 여러 라운드의 통신을 요구하고, 라운드 한 번마다 광역 네트워크(Wide-Area Network, WAN) 지연이 커밋 경로에 더해집니다.
기존 해법은 조정을 언제 치르느냐로 갈립니다.
| 접근 | 대표 시스템 | 순서 결정 근거 | 왕복이 발생하는 지점 |
|---|---|---|---|
| 물리 시계 기반 2PC | Spanner | TrueTime 불확실성 구간만큼 대기 | 커밋마다 |
| 사전 결정론적 정렬 | Calvin | 시퀀서가 배치 전체 순서를 미리 확정 | 시퀀싱 단계 |
| 전통적 OCC | 일반 OCC 시스템 | 커밋 시점 검증, 충돌하면 abort | 검증 단계, 충돌 시 재시도 추가 |
셋 다 조정 시점만 다를 뿐 커밋 경로 어딘가에 왕복이 남습니다. Mao 외(2026, arXiv:2602.21566)가 제안한 Minerva는 조정 자체를 커밋 경로에서 떼어내는 쪽을 택합니다.
에포크로 묶는 커밋과 복제
낙관적 동시성 제어(Optimistic Concurrency Control, OCC)는 트랜잭션을 락 없이 실행합니다. 커밋 직전에 읽은 데이터가 그사이 바뀌었는지 검증하고, 바뀌었으면 abort시켜 재시도합니다. 지리 분산 환경에서는 이 검증을 어디서 하느냐가 문제가 됩니다. 검증이 원격 리전의 상태를 봐야 한다면 커밋 경로에 다시 왕복이 들어옵니다.
Minerva는 검증 단위를 트랜잭션에서 에포크(epoch)로 올립니다. 시간을 고정 길이 구간으로 자르고(논문 설정값 15ms), 각 복제본은 로컬에서 트랜잭션을 즉시 실행하고 커밋합니다. 커밋된 트랜잭션의 write-set은 에포크 단위로 모여 다른 리전으로 전송됩니다. 전송은 4MB 크기 임계값과 5ms 타임아웃 중 먼저 걸리는 조건으로 트리거되므로, 데이터 전파 타이밍이 커밋 타이밍과 분리됩니다.
효과는 조정 횟수의 단위가 바뀐다는 데 있습니다. 커밋마다 왕복을 치르면 조정 비용이 트랜잭션 수에 비례하지만, 에포크마다 한 번 교환하면 에포크 수에 비례합니다. 15ms 안에 수천 건이 커밋되는 부하에서는 이 차이가 그대로 처리량 차이로 나타납니다.
대가는 충돌 발견이 늦어진다는 점입니다. 서로 다른 리전이 같은 레코드를 각자 갱신하고 각자 커밋할 수 있습니다. 이 사실은 에포크 경계에서 write-set을 교환할 때에야 드러나므로, 이미 커밋된 트랜잭션 사이의 충돌을 사후에 처리해야 합니다.
Abort 대신 결정론적 재실행
전통적 OCC라면 여기서 충돌한 트랜잭션을 abort시킵니다. Minerva는 재실행을 택하고, 에포크 커밋 시점에 다섯 단계를 거칩니다.
체인(transaction chain)은 같은 배치 안에서 의존 관계로 이어진 트랜잭션 묶음입니다. 개별 트랜잭션이 아니라 체인 단위로 판정하므로, 앞선 트랜잭션이 무효가 되면 뒤따르는 트랜잭션도 함께 무효 후보가 됩니다.
Staleness 검사는 체인의 read-set에 담긴 항목의 epoch id가 현재 epoch id보다 낡았는지, 또는 선행 트랜잭션이 abort됐는지를 봅니다. 판정 기준은 타임스탬프가 아니라 epoch id입니다. 물리 시계를 비교하지 않으므로 Network Time Protocol(NTP) 동기화 오차가 판정에 끼어들지 않습니다.
충돌 그래프는 체인을 정점으로 놓고, 체인 쌍 사이의 write-write 또는 read-write 충돌을 간선으로 놓습니다. 정점 가중치는 그 체인에 든 트랜잭션 수입니다. 여기서 최대 가중치 독립 집합(Maximum Weight Independent Set, MWIS)을 구합니다. 서로 충돌하지 않으면서 살아남는 트랜잭션 수가 가장 많은 부분집합이 나옵니다. 충돌률이 낮으면 정수 선형계획법(Integer Linear Programming, ILP)으로 정확해를, 높으면 greedy 근사해를 씁니다.
독립 집합에 들지 못한 체인은 재실행합니다. 정렬 기준은 트랜잭션 id(tid)와 원본 복제본의 정적 우선순위입니다. 모든 복제본이 같은 규칙으로 정렬하므로 별도 합의 없이 같은 순서에 도달합니다. 재실행은 Calvin 방식의 결정론적 락킹으로 처리되고, 이 시점에는 read/write set이 이미 알려져 있어 교착이 생기지 않습니다.
Calvin과의 차이는 결정론을 적용하는 범위입니다. Calvin은 실행 전에 모든 트랜잭션의 read/write set을 알아야 하지만, Minerva는 일단 실행한 뒤 충돌이 확인된 트랜잭션만 결정론적 재실행 대상으로 좁힙니다.
충돌률에 따라 이동하는 비용
논문의 Table 1은 500ms 지연 환경의 포화 상태에서 에포크 커밋 시간을 구간별로 나눕니다.
| 구간 | 낮은 충돌 (2%) | 높은 충돌 (48%) |
|---|---|---|
| 전체 에포크 커밋 | 32.46ms | 32.5ms |
| 충돌 처리 소계 | 17.34ms | 10.09ms |
| MWIS 계산 | 2.27ms | 2.16ms |
| OCC write-set 적용 | 10.56ms | 4.18ms |
| 재실행 | 0.76ms | 17.53ms |
총 시간은 두 경우 모두 약 32.5ms로 거의 같은데, 그 안에서 비용이 이동합니다. 충돌이 드물면 staleness 확인과 그래프 구성(각각 6.84ms, 5.62ms)에 비용이 몰리고 재실행은 1ms 미만입니다. 충돌이 잦으면 재실행이 17.53ms로 전체의 절반을 넘습니다.
MWIS 최적화는 충돌이 적을 때 불필요한 abort를 막는 장치이고, 충돌이 많아지면 시스템은 최적화 대신 재실행 비용을 감내하는 쪽으로 무게를 옮깁니다.
재실행이 얼마나 발생하는지는 워크로드의 접근 분포가 정합니다. YCSB-A에 Zipfian 분포를 준 실험(논문 그림 10)에서 계수가 올라갈수록 재실행 비율이 늘어납니다.
| Zipfian 계수 | 재실행 비율 |
|---|---|
| 0.3 (낮은 충돌) | 약 5% |
| 0.7 (중간 충돌) | 약 30% |
| 1.2 이상 (높은 충돌) | 약 35%, high-contention mode 전환 |
계수 1.2를 넘으면 MWIS 계산을 우회하는 별도 모드가 켜집니다. 재실행 비율이 35% 부근에서 더 오르지 않는 것은 이 모드가 상한을 걸기 때문입니다.
어떤 워크로드에서 이기는가
논문의 비교 대상은 세 그룹입니다. 지리 복제 다중 리더 데이터베이스(GeoGauss, Ocean Vista, CockroachDB), 에포크 기반 시스템(COCO), 결정론적 데이터베이스(CalvinDB)입니다. TPC-C로 측정한 처리량은 왕복시간(Round-Trip Time, RTT)이 커질수록 격차가 벌어집니다.
| RTT | Minerva | CalvinDB | GeoGauss | COCO | CockroachDB | Ocean Vista |
|---|---|---|---|---|---|---|
| 0ms | 10,000+ | 9,400 | 9,800 | 4,500 | 4,800 | 3,200 |
| 50ms | 8,500 | 5,600 | 6,500 | 2,100 | 1,200 | 2,900 |
| 200ms | 6,000 | 1,600 | 1,560 | 800 | 400 | 1,200 |
단위는 txns/sec이고, 논문 그림 6에서 읽은 근사값입니다. RTT 0ms에서는 CalvinDB, GeoGauss와 큰 차이가 없지만 200ms에서는 CalvinDB 대비 약 3.8배가 됩니다. 에포크로 묶는 설계의 이득이 왕복 지연에 비례한다는 뜻이므로, 리전 간 RTT가 수 ms 수준인 배치에서는 도입할 이유가 약합니다.
복제본 수에 대한 확장성도 같은 방향입니다. 복제본 15개 구성에서 Minerva는 약 12,000 txns/s를 기록했습니다. CalvinDB(약 8,000)의 1.5배, GeoGauss와 COCO, CockroachDB(약 3,000)의 4배입니다. 지연은 복제본을 3개에서 15개로 늘려도 TPC-C 기준 17ms에서 18ms로 거의 변하지 않았습니다.
적용 조건은 둘로 요약됩니다. 리전 간 RTT가 충분히 커서 커밋마다 치르는 왕복이 지배적이어야 하고, 충돌률이 재실행 비용을 감당할 수준이어야 합니다. 어느 쪽이든 커밋 확정은 에포크 경계에서 이뤄지므로, 개별 트랜잭션의 응답 시간이 최우선인 워크로드에는 맞지 않습니다.
같은 형태의 문제는 트랜잭션 계층 바깥에도 있습니다. 토스증권은 데이터센터 이중화를 위해 Kafka를 Active-Active로 구성하면서 양방향 미러링 루프를 겪었습니다. DC1의 메시지가 DC2로 복제되면 DC2가 이를 신규 데이터로 인식해 다시 DC1으로 보내는 구조였고, 메시지 헤더에 source DC 정보를 태깅해 재전송을 끊었습니다.
두 사례는 매 요청마다 원격과 조정하는 대신, 각 이벤트나 트랜잭션에 출처를 판별할 메타데이터를 심어 두고 로컬에서 판정한다는 점이 같습니다. Minerva의 epoch id도 데이터가 어느 시점 것인지 표시하는 태그입니다. 차이는 보장 수준입니다. 메시징 계층은 최종적 일관성으로 충분하지만, Minerva는 재실행이라는 수단으로 직렬화 가능성(serializability)까지 끌고 갑니다.
남는 제약
MWIS는 일반적으로 NP-hard 문제입니다. 충돌 그래프가 조밀해지는 초고충돌 워크로드에서는 근사해를 구하는 비용도 무시하기 어렵습니다. 논문은 high-contention mode로 이를 우회하지만, 전환 임계값이 Zipfian 1.2 부근으로 잡힌 근거는 해당 실험 분포에 한정됩니다. 다른 접근 분포에서도 같은 임계값이 통하는지는 확인되지 않았습니다.
에포크 길이 15ms도 논문의 실험 네트워크에 맞춘 값입니다. RTT가 이보다 훨씬 크면 에포크 하나에 담기는 트랜잭션이 늘어 충돌 처리 비용이 커집니다. 반대로 훨씬 작으면 에포크가 만드는 지연이 왕복 절약분을 넘어섭니다. 실제 배치에서는 RTT와 커밋 지연 목표를 놓고 다시 잡아야 하는 값입니다.
정렬 규칙도 공짜가 아닙니다. tid와 복제본 우선순위로 순서를 정하면 NTP 의존성은 사라지지만, 우선순위가 낮은 리전의 트랜잭션이 재실행에서 반복적으로 밀릴 여지가 생깁니다. 리전 간 공정성 문제로 이어지는지는 논문이 다루지 않았습니다.
정리
에포크 기반 OCC는 조정 단위를 트랜잭션에서 에포크로 올려 커밋 경로에서 광역 왕복을 걷어냅니다. 뒤늦게 드러난 충돌은 abort 대신 충돌 그래프의 MWIS로 살릴 체인을 고르고, 나머지만 tid와 복제본 우선순위 순서로 결정론적으로 재실행합니다. Minerva 실험에서 이 설계는 RTT 200ms 구간에서 CalvinDB 대비 약 3.8배 처리량을 유지했습니다. 복제본을 3개에서 15개로 늘려도 지연은 17ms에서 18ms로 거의 변하지 않았습니다.
대신 충돌이 잦아지면 비용이 재실행 쪽으로 옮겨 가고, 커밋 확정 시점은 에포크 경계에 묶입니다. 리전 간 RTT가 크고 개별 응답 시간보다 처리량이 중요한 워크로드가 이 설계의 적용 범위입니다.