Redis 확장하기: Redis Cluster 설정 가이드
강력한 인메모리 데이터 구조 저장소인 Redis는 데이터베이스, 캐시, 메시지 브로커로 널리 사용됩니다. 단일 Redis 인스턴스도 상당한 부하를 처리할 수 있지만, 많은 애플리케이션은 결국 증가하는 데이터 볼륨과 트래픽을 수용하기 위해 더 높은 가용성과 수평 확장을 요구합니다. Redis Cluster는 이 두 가지 목표를 달성하기 위한 기본 솔루션을 제공합니다.
이 가이드는 Redis Cluster를 설정하고, 구성하고, 관리하는 과정을 안내합니다. 기본적인 개념을 다루고, 설치 및 구성에 대한 단계별 지침을 제공하며, 클러스터가 견고하고 고성능을 유지하도록 보장하기 위한 필수적인 관리 작업을 논의할 것입니다.
Redis Cluster 개념 이해하기
설정을 시작하기 전에 Redis Cluster의 기반이 되는 핵심 개념을 이해하는 것이 중요합니다.
- 샤딩 (파티셔닝): Redis Cluster는 여러 Redis 노드에 걸쳐 데이터셋을 분할합니다. 각 노드는 해시 슬롯(총 16384개)의 부분 집합을 담당합니다. 클라이언트가 키에 액세스해야 할 때, 클라이언트 라이브러리는 해당 키가 속한 해시 슬롯을 계산하여 적절한 노드로 요청을 보냅니다.
- 복제 (Replication): 고가용성을 위해 클러스터의 각 프라이머리 노드는 하나 이상의 복제본 노드를 가질 수 있습니다. 프라이머리 노드가 실패하면 해당 복제본 중 하나가 승격되어 그 자리를 대신함으로써 다운타임을 최소화합니다.
- 가십 프로토콜 (Gossip Protocol): Redis Cluster 노드들은 가십 프로토콜을 사용하여 서로 통신합니다. 이를 통해 노드들은 서로를 발견하고, 자신의 상태에 대한 정보를 교환하며, 장애를 감지할 수 있습니다.
- 합의 (Consensus): 프라이머리 노드가 실패하면 클러스터는 남아있는 프라이머리 노드들 사이에서 합의에 도달하여 해당 복제본들로부터 새로운 프라이머리를 선출해야 합니다. 이 과정은 클러스터가 계속 작동하도록 보장합니다.
전제 조건
Redis Cluster를 설정하려면 다음이 필요합니다.
- 여러 서버 또는 가상 머신 (운영 환경 준비를 위해서는 최소 6개 노드 권장: 3개 프라이머리 및 3개 복제본).
- 각 서버에 Redis가 설치되어 있어야 합니다. Redis 버전 3.0 이상을 사용하고 있는지 확인하십시오.
- 모든 노드 간의 네트워크 연결. 노드들은 클라이언트 포트와 클러스터 버스 포트(클라이언트 포트 + 10000)를 통해 서로 통신할 수 있어야 합니다.
redis-cli, Redis 명령줄 인터페이스 (클러스터 생성을 위한redis-trib.rb스크립트 포함).
Redis Cluster 설정: 단계별 안내
이 섹션에서는 기본적인 Redis Cluster를 생성하기 위한 실용적인 단계별 가이드를 제공합니다. 단순화를 위해 각 노드에 다른 포트를 사용하여 단일 머신에 클러스터를 설정한다고 가정하겠습니다. 운영 환경에서는 일반적으로 이러한 노드들을 여러 물리적 또는 가상 머신에 분산시킬 것입니다.
1. Redis 설치
Redis가 아직 설치되지 않았다면 운영 체제에 맞는 공식 Redis 설치 가이드를 따르십시오. 예를 들어, Debian/Ubuntu에서는 다음과 같습니다.
sudo apt update
sudo apt install redis-server
2. 클러스터 모드를 위한 Redis 인스턴스 구성
클러스터의 각 노드에는 별도의 Redis 구성 파일이 필요합니다. 각 노드에 대한 디렉토리를 생성하고 기본 redis.conf 파일을 복사하십시오.
이 초기 설정을 위해 복제본이 없는 3개 노드 프라이머리 클러스터를 설정한다고 가정하겠습니다. 포트 7000, 7001, 7002를 사용할 것입니다.
# 각 노드에 대한 디렉토리 생성
mkdir cluster
cd cluster
mkdir 7000 7001 7002
# 각 디렉토리에 redis.conf 복사
cp /etc/redis/redis.conf ./7000/
cp /etc/redis/redis.conf ./7001/
cp /etc/redis/redis.conf ./7002/
이제 각 노드의 구성 파일을 편집하십시오. 7000/redis.conf, 7001/redis.conf, 7002/redis.conf 파일에 다음 변경 사항을 적용하십시오.
port 700X(여기서 X는 0, 1 또는 2)cluster-enabled yescluster-config-file nodes-700X.conf(이 파일은 Redis 자체에 의해 관리되며 수동으로 편집해서는 안 됩니다. 클러스터 상태를 저장합니다.)cluster-node-timeout 5000(노드가 실패한 것으로 간주되는 권장 시간(밀리초)입니다.)appendonly yes(데이터 내구성, 특히 운영 환경에서 권장됩니다.)
7000/redis.conf의 예시:
port 7000
cluster-enabled yes
cluster-config-file nodes-7000.conf
cluster-node-timeout 5000
appendonly yes
# 원격 머신에서 실행되는 경우 bind가 0.0.0.0 또는 올바른 IP로 설정되었는지 확인
bind 0.0.0.0
7001/redis.conf (포트 7001) 및 7002/redis.conf (포트 7002)에도 이 변경 사항들을 반복하십시오.
3. Redis 인스턴스 시작
각 Redis 인스턴스를 해당 구성 파일을 사용하여 시작하십시오.
redis-server ./7000/redis.conf
redis-server ./7001/redis.conf
redis-server ./7002/redis.conf
Redis가 서비스로 실행되고 있다면, 기본 인스턴스를 중지하고 (sudo systemctl stop redis-server) 위와 같이 수동으로 시작하거나 여러 서비스 파일을 구성해야 할 수도 있습니다.
4. redis-trib.rb를 사용하여 클러스터 생성
redis-trib.rb 스크립트는 Redis Cluster 생성을 자동화하는 데 도움이 되는 Ruby gem입니다. Redis 배포판에 포함되어 있습니다.
redis-trib.rb가 위치한 디렉토리로 이동하십시오 (종종 /usr/share/redis/에 있거나 Redis 설치 내에서 찾아야 할 수도 있습니다). Ruby가 설치되어 있지 않다면 설치해야 할 수도 있습니다 (sudo apt install ruby-full).
3개의 마스터 노드로 클러스터를 생성하기 위해 스크립트를 실행하십시오.
# 클러스터 디렉토리에 있거나 전체 경로를 제공했는지 확인
# ruby /path/to/redis/src/redis-trib.rb create --replicas 0 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002
# 또는 redis-trib.rb가 PATH에 있는 경우
redis-trib.rb create --replicas 0 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002
이 명령은 다음과 같습니다.
* create: redis-trib.rb에게 새 클러스터를 생성하도록 지시합니다.
* --replicas 0: 마스터당 0개의 복제본을 원한다고 지정합니다. 운영 설정을 위해서는 --replicas 1 (또는 그 이상)을 사용해야 합니다.
* 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002: 클러스터에 참여할 노드들을 나열합니다.
스크립트가 확인을 요청할 것입니다. yes를 입력하여 진행하십시오. 그러면 각 마스터 노드에 해시 슬롯을 할당하고 클러스터를 구성할 것입니다.
5. 클러스터 확인
redis-trib.rb가 완료된 후 아무 노드에 연결하여 클러스터 상태를 확인할 수 있습니다.
redis-cli -c -p 7000
CLUSTER INFO
CLUSTER NODES
CLUSTER INFO 명령은 cluster_state:ok를 표시해야 합니다. CLUSTER NODES 명령은 클러스터의 모든 노드, 그들의 역할, 그리고 할당된 슬롯을 나열할 것입니다.
팁: redis-cli에 -c 플래그(redis-cli -c)를 사용하여 클러스터 모드를 활성화하십시오. 이는 해시 슬롯 마이그레이션 또는 리디렉션이 필요할 때 redis-cli가 명령을 올바른 노드로 자동 리디렉션하도록 합니다.
기존 클러스터에 복제본 추가하기
고가용성을 위해 복제본을 추가해야 합니다. 포트 7000(마스터) 노드에 대한 복제본을 포트 7003에 추가해 보겠습니다.
- 새 노드 구성: 새 디렉토리(예:
cluster/7003)를 생성하고redis.conf를 복사한 다음, 포트 7003에 맞게 업데이트하고 클러스터 모드를 활성화하며cluster-config-file을 설정하십시오.
ini port 7003 cluster-enabled yes cluster-config-file nodes-7003.conf cluster-node-timeout 5000 appendonly yes bind 0.0.0.0 - 새 노드 시작:
redis-server ./7003/redis.conf -
redis-trib.rb를 사용하여 복제본 추가:redis-cli -c -p 7000을 사용하여 기존 클러스터에 연결하고CLUSTER REPLICATE명령을 사용하거나redis-trib.rb를 다시 사용하십시오.redis-trib.rb를 사용하는 것이 초기 설정에는 일반적으로 더 간단합니다.```bash
redis-trib.rb를 사용하여 노드 7000에 대한 복제본을 추가하는 예시
복제할 마스터의 노드 ID가 필요합니다.
먼저 노드 ID를 얻으십시오: redis-cli -p 7000 CLUSTER NODES
마스터 노드 ID가 'your_master_node_id'라고 가정합니다.
redis-trib.rb --cluster-add-node 127.0.0.1:7003 --cluster-slave --cluster-master-id
127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002
`` *참고*: 노드를 추가하기 위한redis-trib.rb명령은 다소 복잡할 수 있습니다. 복제본을 추가하는 더 간단한 방법은 새 복제본 인스턴스를 먼저 시작한 다음redis-cli를 통해 마스터 노드에 연결하여CLUSTER REPLICATE` 명령을 실행하는 것입니다. 또는
redis-trib.rb를 사용하여 복제본이 있는 기존 클러스터를 재구성할 수 있습니다.```bash
기존 3마스터 클러스터에 복제본을 추가하는 예시
redis-trib.rb replace-node-master --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
```
이 명령은 더 복잡하며 추가 노드(7003, 7004, 7005)를 복제본으로 구성했다고 가정합니다.
6. 클러스터 관리
- 노드 추가/제거: 클러스터를 확장하기 위해 새로운 마스터 노드와 복제본을 추가할 수 있습니다.
redis-trib.rb또는 수동 명령을 사용할 수 있습니다. 노드를 제거하는 것은 먼저 해당 노드에서 슬롯을 마이그레이션해야 합니다. - 페일오버 (Failover): Redis Cluster는 자동으로 페일오버를 처리합니다. 마스터 노드에 접근할 수 없게 되면, 해당 복제본들은 승격하려고 시도할 것입니다.
CLUSTER FAILOVER(복제본에서)를 사용하거나 노드를 중지하여 장애를 시뮬레이션할 수 있습니다. - 슬롯 이동:
CLUSTER SETSLOT <slot> IMPORTING/NODE및MIGRATE명령을 사용하여 마스터 노드 간에 해시 슬롯을 수동으로 이동할 수 있습니다. 이는 클러스터 재조정 또는 노드 제거 준비에 유용합니다.
Redis Cluster 모범 사례
- 최소 6개 노드 사용: 운영 준비가 된 클러스터는 내결함성을 위해 최소 3개의 마스터와 3개의 복제본(마스터당 하나의 복제본)을 가져야 합니다.
- 가용성 영역에 노드 분산: 클라우드 배포의 경우, 영역 수준 장애로부터 보호하기 위해 다른 가용성 영역에 노드를 배치하십시오.
- 클러스터 모니터링: Redis의 모니터링 도구와 외부 모니터링 시스템을 사용하여 성능, 메모리 사용량, 노드 상태를 추적하십시오.
protected-mode no구성: 네트워크에서 Redis Cluster를 실행하는 경우,redis.conf파일에protected-mode no가 설정되어 있는지 확인하고 방화벽을 사용하여 액세스를 제한하십시오.appendonly yes사용: 데이터 내구성을 위해 append-only 파일 지속성이 활성화되어 있는지 확인하십시오.- 클라이언트 라이브러리 지원: Redis 클라이언트 라이브러리가 Redis Cluster를 지원하고 리디렉션을 올바르게 처리하는지 확인하십시오.
결론
Redis Cluster를 설정하는 것은 고가용성과 수평 확장이 필요한 애플리케이션에 있어 중요한 단계입니다. 샤딩, 복제, 클러스터 통신과 같은 핵심 개념을 이해함으로써 견고한 Redis Cluster를 성공적으로 배포하고 관리할 수 있습니다. 최적의 성능과 안정성을 보장하기 위해 클러스터 토폴로지를 계획하고, 상태를 모니터링하며, 모범 사례를 따르는 것을 잊지 마십시오.