🗄️ 데이터베이스

레플리케이션

Replication

데이터를 여러 노드에 복제하여 가용성과 내결함성을 높이는 기술. Master-Slave, Multi-Master 방식.

📖 상세 설명

레플리케이션(Replication)은 데이터베이스의 데이터를 여러 서버에 복제하는 기술입니다. 고가용성(HA), 읽기 부하 분산, 재해 복구(DR)를 위해 사용됩니다. Primary(Master) 서버가 쓰기를 처리하고, Replica(Slave) 서버들이 읽기를 처리하는 것이 일반적입니다.

비동기 레플리케이션은 Primary가 트랜잭션 커밋 후 즉시 응답하고, Replica에 비동기로 전파합니다. 성능은 좋지만 Primary 장애 시 데이터 유실 가능성이 있습니다. 동기 레플리케이션은 Replica 확인 후 커밋하여 데이터 안전성이 높지만 지연이 발생합니다.

반동기(Semi-synchronous) 레플리케이션은 최소 하나의 Replica가 받았음을 확인한 후 커밋합니다. 데이터 안전성과 성능의 균형을 맞추며, MySQL에서 많이 사용됩니다. 그룹 레플리케이션은 여러 노드가 동등하게 쓰기를 처리할 수 있습니다.

복제 지연(Replication Lag)은 Primary와 Replica 간 데이터 차이입니다. 읽기 직후 쓰기 시 최신 데이터가 보이지 않는 문제가 발생할 수 있어, 중요한 읽기는 Primary에서 하거나 지연을 모니터링해야 합니다.

💻 코드 예제

-- MySQL 레플리케이션 상태 확인 (Replica에서)
SHOW REPLICA STATUS\G

-- 복제 지연 확인
SHOW REPLICA STATUS\G
-- Seconds_Behind_Source: 0 이면 동기화 완료

-- PostgreSQL 스트리밍 레플리케이션 설정 (Primary)
-- postgresql.conf
wal_level = replica
max_wal_senders = 3
synchronous_standby_names = 'replica1'

-- Python에서 읽기/쓰기 분리
class DatabaseRouter:
    def __init__(self):
        self.primary = create_engine('mysql://primary/db')
        self.replicas = [
            create_engine('mysql://replica1/db'),
            create_engine('mysql://replica2/db'),
        ]
        self._replica_idx = 0

    def get_write_connection(self):
        return self.primary.connect()

    def get_read_connection(self):
        # 라운드 로빈으로 Replica 선택
        conn = self.replicas[self._replica_idx].connect()
        self._replica_idx = (self._replica_idx + 1) % len(self.replicas)
        return conn

# 사용
router = DatabaseRouter()
with router.get_write_connection() as conn:
    conn.execute("INSERT INTO users (name) VALUES (%s)", ('Alice',))

with router.get_read_connection() as conn:
    result = conn.execute("SELECT * FROM users")

🗣️ 실무 대화 예시

시니어: Primary DB CPU가 80%예요. 읽기 쿼리가 대부분이니 Replica로 분산합시다.

주니어: 읽기를 Replica로 보내면 데이터가 안 맞지 않을까요?

시니어: 복제 지연이 1초 미만이면 대부분 괜찮아요. 단, 쓰기 직후 읽기는 Primary에서 해야 합니다.

면접관: 동기 레플리케이션과 비동기 레플리케이션의 차이점을 설명해주세요.

지원자: 동기 레플리케이션은 Replica가 데이터를 받았음을 확인한 후 커밋하여 데이터 유실이 없지만 지연이 발생합니다. 비동기는 즉시 커밋하여 빠르지만, Primary 장애 시 아직 복제되지 않은 데이터가 유실될 수 있습니다.

면접관: 복제 지연은 어떻게 해결하나요?

지원자: Replica 성능을 높이거나, 병렬 복제를 활성화합니다. 애플리케이션에서는 쓰기 후 읽기를 Primary에서 하거나, 최소 지연 시간을 두고 읽습니다.

리뷰어: 회원가입 직후 로그인에서 "사용자 없음" 에러가 가끔 발생해요.

작성자: 읽기를 Replica에서 하는데 복제 지연 때문인가요?

리뷰어: 네. 가입 직후 읽기는 Primary에서 하거나, session-based routing으로 같은 세션의 읽기를 Primary로 보내세요.

⚠️ 주의사항

🔗 관련 용어

📚 더 배우기