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