🗄️ 데이터베이스

다중 마스터 복제

Multi-Master Replication

여러 노드에서 쓰기 가능. 충돌 해결 필요.

📖 상세 설명

다중 마스터 복제(Multi-Master Replication)는 여러 노드가 동시에 쓰기 작업을 받을 수 있는 데이터베이스 복제 방식입니다. 주-복제본 방식과 달리 모든 노드가 마스터 역할을 수행하여 쓰기 병목을 분산시킵니다.

가장 큰 도전은 충돌 해결(Conflict Resolution)입니다. 같은 데이터가 여러 노드에서 동시에 수정되면 충돌이 발생합니다. 해결 방식으로 Last Write Wins(타임스탬프 기준), Custom Resolution(애플리케이션 정의 로직), CRDT(Conflict-free Replicated Data Types) 등이 있습니다.

지리적으로 분산된 서비스에서 각 지역에서 쓰기 지연 없이 작업할 때 유용합니다. CockroachDB, YugabyteDB, Galera Cluster(MySQL) 등이 지원합니다.

💻 코드 예제

-- Galera Cluster (MySQL Multi-Master) 설정 예시
-- wsrep.cnf
[mysqld]
wsrep_on=ON
wsrep_cluster_name="my_cluster"
wsrep_cluster_address="gcomm://node1,node2,node3"
wsrep_node_name="node1"
wsrep_provider=/usr/lib/libgalera_smm.so

-- 모든 노드에서 쓰기 가능
-- Node 1에서
INSERT INTO users (name) VALUES ('Alice');

-- Node 2에서 (동시)
INSERT INTO users (name) VALUES ('Bob');

-- 충돌 발생 시나리오
-- Node 1: UPDATE products SET stock = 10 WHERE id = 1;
-- Node 2: UPDATE products SET stock = 5 WHERE id = 1;
-- Last Write Wins 또는 애플리케이션 정의 로직 필요

# Python: 충돌 감지 및 재시도 패턴
def update_with_conflict_retry(product_id, new_stock, max_retries=3):
    for attempt in range(max_retries):
        try:
            with db.begin():
                product = db.query("SELECT * FROM products WHERE id = %s FOR UPDATE", product_id)
                # 낙관적 락: version 체크
                db.execute("""
                    UPDATE products
                    SET stock = %s, version = version + 1
                    WHERE id = %s AND version = %s
                """, (new_stock, product_id, product['version']))
                if db.rowcount == 0:
                    raise ConflictError("Version mismatch")
            return True
        except ConflictError:
            time.sleep(0.1 * (2 ** attempt))
    raise Exception("Max retries exceeded")

🗣️ 실무 대화 예시

아키텍트: "미국, 유럽, 아시아 3개 리전에서 쓰기 지연 없이 서비스해야 해요."

DBA: "다중 마스터 복제가 필요하겠네요. CockroachDB나 YugabyteDB 검토해볼까요?"

아키텍트: "충돌은 어떻게 처리하죠?"

DBA: "사용자 프로필 같은 건 Last Write Wins로 충분하고, 재고나 결제는 분산 트랜잭션으로 강한 일관성 유지하면 됩니다."

면접관: "Multi-Master와 Primary-Replica 방식의 차이점과 선택 기준을 설명해주세요."

지원자: "Primary-Replica는 단일 쓰기 포인트로 간단하지만 쓰기 병목이 생깁니다. Multi-Master는 여러 노드에서 쓰기 가능해 확장성이 높지만 충돌 해결이 복잡합니다. 글로벌 서비스나 고가용성이 필요할 때 Multi-Master를 선택합니다."

면접관: "충돌 해결 경험이 있나요?"

지원자: "사용자 설정은 LWW, 재고는 CRDT의 Counter 타입, 주문은 분산 트랜잭션으로 처리했습니다."

리뷰어: "이 로직 보면 두 노드에서 동시에 같은 쿠폰을 사용하면 둘 다 성공할 수 있어요."

개발자: "아, Multi-Master라서 각 노드에서 로컬로 처리되니까요..."

리뷰어: "맞아요. 쿠폰 사용은 분산 락이나 글로벌 시퀀스 필요해요. 또는 특정 쿠폰은 특정 노드에서만 처리하도록 라우팅하는 방법도 있고요."

개발자: "분산 락으로 처리하고, 타임아웃 설정 추가하겠습니다."

⚠️ 주의사항

🔗 관련 용어

📚 더 배우기