Database/Redis

[Redis][Community Edition] 2-6. Manage Redis: Replication

noahkim_ 2024. 9. 8. 00:12

1. Replication

  • master의 데이터를 replica가 실시간으로 복제하는 기능
  • ✅ 비동기 복제: master는 클라이언트 요청을 먼저 처리한 뒤 번경된 내용에 대한 이벤트를 명령 스트림 형태로 replica에 전달함
  •  계층적 구조: Replica가 또 다른 Replica의 Master가 될 수 있음

 

2. 재연결

  • master와 replica의 연결이 끊어져도 replica는 자동으로 master에 재연결을 시도함
  • ➡️ 재연결에 성공하면, 복제 상태를 확인한 후 두가지 방식 중 하나로 동기화를 시도함

 

복구 방식

항목 Partial Recynchronization Full Recynchronization
동작 조건 연결이 일시적으로 끊겼다가 재연결될 때
Replica가 처음 연결되거나, 복제 기록이 손실된 경우
복구 방식 끊긴 기간 동안 놓친 명령만 복구 전체 데이터를 다시 전송
사용 데이터 replication backlog RDB 스냅샷
네트워크 사용량 적음 매우 큼 (RDB 생성 및 전송 필요)
Redis 흐름 PSYNC <replicationid> <offset> 성공 응답 PSYNC 실패 → FULLRESYNC 수행

 

동작 흐름) partial recynchronization

더보기
  1. replica: master에게 PSYNC 요청
  2. master: 해당 Offset부터 backlog에서 확인 및 끊긴 이후의 명령들만 전송
  3. replica: 명령 받아서 적용

 

동작 흐름) full recynchronization

더보기

replica

  1. Full Sync 요청

 

master

  1. rdb snapshot 생성 (전체 메모리 데이터. background에서 동작)
    • snapshot 생성중에도 쓰기 요청 처리
    • 기존 데이터에는 즉시 반영되고 동시에 복제 버퍼에 저장됨
      • 클라이언트가 마스터에 계속해서 쓰기 명령을 보내고 있을 수 있음
      • 새로 들어온 명령도 동기화 데이터로 보내져야 하기 때문 
  2. rdb snapshot 생성 완료 시 전송 (bulk string 형식)
  3. 버퍼된 명령 전송 (명령어 스트림 형식)

 

PSYNC 명령어

  • 부분 재동기화 시도 명령어
  • ✅ replica이 자신의 복제 상태를 master에게 알림 (상태값: replication ID + Offset)

 

3. Replication ID explained

  • replica가 어느 복제 이력을 어디까지 반영했는지 판단함
항목 설명 특징
Replication ID master의 복제 히스토리 식별자 Replica와 Master가 같은 복제 계보를 공유하는지 확인
Secondary Replication ID 현재 Master가 과거에 Replica였을 때, 공유하던 이전 Master의 Replication ID failover 후에도 기존 Replica가 Partial Resynchronization을 시도할 수 있도록 지원

 

예시) Secondary Replication ID

더보기

상황:❗️A(master)-B(replica) 사이의 네트워크 분할 발생

  1. 장애 조치로 B가 새로운 master로 승격됨
    • B는 승격과 동시에 새로운 Replicaion ID를 발급받음
    • 동시에 지곤 Master A의 Replication ID를 Secondary Replication ID로 보관함
  2. 이후 C가 B에 연결하면서 A 시절의 Replication ID와 Offset으로 PSYNC를 요청함
  3. B는 요청받은 ID가 자신의 Secondary Replication ID인지 확인함
  4. 요청한 Offset이후의 데이터가 Replication Backlog에 남아있다면, 누락된 명령에 대해 Partial Resynchronization 수행

 

Offset

  • master가 생성한 replication stream의 누적 바이트 위치
  • ✅ 데이터셋 변경 시마다 지속적으로 증가함
  • ➡️ 복제 스트림을 지금까지 몇 바이트까지 생성했는지 나타냄

 

4. Diskless replication

  • Full Sync시 RDB 스냅샷 파일을 디스크에 만들지 않고, 바로 레플리카에 전송하는 기법
  • ✅ 디스크 I/O 감소 (SSD가 없거나 디스크 병목이 있는 환경에서 유용)
  • ⚠️ 실패 시 재시도 비용이 큼
  • ⚠️ RDB 백업용 파일 없음

 

