Database/Redis

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

noahkim_ 2024. 9. 8. 00:12

0. Replication

동기화

  • replica가 master를 실시간으로 복제함
항목 설명 특징
비동기 복제
- 지연이 낮음
- 백그라운드에서 복제가 이루어짐
복제가 진행되는 동안에도 서비스는 중단 없이 유지됨
다중 레플리카
하나의 Master에 여러 Replica를 연결할 수 있음 
- 읽기 부하 분산
- 고가용성 확보
계단식 복제
Replica가 또 다른 Replica의 Master가 될 수 있음
계층적 구조 구성 가능

 

재연결

  • 연결이 끊겨도 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. 버퍼된 명령 전송 (명령어 스트림 형식)

 

1. Safety of replication when master has persistence turned off 

데이터 유실 시나리오

  • master의 영속성을 끌 경우, replica들도 같은 상태로 동기화됨
  • ➡️ master의 재시작이 모든 노드의 초기화 결과를 야기함

 

2. How Redis replication works

PSYNC 명령어

  • 부분 동기화
  • replica이 자신의 복제 상태를 master에게 알림
  • replication ID + Offset 조합으로 상태를 알림

 

3. Replication ID explained

항목 설명 특징
Replication ID
- master의 복제 관련 고유 식별자
- 무작위 문자열로 생성됨
- 네트워크 분할 시나리오 시 일관성 유지를 위함
- 처음 시작되거나 승격 시 새로 생성됨
- replica는 master에게 상속받음
Secondary Replication ID replica가 승격될 때
- 기존 ReplicationID를 Secondary ReplicationID로 보관

- 새로운 Replication ID를 메인 ID로 새로 생성함
나머지 레플리카와의 동기화를 partial sync로 하기 위함

 

Offset

  • 마스터가 생성한 복제 스트림의 누적 바이트 위치 
  • 데이터셋 변경 시마다 지속적으로 증가함

 

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 처리 방식

  • 마스터와의 일관성을 유지하기 위함
항목 설명
마스터가 만료 처리
- 마스터가 키를 만료시키면, 이를 DEL 명령으로 레플리카에 전달함.
- 레플리카는 스스로 만료하지 않음
레플리카의 논리적 만료 응답
- 레플리카는 TTL이 지난 키에 대해 읽기 요청에 "존재하지 않음"으로 응답 가능
(마스터의 삭제 명령이 도착하지 않았더라도  "존재하지 않음"으로 응답 가능)
Lua 스크립트 실행 중 만료 없음
- Lua 스크립트 실행 중에는 시간이 멈춘 것처럼 동작하여 키가 만료되지 않음.
- 스크립트 실행 내내 키 존재 여부가 일관되게 유지됨

 

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