레플리케이션
Replication
데이터를 여러 노드에 복제하여 가용성과 내결함성을 높이는 기술. Master-Slave, Multi-Master 방식.
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로 보내세요.