Redis

Redis Cluster

김 정출 2024. 10. 13. 14:05

Redis Cluster

Redis Cluster는 Redis의 분산 데이터 저장 솔루션으로, 데이터의 수평적 확장을 지원합니다. 클러스터 모드에서 Redis는 여러 개의 노드로 구성되어, 데이터와 요청을 여러 서버에 분산하여 처리합니다. 이를 통해 고가용성, 성능 향상 및 장애 조치(failover)를 구현할 수 있습니다.

지난번 Kubernetes에서 Redis Cluster 구성하는 법을 확인해주세요.

https://jeongchul.tistory.com/725

 

Kubernetes Redis Cluster 설치

Redis Cluster는 master를 여러 개 두어 분산 저장(sharding)이 가능하며, Scale-out이 가능합니다.최소 3개의 Master Node가 있어야 구성 가능하며, Sentinel 과 달리 모든 node가 서로 감시하며 failover를 조치합니

jeongchul.tistory.com

 


1. Redis Cluster의 주요 특징

  1. 데이터 분산: Redis Cluster는 데이터의 키를 해시 슬롯에 매핑하여 여러 노드에 분산 저장합니다. 전체 16384개의 슬롯 중에서 각 키는 특정 슬롯에 할당됩니다.
  2. 고가용성: 각 노드는 주 노드와 보조 노드(Replica)로 구성되어 있으며, 주 노드에 장애가 발생하면 보조 노드가 자동으로 주 노드로 승격됩니다.
  3. 자동 파티셔닝: Redis Cluster는 클러스터의 노드가 추가되거나 제거될 때 자동으로 데이터를 재배치하여 데이터의 균형을 유지합니다.
  4. 지속성: Redis는 RDB 스냅샷 또는 AOF(Append Only File)를 통해 데이터를 디스크에 저장할 수 있으며, 클러스터 모드에서도 이러한 지속성 옵션을 사용할 수 있습니다.
  5. 수평 확장: 클러스터에 노드를 추가하여 처리 능력을 향상시킬 수 있습니다. 이로 인해 요청 부하가 증가하더라도 시스템 성능을 유지할 수 있습니다.

2. Redis Cluster의 구조

  • 노드: Redis Cluster는 여러 Redis 서버 인스턴스로 구성됩니다. 각 노드는 데이터를 저장하고 클러스터의 일부로서 요청을 처리합니다.
  • 슬롯: 전체 데이터는 16384개의 슬롯으로 나누어지며, 각 노드는 특정 슬롯을 책임집니다.
  • 마스터 및 슬레이브: 각 노드는 마스터 또는 슬레이브 역할을 맡을 수 있습니다. 마스터 노드는 데이터 쓰기를 처리하고, 슬레이브 노드는 마스터의 복제본을 유지하여 장애 발생 시 데이터 손실을 방지합니다.
  • Master Node:
    • 클러스터 내에서 데이터를 직접 저장하고 수정하는 역할을 합니다.
    • 클라이언트의 읽기 및 쓰기 요청을 처리합니다.
    • 장애 발생 시 Slave 노드로부터 복제된 데이터를 사용하여 요청을 처리합니다.
  • Slave Node:
    • Master의 데이터를 복제하여 보관합니다.
    • Master에 장애가 발생할 경우, Slave가 자동으로 Master로 승격될 수 있습니다.
    • 일반적으로 Slave는 읽기 전용 요청을 처리하여 Master의 부하를 줄이는 데 도움을 줍니다.

redis.conf 살펴보기

  • 먼저, Redis Cluster를 설정하려면 여러 인스턴스를 실행해야 하므로, 각 마스터와 슬레이브마다 서로 다른 포트고유한 디렉토리가 필요합니다. Redis는 하나의 서버에서 여러 인스턴스를 실행할 수 있기 때문에, 각 인스턴스는 별도의 설정 파일을 가지고 있어야 합니다.

Master node 예시

  • 각 마스터 노드는 클러스터의 데이터를 분산 처리할 주체가 됩니다. 아래는 마스터 노드의 설정 예시입니다.

예시: redis-master1.conf

# 일반 설정
port 7000                               # 마스터 노드의 포트 번호
bind 0.0.0.0                            # 외부에서 접근할 수 있도록 설정
cluster-enabled yes                     # Redis Cluster 활성화
cluster-config-file nodes-master1.conf  # 클러스터 노드 정보를 저장할 파일
cluster-node-timeout 5000               # 클러스터 내에서 노드가 다운됐다고 판단하는 시간 (밀리초)
appendonly yes                          # AOF 로그를 사용하여 영구적으로 데이터를 저장
dbfilename dump-master1.rdb             # RDB 파일 이름
dir /path/to/data/redis/master1         # 데이터 파일을 저장할 디렉토리

