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
더보기
- replica: master에게 PSYNC 요청
- master: 해당 Offset부터 backlog에서 확인 및 끊긴 이후의 명령들만 전송
- replica: 명령 받아서 적용
동작 흐름) full recynchronization
더보기
replica
- Full Sync 요청
master
- rdb snapshot 생성 (전체 메모리 데이터. background에서 동작)
- snapshot 생성중에도 쓰기 요청 처리
- 기존 데이터에는 즉시 반영되고 동시에 복제 버퍼에 저장됨
- 클라이언트가 마스터에 계속해서 쓰기 명령을 보내고 있을 수 있음
- 새로 들어온 명령도 동기화 데이터로 보내져야 하기 때문
- rdb snapshot 생성 완료 시 전송 (bulk string 형식)
- 버퍼된 명령 전송 (명령어 스트림 형식)
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) 사이의 네트워크 분할 발생
- 장애 조치로 B가 새로운 master로 승격됨
- B는 승격과 동시에 새로운 Replicaion ID를 발급받음
- 동시에 지곤 Master A의 Replication ID를 Secondary Replication ID로 보관함
- 이후 C가 B에 연결하면서 A 시절의 Replication ID와 Offset으로 PSYNC를 요청함
- B는 요청받은 ID가 자신의 Secondary Replication ID인지 확인함
- 요청한 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
'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 |