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
더보기
- replica: master에게 PSYNC 요청
- master: 해당 Offset부터 backlog에서 확인 및 끊긴 이후의 명령들만 전송
- replica: 명령 받아서 적용
동작 흐름) full recynchronization
더보기
master
- 전체 메모리 데이터를 rdb snapshot으로 생성 (background에서 동작)
- 쓰기 명령은 임시로 버퍼에 저장
- 클라이언트가 마스터에 계속해서 쓰기 명령을 보내고 있을 수 있음
- 새로 들어온 명령도 동기화 데이터로 보내져야 하기 때문
- rdb snapshot 생성 완료 시 전송 (bulk string 형식)
- 버퍼된 명령 전송 (명령어 스트림 형식)
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
더보기
상황
- A(master)-B(replica)
- ❗️네트워크 분할
- 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
'Database > Redis' 카테고리의 다른 글
| [Redis] 3-4. Introduction to Redis: Pub/Sub (1) | 2025.06.04 |
|---|---|
| [Spring Data Redis] 1. Redis (0) | 2025.05.14 |
| [Redis][Community Edition] 2-7. Manage Redis: Scale with Redis Cluster (0) | 2024.09.08 |
| [Redis] 2. Understanding Data Types (0) | 2024.09.05 |