Redis Primary-Replica 복제 설정 가이드
Redis 복제는 고가용성, 데이터 중복성 및 읽기 확장성을 달성하기 위한 기본적인 패턴입니다. Primary(이전에는 master라고 불림)와 하나 이상의 Replica(이전에는 slave라고 불림)를 설정하면 Primary에 기록된 데이터가 연결된 모든 Replica에 자동으로 복사되는 것을 보장할 수 있습니다.
이 가이드에서는 Redis Primary-Replica 복제를 구성하는 포괄적인 단계별 튜토리얼을 제공합니다. 견고하고 안정적인 Redis 배포를 구축하는 데 필요한 필수 구성 지시문, 동적 구성 방법 및 중요한 모니터링 단계를 다룰 것입니다.
1. Redis 복제 기본 사항 이해
Redis 복제는 비동기식(Primary가 Replica의 쓰기 승인을 기다리지 않음)이므로 높은 성능을 제공합니다. 주로 초기 동기화와 지속적인 동기화의 두 단계로 작동합니다.
전체 동기화 (SYNC)
Replica가 처음으로 Primary에 연결되거나 부분 재동기화를 방해하는 네트워크 중단 후에는 전체 동기화가 발생합니다:
- Replica가 Primary에
PSYNC명령을 보냅니다. - Primary는 RDB 스냅샷 파일(
.rdb)을 생성하기 위해 백그라운드 저장 프로세스를 시작합니다. - Primary는 RDB가 생성되는 동안 수신된 모든 새 쓰기 명령을 버퍼링합니다.
- RDB 파일이 완료되면 Primary는 Replica로 이를 보냅니다.
- Replica는 RDB 파일을 메모리로 로드합니다.
- 마지막으로 Primary는 버퍼링된 모든 쓰기 명령을 Replica로 보내 동기화를 완료합니다.
부분 재동기화 (PSYNC)
Redis 2.8 이상은 부분 재동기화를 지원합니다. Primary와 Replica 간의 연결이 잠시 끊어지면 Replica는 복제 백로그 버퍼(Primary의 구성 가능한 순환 버퍼)를 사용하여 링크가 끊어진 이후의 누락된 명령만 요청할 수 있습니다.
2. 사전 요구 사항 및 설정
복제를 구성하기 전에 최소 두 개의 별도 Redis 인스턴스가 실행 중인지(또는 테스트를 위해 동일한 서버에서 다른 포트로 실행 중인 별도 구성) 확인하십시오.
이 가이드에서는 다음 설정을 가정합니다:
| 인스턴스 | 역할 | IP 주소 | 포트 | 구성 파일 |
|---|---|---|---|---|
| Primary | Primary | 192.168.1.100 | 6379 | redis-primary.conf |
| Replica 1 | Replica | 192.168.1.101 | 6380 | redis-replica-1.conf |
단계 2.1: Primary 인스턴스 구성
Primary 인스턴스가 Replica의 연결을 수락할 준비가 되었는지, 그리고 Primary 자체의 안정성을 위해 지속성(RDB 또는 AOF)을 관리하도록 구성되었는지 확인하십시오.
주요 Primary 설정:
- 바인딩: 여러 머신에서 실행하는 경우 Primary가 공개 IP 주소 또는
0.0.0.0에 바인딩되었는지 확인하십시오. 방화벽을 사용하는 경우 Replica IP에 대해 포트 6379가 열려 있는지 확인하십시오. - 지속성: 복제 자체에 엄격하게 필요하지는 않지만, Primary 데이터 지속성을 위해 RDB/AOF를 활성화하는 것이 좋습니다.
# redis-primary.conf
port 6379
bind 0.0.0.0 # 모든 인터페이스에 바인딩 (외부 Replica에 필요)
# RDB 지속성 활성화
save 900 1
save 300 10
save 60 10000
단계 2.2: Replica 인스턴스 구성
Replica 설Up의 핵심은 replicaof 지시문에 있습니다. 이 지시문은 인스턴스에 데이터 동기화를 수행할 Primary를 알려줍니다.
주요 Replica 설정:
- 포트: 동일한 머신에서 실행하는 경우 다른 포트를 사용하십시오.
- 복제 지시문:
replicaof또는slaveof(이전 이름)를 사용하십시오.
# redis-replica-1.conf
port 6380
# *** 필수 복제 구성 ***
replicaof 192.168.1.100 6379
# Replica는 읽기 전용으로 유지 (Redis 5부터 기본값)
replica-read-only yes
# Sentinel/Cluster가 HA를 처리하는 경우 Replica의 지속성 비활성화 권장
# 빠른 재시작을 위해 지속성이 필요한 경우 활성화 상태로 유지.
save ""
참고: Primary에 비밀번호가 설정되어 있는 경우(
requirepass), Replica는 성공적으로 인증하기 위해masterauth <password>로 구성해야 합니다.
3. 구현 방법
구성 파일(redis.conf)을 편집하고 서버를 다시 시작하거나, CONFIG SET 명령을 사용하여 동적으로 복제 구성을 구현할 수 있습니다.
방법 3.1: 구성 파일 (프로덕션 권장)
위와 같이 redis-replica-1.conf를 업데이트한 후 두 인스턴스를 시작하십시오:
# Primary 시작
redis-server redis-primary.conf
# Replica 1 시작
redis-server redis-replica-1.conf
시작 시 Replica 1은 즉시 Primary(192.168.1.100:6379)에 연결을 시도하고 동기화 프로세스를 시작합니다.
방법 3.2: 동적 구성
Redis 인스턴스가 이미 실행 중이고 다시 시작하지 않고 Replica로 구성하려는 경우, redis-cli를 통해 CONFIG SET을 사용하십시오.
-
Replica로 전환하려는 인스턴스에 연결합니다 (예제에서는 6380 포트에서 실행 중):
bash redis-cli -p 6380 -
복제 명령을 실행합니다:
bash 127.0.0.1:6380> replicaof 192.168.1.100 6379 OK
6380 포트의 인스턴스는 이전 데이터를 삭제하고 새 Primary와의 전체 동기화(SYNC)를 시작합니다.
⚠️ 경고: 복제 비활성화
Replica를 독립적인 Primary 인스턴스로 되돌리려면 해당 인스턴스에서
replicaof no one을 실행하십시오.
4. 복제 상태 모니터링
데이터 일관성을 보장하려면 연결 상태를 모니터링하는 것이 중요합니다. Primary와 Replica 모두에서 redis-cli를 통해 INFO replication 명령을 사용하십시오.
4.1 Primary 상태 확인
Primary(6379)에 연결하여 연결된 Replica 수와 상태를 확인하십시오:
redis-cli -p 6379 INFO replication
예상 출력 스니펫 (Primary):
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.1.101,port=6380,state=online,offset=2048,lag=0
master_replid:a9b1c2...
master_replid2:000000...
master_repl_offset:2048
role:master는 역할이 Master임을 확인합니다.connected_slaves:1은 Replica가 인식되었음을 확인합니다.state=online은 원하는 안정적인 상태입니다.lag=0(또는 매우 낮은 숫자)은 성공적인 동기식 데이터 전송 성능을 나타냅니다.
4.2 Replica 상태 확인
Replica(6380)에 연결하여 Primary 링크 상태를 확인하십시오:
redis-cli -p 6380 INFO replication
예상 출력 스니펫 (Replica):
# Replication
role:slave
master_host:192.168.1.100
master_port:6379
master_link_status:up
master_sync_in_progress:0
slave_priority:100
slave_read_only:1
role:slave는 역할이 Slave임을 확인합니다.master_link_status:up은 연결이 활성 상태이고 정상임을 확인합니다.master_sync_in_progress:0은 초기 동기화가 완료되었음을 의미합니다.
5. 복제 모범 사례 및 최적화
5.1 복제 읽기 전용 모드
기본적으로 Replica는 읽기 전용입니다 (replica-read-only yes). 이는 중요한 안전 메커니즘입니다. Replica에 쓰려고 시도하면 오류가 발생하여 클러스터 전체의 데이터 일관성을 보장합니다.
읽기 전용 모드를 비활성화하면 Replica에 대한 모든 쓰기는 로컬이며, 복제 링크가 끊어지고 전체 동기화가 발생하면 덮어쓰여집니다.
5.2 동기화 시간 최적화
데이터 세트가 매우 큰 경우 초기 SYNC 프로세스가 느릴 수 있습니다. 다음 요소를 고려하십시오:
- 네트워크 대역폭: RDB 전송을 위한 Primary와 Replica 간의 충분한 대역폭을 확보하십시오.
- RDB 생성: Primary는 RDB 파일을 생성하기 위해 CPU 및 디스크 I/O가 필요합니다. 동기화 중에 서버에 사용 가능한 리소스가 있는지 확인하십시오.
- Replica의 디스크 지속성 비활성화 (선택 사항): Primary가 모든 지속성을 처리하고 Replica가 읽기 확장 전용인 경우, Replica에서
save ""로 설정하면 RDB 파일을 쓰는 I/O 오버헤드를 피하여 재시작 속도를 높일 수 있습니다.
5.3 보안 및 네트워크 구성
Primary가 복제 포트(6379 또는 다른 포트)를 인터넷에 공개하지 않는 것이 중요합니다. 방화벽 규칙을 구성하여 지정된 Replica 서버의 IP 주소에서만 복제 트래픽을 허용하십시오.
5.4 읽기 확장성을 위해 Replica 사용
복제의 주요 이점은 읽기 부하를 분산하는 것입니다. 주로 읽기 작업을 수행하는 애플리케이션을 Replica 인스턴스로 지시하고, 쓰기 작업은 Primary에 예약하여 전체 시스템 처리량을 향상시키십시오.
결론
Redis Primary-Replica 복제를 설정하는 것은 탄력적이고 고성능 애플리케이션을 구축하는 데 필수적입니다. replicaof 지시문을 올바르게 구성하고 INFO replication을 사용하여 링크 상태를 정기적으로 모니터링하면 고가용성과 효과적인 읽기 확장성의 기반을 마련할 수 있습니다.
이 가이드에서는 기본 설정에 중점을 두었지만, 프로덕션 환경에서는 일반적으로 자동 Primary 승격 및 장애 감지를 위한 Redis Sentinel 또는 여러 노드에 걸친 데이터의 자동 파티셔닝 및 분산을 위한 Redis Cluster와 같은 추가 자동화 계층을 통합합니다.