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. 재연결

  • 연결이 끊겨도 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

더보기

master

  1. 전체 메모리 데이터를 rdb snapshot으로 생성 (background에서 동작)
  2. 쓰기 명령은 임시로 버퍼에 저장
    • 클라이언트가 마스터에 계속해서 쓰기 명령을 보내고 있을 수 있음
    • 새로 들어온 명령도 동기화 데이터로 보내져야 하기 때문 
  3. rdb snapshot 생성 완료 시 전송 (bulk string 형식)
  4. 버퍼된 명령 전송 (명령어 스트림 형식)

 

PSYNC 명령어

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

 

3. Replication ID explained

항목 설명 특징
Replication ID master의 복제 히스토리 식별자 복제 계보가 갈릴 수 있는 상황에서 어떤 history인지 구분하기 위해 필요
Secondary Replication ID 승격된 replica가 승격전에 master와 공유하던 과거 replication id failover 후에도 다른 replica들이 예전 master의 partial sync를 시도하기 위해 필요함

 

예시) Secondary Replication ID

더보기

상황

  1. A(master)-B(replica)
  2. ❗️네트워크 분할
  3. B가 master로 승격됨
  • ✅ 승격된 B는 old master인 A의 replication ID를 secondary ID로 보관
  •  다른 replicas들은 A 시절의 ID와 offset으로 B에게 PSYNC를 시도함
  • ➡️ B의 최신상태까지 partial resync를 시도할 수 있음

 

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