# 로그 관련 설정
logfile /path/to/log/redis-master1.log  # 로그 파일 위치

마스터 노드를 추가할 때는 동일한 설정을 사용하되, 포트 번호, 로그 파일 경로, 데이터 디렉토리 등의 설정을 다르게 해야 합니다.

예시: redis-master2.conf

port 7001
cluster-config-file nodes-master2.conf
dbfilename dump-master2.rdb
dir /path/to/data/redis/master2
logfile /path/to/log/redis-master2.log

Slave node 예시

각 슬레이브 노드는 특정 마스터의 데이터를 복제합니다. 슬레이브 노드의 설정은 마스터와 유사하지만, 마스터를 따라 복제하도록 설정해야 합니다.

예시: redis-slave1.conf

# 일반 설정
port 7002                               # 슬레이브 노드의 포트 번호
bind 0.0.0.0
cluster-enabled yes
cluster-config-file nodes-slave1.conf   # 클러스터 노드 정보를 저장할 파일
cluster-node-timeout 5000
appendonly yes
dbfilename dump-slave1.rdb
dir /path/to/data/redis/slave1

# 복제 설정
slaveof 127.0.0.1 7000                  # 해당 슬레이브가 복제할 마스터의 IP와 포트
logfile /path/to/log/redis-slave1.log

다른 슬레이브 노드를 설정할 때도 마찬가지로, 각 슬레이브가 복제할 마스터 노드에 맞게 slaveof 지시어와 포트, 로그 파일, 데이터 디렉토리를 다르게 설정해야 합니다.

예시: redis-slave2.conf

port 7003
slaveof 127.0.0.1 7001
cluster-config-file nodes-slave2.conf
dbfilename dump-slave2.rdb
dir /path/to/data/redis/slave2
logfile /path/to/log/redis-slave2.log

클러스터 초기화 및 구성

  1. Redis 인스턴스 시작:
    각 마스터와 슬레이브 노드의 설정 파일에 맞게 Redis 서버를 시작합니다.
redis-server /path/to/redis-master1.conf
redis-server /path/to/redis-master2.conf
redis-server /path/to/redis-slave1.conf
redis-server /path/to/redis-slave2.conf
  1. 클러스터 설정:
    마스터와 슬레이브 노드가 실행된 후, redis-cli를 사용하여 클러스터를 구성합니다. 여기서는 redis-cli --cluster create 명령어를 사용하여 클러스터를 설정합니다.
redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 \
          127.0.0.1:7002 127.0.0.1:7003 \
          --cluster-replicas 1
  • -cluster-replicas 1 옵션은 각 마스터 노드에 대해 1개의 슬레이브를 할당한다는 의미입니다.
  • Redis는 자동으로 슬롯을 마스터 노드에 분배하고, 지정된 마스터에 슬레이브 노드를 할당합니다.
  1. 클러스터 모니터링 및 테스트
  • Redis가 클러스터로 올바르게 구성되었는지 확인하려면 redis-cli를 사용하여 클러스터 상태를 확인할 수 있습니다.
redis-cli -p 7000 cluster info

3. Redis Cluster의 Hash 전략

Redis Cluster에서 데이터의 키를 해싱하는 전략은 해시 슬롯(hash slot)이라는 개념을 사용하여 구현됩니다. 이 해시 슬롯을 통해 데이터가 여러 노드에 균등하게 분산되도록 합니다.

1. 해시 슬롯 개요

  • 슬롯 개수: Redis Cluster는 총 16384개의 해시 슬롯을 사용합니다. 각 키는 이 슬롯 중 하나에 매핑됩니다.
  • 키 해싱: 특정 키를 해시 슬롯에 매핑하기 위해 Redis는 다음의 과정을 수행합니다:
    • 키를 해시 함수에 전달하여 해시 값을 생성합니다.
    • 이 해시 값은 0부터 16383 사이의 정수로 변환되며, 이 결과가 키가 할당될 해시 슬롯의 번호가 됩니다.
    • 해시 슬롯 번호는 다음과 같은 수식으로 계산됩니다:
slot = hash(key) mod 16384

2. 해시 함수

Redis Cluster에서는 SHA1 해시 알고리즘을 사용하여 키를 해싱합니다. 이는 다음과 같은 이유로 선택됩니다:

  • 균등 분포: SHA1 해시 함수는 입력 값에 대해 균등하게 분포된 해시 값을 생성하여 슬롯의 불균형을 방지합니다.
  • 충돌 방지: SHA1은 해시 충돌을 최소화하는 특성을 가지고 있어, 동일한 해시 슬롯에 여러 키가 할당되는 상황을 줄여줍니다.

3. 데이터 분산의 예

예를 들어, 다음과 같은 키들이 있다고 가정해 보겠습니다:

  • user:1001
  • user:1002
  • user:1003

