Redis 복제 및 고가용성)
5.1 Redis Master-Slave Replication 개념 및 설정
Redis의 Master-Slave Replication은 데이터를 복제하여 고가용성을 제공하는 방식입니다. Master 노드는 데이터를 쓰고, Slave 노드는 Master의 데이터를 복제합니다. 이 구조는 데이터를 여러 서버에 분산시켜 장애 발생 시 빠른 복구를 가능하게 합니다.
Master-Slave Replication 설정
Master와 Slave 노드를 설정하려면, redis.conf
파일에서 replicaof
옵션을 사용하여 Slave 서버가 Master 서버를 복제하도록 지정합니다.
- Master 서버에서는 별다른 설정 없이 Redis를 실행합니다.
- Slave 서버에서는
replicaof
옵션을 설정합니다.
# Master 서버
$ redis-server
# Slave 서버
$ redis-server --replicaof <Master_IP> <Master_Port>
Slave는 Master의 데이터를 주기적으로 복제하며, Master에 대한 쓰기 작업을 전달받습니다. 복제된 데이터는 읽기 전용으로 사용할 수 있습니다.
5.2 Redis Sentinel을 활용한 자동 장애 조치 (Failover)
Redis Sentinel은 Redis의 고가용성 구성 요소로, 자동 장애 조치 및 모니터링을 제공합니다. Sentinel은 Master 서버의 상태를 지속적으로 모니터링하며, Master 서버에 장애가 발생하면 자동으로 Slave 서버를 Master로 승격시킵니다.
Sentinel 구성
- Sentinel 설정 파일을 생성합니다. 보통
sentinel.conf
라는 이름으로 저장됩니다. - Sentinel 구성 예시:
port 26379
dir /tmp
sentinel monitor mymaster <Master_IP> <Master_Port> 2
sentinel auth-pass mymaster <password>
sentinel down-after-milliseconds mymaster 10000
sentinel failover-timeout mymaster 180000
sentinel parallel-syncs mymaster 1
sentinel monitor
: Sentinel이 모니터링할 Master의 이름, IP, 포트, 그리고 Slave 수를 지정합니다.sentinel auth-pass
: Redis의 인증 비밀번호 설정.sentinel down-after-milliseconds
: Master가 응답하지 않을 때 장애로 간주할 시간 (밀리초 단위).sentinel failover-timeout
: 장애 복구 시 대기 시간.sentinel parallel-syncs
: 장애 조치 중 복제할 Slave의 수.
Sentinel 시작
Sentinel은 별도로 실행해야 하며, 복제된 Redis 인스턴스의 상태를 모니터링하고 장애가 발생할 경우 자동으로 Master를 전환합니다.
$ redis-server /path/to/sentinel.conf --sentinel
5.3 Sentinel 설정 및 실무 운영 예제
Sentinel 실무 운영 예시
-
Sentinel 배치: 최소 3개의 Sentinel 인스턴스를 배포하여 고가용성을 보장합니다. 각 Sentinel은 Master 서버의 상태를 독립적으로 모니터링하며, 한 Sentinel에서 장애를 감지하면 다른 Sentinel이 이를 검증하여 자동 장애 조치를 수행합니다.
-
장애 조치 시나리오:
- Master가 다운되면, Sentinel이 자동으로 장애를 감지합니다.
- Sentinel은 Slave 중 하나를 Master로 승격시킵니다.
- 클라이언트는 새로운 Master에 자동으로 연결됩니다.
- 기존 Master가 복구되면, 다시 Slave로 전환할 수 있습니다.
예시 시나리오
- Master 서버가 장애를 겪으면, Sentinel은 10초 후 장애를 감지하고 Failover를 실행합니다.
- Sentinel이 선택한 Slave 서버가 Master로 승격됩니다.
- 클라이언트는 새로운 Master에 자동으로 연결되며, 서비스를 지속적으로 이용할 수 있습니다.
5.4 Redis Cluster 개념 및 데이터 샤딩 (Sharding)
Redis Cluster는 데이터를 샤딩(Sharding)하여 여러 Redis 노드에 분산 저장하는 방식입니다. Redis Cluster는 수평 확장을 통해 데이터를 분산하고, 이를 통해 고가용성과 성능을 향상시킵니다.
Redis Cluster 구성
Redis Cluster는 여러 Redis 노드를 설정하여 데이터가 분산 저장되도록 합니다. 각 Redis 노드는 16384개의 **슬롯(slot)**에 데이터를 나누어 저장합니다.
- Cluster 노드 구성:
- 최소 3개의 Master 노드와 각 Master에 대해 1개 이상의 Slave 노드를 배포해야 합니다.
redis.conf
파일에서cluster-enabled yes
옵션을 활성화하여 Redis Cluster를 사용하도록 설정합니다.
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
- 클러스터 노드 시작: 여러 Redis 노드를 클러스터 모드로 실행합니다. 예를 들어, 3개의 노드를 클러스터로 구성하려면 각 노드를 다음과 같이 실행합니다.
$ redis-server /path/to/redis.conf --cluster-enabled yes
클러스터 만들기
클러스터를 만들려면 여러 Redis 인스턴스를 클러스터로 연결해야 합니다.
$ redis-cli --cluster create <node1> <node2> <node3> --cluster-replicas 1
위 명령어는 3개의 Master 노드와 각 Master에 1개의 Replica 노드를 생성합니다.
5.5 CLUSTER
명령어와 클러스터 운영 방법
CLUSTER
명령어
Redis Cluster의 운영을 위한 다양한 명령어가 제공됩니다. 가장 중요한 명령어는 다음과 같습니다:
CLUSTER INFO
: 클러스터의 상태 정보를 출력합니다.CLUSTER NODES
: 클러스터 내 모든 노드에 대한 정보를 출력합니다.CLUSTER SLOTS
: 각 노드에 할당된 슬롯 범위를 출력합니다.
예시:
$ redis-cli CLUSTER INFO
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
클러스터 운영 방법
- 노드 추가: 클러스터에 노드를 추가하려면
CLUSTER MEET
명령어를 사용합니다.
$ redis-cli -c -h <host> -p <port> CLUSTER MEET <new_node_ip> <new_node_port>
- 슬롯 이동: Redis Cluster는 데이터를 16384개의 슬롯에 분배하므로, 데이터를 다른 노드로 이동할 수 있습니다.
$ redis-cli -c CLUSTER MOVESLOT <slot_number> <destination_node_id>
- 클러스터 상태 확인:
CLUSTER NODES
명령어로 클러스터의 상태를 확인할 수 있습니다.
$ redis-cli CLUSTER NODES
Redis Cluster는 수평 확장이 가능하고, 장애 조치 및 복제 기능이 내장되어 있어 고가용성과 성능을 극대화할 수 있습니다.