5. Configuration

복제) redis.conf

더보기

복제

replicaof 192.168.1.1 6379
  • 레플리카 서버의 설정 파일에 마스터 host 및 port를 설정

 

부분 동기화) redis.conf

더보기
repl-backlog-size 1mb           # 백로그 메모리 크기
repl-backlog-ttl 3600           # 레플리카가 몇 초간 끊겨도 유지할지

 

Diskless replication) redis.conf

더보기
repl-diskless-sync yes                 # 디스크 없이 RDB를 직접 전송
repl-diskless-sync-delay 5            # 첫 번째 레플리카 도착 후 5초 동안 대기, 더 많은 레플리카가 붙을 수 있도록

 

복제) 명령어 

더보기
REPLICAOF 192.168.1.1 6379
  • 동적으로 명령어 실행을 통해 동기화 가능

 

6. Read-only replica

  • 레플리카는 기본적으로 읽기 전용
  • writable replica를 허용 (단, 권장되지 않음)

 

7. Setting a replica to authenticate to a master 

  • 마스터가 인증을 요구할 경우, 레플리카는 마스터 연결 시 인증해야 함

 

마스터) 비밀번호 설정

더보기
requirepass mysecretpass

 

레플리카) 마스터 인증 명령어

더보기
redis-cli CONFIG SET masterauth <비밀번호>

 

레플리카) 마스터 인증 설정

더보기
masterauth <비밀번호>

 

8. Allow writes only with N attached replicas 

  • 데이터 안정성을 보장하는 안전장치
  • 일정 수의 레플리카가 연결되어 있어야만 쓰기 허용
  • 레플리카는 메초 마스터에게 ping으로 자신의 정보를 보냄
  • 조건 불충족 시, 쓰기 명령 자체가 거부됨

 

설정) 쓰기 허용 조건

더보기
min-replicas-to-write 2
min-replicas-max-lag 3

 

9. How Redis replication deals with expires on keys

TTL 처리 방식

  • master에서 expire를 처리하고, replication stream을 통해 replica로 전파됨
  • ✅ 레플리카의 논리적 만료 응답: 레플리카는 TTL이 지난 키에 대해 아직 DEL 명령을 받지 못했더라도 존재하지 않았다 응답함
  • ✅ Lua Script 실행 중 만료 없음: 스크립트 실행 내 키 존재 여부를 일관적으로 유지함

 

10. Configuring replication in Docker and NAT 

  • 마스터는 연결된 레플리카의 ip/port 정보를 INFO replication or ROLE 명령으로 출력함
    • Docker or NAT의 경우, 해당 ip정보는 내부에서 사용되는 것.
    • 외부에서 접속하는 ip와 다를 수 있음
  • 레플리카의 외부 ip를 설정 파일에 명시해야 함
    • sentinel, monitoring system, cluster manager은 레플리카에 접근 못함

 

설정) redis.conf

더보기
replica-announce-ip 5.5.5.5
replica-announce-port 1234

 

설정 항목 설명
replica-announce-ip
마스터에 보고할 레플리카의 실제 공개 IP 또는 도메인
replica-announce-port
마스터에 보고할 실제 외부 포트 (포트 포워딩된 값)

 

11. The INFO and ROLE command 

  • 복제 상태를 확인할 수 있는 명령어

 

INFO Replication

  • Redis의 일반적인 상태 정보를 확인할 수 있는 명령어 (레플리카 수, offset, lag, replication ID 등)
  • 모니터링 및 디버깅에 사용됨

 

예시) Master

더보기
role:master
connected_slaves:2
slave0:ip=192.168.1.10,port=6379,state=online,offset=123456,lag=0
slave1:ip=192.168.1.11,port=6379,state=online,offset=123123,lag=1
master_replid:abcdef...
master_repl_offset:123456

 

ROLE

  • 컴퓨터 친화적인 출력 (JSON-like)
  • 마스터/레플리카/센티넬에 따라 출력 구조 달라짐

 

예시) Master

더보기
1) "master"
2) (integer) 123456       # 현재 replication offset
3) 1) 1) "192.168.1.10"   # 연결된 레플리카 목록
      2) "6379"
      3) "123123"         # 해당 레플리카의 offset