이 키들은 각각 해시 슬롯을 통해 다음과 같이 매핑됩니다:

  1. user:1001 → 해시 슬롯 1234
  2. user:1002 → 해시 슬롯 5678
  3. user:1003 → 해시 슬롯 9101

각 슬롯은 클러스터의 특정 주 노드에 할당되며, 해당 노드가 이 슬롯에 속하는 키에 대한 모든 읽기 및 쓰기 요청을 처리하게 됩니다.

  • 수평적 확장성: 슬롯을 기준으로 데이터를 분산하여, 새로운 노드를 추가할 때 기존 노드에서 일부 슬롯의 데이터를 재분배할 수 있습니다.
  • 부하 균형: 모든 슬롯이 균등하게 분배되므로, 클러스터의 성능을 극대화할 수 있습니다.

4. SLOT error ?

Redis Cluster에서 발생하는 오류 메시지 CROSSSLOT Keys in request don't hash to the same slot는 여러 키를 사용하는 명령이 실행될 때, 각 키가 서로 다른 슬롯에 할당되어 있을 경우 발생하는 오류입니다. Redis Cluster는 데이터 분산을 위해 키를 해시 슬롯에 매핑하여 관리하는데, 여러 키가 포함된 명령을 사용할 때 모든 키가 동일한 해시 슬롯에 있어야만 명령이 성공적으로 실행됩니다.

Redis Cluster의 기본 원리

Redis Cluster는 분산 시스템으로, 데이터를 여러 마스터 노드에 분산시켜 저장합니다. 이를 위해 16384개의 해시 슬롯을 사용하여 각 키를 특정 슬롯에 매핑합니다. 클러스터의 각 노드는 이러한 슬롯 중 일부e를 담당하게 됩니다.

  • 단일 키 명령어: Redis Cluster는 기본적으로 Redis의 단일 키 명령어를 모두 지원합니다. 단일 키 명령어는 특정 키를 사용하는 명령어이므로, 해당 키가 할당된 슬롯을 담당하는 노드로 요청이 자동으로 라우팅됩니다.
  • 다중 키 명령어: 여러 키를 사용하는 명령어(예: MSET, SUNION, SINTER 등)도 지원되지만, 중요한 조건이 있습니다. 모든 키가 동일한 해시 슬롯에 있어야만 해당 명령어가 성공적으로 실행될 수 있습니다.

"CROSSSLOT" 오류의 원인

Redis Cluster에서 다중 키 명령을 사용할 때, 해당 명령에 사용된 키들이 서로 다른 해시 슬롯에 속해 있으면 "CROSSSLOT" 오류가 발생합니다. 예를 들어, SUNION이나 MSET와 같은 명령어에서 여러 키를 다루는 경우, 모든 키가 같은 노드에 있어야 하지만 각 키가 다른 노드에 분산되어 있으면 문제가 발생합니다.

해결 방법

  1. 키 해시 태그 사용: Redis Cluster에서는 다중 키 명령을 사용할 때, 해시 태그를 이용하여 여러 키가 동일한 슬롯에 매핑되도록 할 수 있습니다. 해시 태그는 키의 특정 부분을 해싱하여 동일한 슬롯에 속하도록 하는 방식입니다.
    • 예를 들어, {user}:1001{user}:1002{user} 부분이 동일한 해시 태그로 인식되어 같은 슬롯에 매핑됩니다.
  2. 슬롯 관리: 다중 키 명령을 사용할 경우, 사용되는 모든 키가 동일한 슬롯에 할당되었는지 확인해야 합니다. 이를 위해 해시 태그나 슬롯 재배치를 통해 키의 슬롯을 조정할 수 있습니다.

5. Redis Cluster에서 Failover

Redis Cluster에서 장애 조치(failover)는 Master Node가 다운될 경우 클러스터의 가용성을 유지하기 위해 자동으로 수행되는 과정입니다. 이 과정은 Slave Node를 Master로 승격시키는 방식으로 이루어집니다. 아래에 장애 조치 과정과 주요 개념을 설명하겠습니다.

장애 조치(failover) 과정

  1. 장애 탐지:
    • Redis Cluster는 각 노드 간의 상태를 정기적으로 체크합니다. 이를 위해 노드 간의 하트비트(heartbeat) 메시지를 사용합니다.
    • Master가 다운되거나 응답하지 않으면 클러스터는 해당 노드를 비활성 상태로 간주합니다.
  2. 비활성 노드 확인:
    • 클러스터의 다른 노드는 Master가 다운되었다고 판단한 후, 일정 시간 동안 그 노드가 여전히 비활성 상태인지 확인합니다.
    • 이 과정을 통해 오작동으로 인한 잘못된 장애 인식을 방지합니다.
  3. Slave node 승격:
    • Master가 비활성 상태로 확인되면, 클러스터는 해당 Master에 대한 Slave 중 하나를 선택하여 승격합니다. Slave가 Master로 승격되면, 이 노드는 Master의 데이터 복제본을 기반으로 새로운 Master 역할을 수행합니다.
    • 이 승격 과정은 자동으로 수행되며, 특별한 관리자의 개입 없이 진행됩니다.
  4. 새로운 마스터 설정:
    • 승격된 Slave는 클러스터 내에서 새로운 Master로 등록됩니다.
    • 클러스터는 이를 반영하여 다른 클라이언트가 새로운 Master로 요청을 보낼 수 있도록 합니다.
  5. 슬롯 재배치:
    • Master가 다운되면 해당 노드가 관리하던 슬롯의 소유권이 새로운 Master로 이전됩니다. 이를 통해 클러스터의 모든 슬롯이 항상 하나의 Master에 할당되도록 보장합니다.

6. Master와 Slave 적절한 개수

Redis Cluster에서 마스터(Master)와 슬레이브(Slave)의 최소 및 적절한 개수는 클러스터의 요구사항, 데이터 안전성, 성능 및 가용성에 따라 달라질 수 있습니다. 아래에 기본적인 권장 사항을 설명하겠습니다.

최소 개수

  1. 마스터 노드:
    • 최소 1개: Redis Cluster에서 마스터 노드는 최소 1개 이상 필요합니다. 클러스터의 모든 데이터는 마스터 노드에서 관리되므로, 마스터가 없으면 데이터 저장 및 요청 처리가 불가능합니다.
  2. 슬레이브 노드:
    • 최소 0개: 슬레이브 노드는 선택 사항입니다. 그러나 슬레이브가 없으면 데이터 복제 및 장애 조치(failover) 기능을 활용할 수 없습니다. 따라서 최소 1개의 슬레이브 노드를 두는 것이 일반적입니다.

적당한 개수

  1. 마스터 노드:
    • 2개 이상: 고가용성을 위해 최소 3개의 마스터 노드를 권장합니다. 마스터 노드가 여러 개일 경우, 데이터의 파티셔닝을 통해 부하를 분산하고, 성능을 향상시킬 수 있습니다. 예를 들어, 3개 또는 5개의 마스터 노드를 사용하는 것이 일반적입니다.
  2. 슬레이브 노드:
    • 각 마스터 노드에 대해 최소 1개: 일반적으로 각 마스터 노드에 대해 최소 1개의 슬레이브 노드를 두는 것이 좋습니다. 예를 들어, 3개의 마스터 노드가 있을 경우, 각각에 대해 1개의 슬레이브 노드(총 3개)를 두는 것이 적당합니다.
    • 더 높은 가용성: 추가적인 슬레이브 노드를 설정하여 더 높은 가용성을 원하는 경우, 각 마스터 노드에 2개 이상의 슬레이브 노드를 설정할 수 있습니다. 예를 들어, 각 마스터 노드에 2개의 슬레이브 노드를 두면 총 6개의 슬레이브 노드가 필요합니다.

예시 구성

  • 3개의 마스터, 3개의 슬레이브: 각 마스터에 대해 1개의 슬레이브를 두는 구성입니다. 이 경우, 주 노드의 장애가 발생할 경우, 각 마스터에 대응하는 슬레이브가 주 노드로 승격될 수 있습니다.
  • 5개의 마스터, 5개의 슬레이브: 더 높은 성능과 가용성을 원한다면, 마스터 수를 늘리고 각 마스터에 대해 슬레이브를 배치하는 것이 좋습니다.

7. 장점

  • 성능 향상: 여러 노드에 요청을 분산 처리함으로써 처리 성능이 향상됩니다.
  • 고가용성 및 자동 장애 조치: 주 노드의 장애 시 보조 노드가 자동으로 주 노드로 승격되어 가용성을 유지합니다.
  • 손쉬운 확장: 새로운 노드를 클러스터에 추가하여 시스템 용량을 쉽게 확장할 수 있습니다.

8. 단점

  • 복잡한 설정: Redis Cluster는 단일 인스턴스 Redis보다 설정과 관리가 복잡합니다.
  • 추가적인 오버헤드: 클러스터 간 데이터 전송 시 추가적인 네트워크 오버헤드가 발생할 수 있습니다.
  • 동기화 지연: 마스터와 슬레이브 간 데이터 복제는 동기화 지연이 발생할 수 있습니다.

결론

Redis Cluster는 대규모 데이터 환경에서의 성능과 가용성을 극대화할 수 있는 강력한 솔루션으로, 적절한 사용 사례에 따라 효과적인 데이터 관리 도구가 될 수 있습니다.