본문 바로가기
J-H-T/Redis

[REDIS-1.2단계] Redis Cluster 구조 이해하기!

by METAVERSE STORY 2026. 8. 15.
반응형

 

 

이 단계가 중요한 이유는 RedisShake가 왜 Redis Cluster에서 Master Shard별로 데이터를 읽어야 하는지가 여기서 결정되기 때문입니다.

🟥 1.2단계 - Redis Cluster 구조 이해하기

먼저 핵심 관계부터 보겠습니다.

Redis Cluster
   │
   ├─ Shard 1
   │    ├─ Master 1
   │    └─ Replica 1
   │
   ├─ Shard 2
   │    ├─ Master 2
   │    └─ Replica 2
   │
   └─ Shard 3
        ├─ Master 3
        └─ Replica 3

전체 데이터
      ↓
16,384개의 Hash Slot으로 분리
      ↓
각 Master Shard에 Slot 분배

Redis Node끼리
      ↕
Cluster Bus로 상태/장애/구성 정보 교환

즉, Shard → Master/Replica → Slot → Cluster Bus 순으로 이해하면 쉽습니다.


 

1.2.1 Master는 무엇인가?

Redis Cluster의 Master는 실제 데이터를 담당하는 Redis 노드입니다.

예를 들어 Master가 3개라면:

                Redis Cluster

       ┌──────────┬──────────┬──────────┐
       │          │          │
       ▼          ▼          ▼

    Master 1   Master 2   Master 3

하지만 세 Master가 똑같은 데이터를 가지고 있는 것이 아닙니다.

Master 1
├─ user:100
├─ user:101
└─ session:555


Master 2
├─ product:100
├─ product:200
└─ cart:300


Master 3
├─ order:500
├─ order:501
└─ payment:800

즉,

Redis Cluster의 Master들은 데이터를 나누어 가지고 있습니다.

이것이 일반 Master/Replica 구조와 가장 큰 차이입니다.


 

1.2.2 Replica는 무엇인가?

Replica는 특정 Master의 데이터를 복제해서 가지고 있는 백업 노드입니다.

예를 들어:

            Shard 1

        ┌────────────┐
        │ Master 1   │
        │            │
        │ Key A      │
        │ Key B      │
        └─────┬──────┘
              │
              │ Replication
              ▼
        ┌────────────┐
        │ Replica 1  │
        │            │
        │ Key A      │
        │ Key B      │
        └────────────┘

Master와 Replica는 같은 데이터를 가지고 있습니다.

따라서:

Master 1 데이터
=
Replica 1 데이터

가 기본 개념입니다.


 

1.2.3 Shard란 무엇인가?

여기서 Shard라는 개념이 중요합니다.

쉽게 말하면:

전체 Redis 데이터를 나누어 담당하는 하나의 데이터 묶음

입니다.

예를 들어:

Redis 전체 데이터

██████████████████████████████

             ↓

        3등분한다고 생각

             ↓

┌──────────┬──────────┬──────────┐
│ Shard 1  │ Shard 2  │ Shard 3  │
│          │          │          │
│ Master1  │ Master2  │ Master3  │
└──────────┴──────────┴──────────┘

다만 Redis는 실제 데이터를 정확히 3등분해서 관리하는 것이 아니라 Hash Slot이라는 단위로 나눕니다.


 

1.2.4 Shard와 Master는 같은 말인가?

엄밀하게는 다릅니다.

예를 들어:

Shard 1
 ├─ Master 1
 └─ Replica 1

입니다.

즉 Shard가 좀 더 큰 개념입니다.

Shard
│
├─ 데이터를 실제 처리하는 Master
│
└─ Master 데이터를 복제하는 Replica

따라서 3 Master + 3 Replica 구성이라면:

Redis Cluster

Shard 1
├─ Master 1
└─ Replica 1


Shard 2
├─ Master 2
└─ Replica 2


Shard 3
├─ Master 3
└─ Replica 3

라고 보는 것이 가장 정확합니다.


 

1.2.5 Redis Cluster에서 왜 Shard가 필요한가?

데이터가 너무 많아 Redis 한 대에 넣기 어렵다고 생각해보겠습니다.

예를 들어 Redis 데이터가 1TB라면:

Redis 1대

1TB 전부 저장

해야 합니다.

메모리가 부족해질 수 있습니다.

Cluster로 나누면:

             1TB

              ↓

     ┌────────┼────────┐

   Shard1   Shard2   Shard3
   약333GB  약333GB  약333GB

처럼 여러 Redis에 분산할 수 있습니다.

그래서 Redis Cluster의 대표적인 목적 중 하나가 Scale-Out입니다.

서버 하나를 엄청 크게 만드는 Scale-Up 대신:

Redis 1대
   ↓

Redis 여러 대

로 확장하는 것입니다.


 

1.2.6 그러면 어떤 Key를 어느 Master에 저장하지?

여기서 Hash Slot이 등장합니다.

Redis Cluster에는 총:

16,384개의 Hash Slot

이 존재합니다.

번호는:

0
1
2
3
...
16382
16383

입니다.

즉:

Slot 0 ~ Slot 16383

총 16,384개

입니다.


1.2.7 Slot을 Master에 나눠준다

Master가 3개 있다고 해보겠습니다.

보통 개념적으로:

Master 1
Slot 0 ~ 5460

Master 2
Slot 5461 ~ 10922

Master 3
Slot 10923 ~ 16383

처럼 나눌 수 있습니다.

그림으로 보면:

전체 Hash Slot

0                                      16383
│                                        │
▼                                        ▼

██████████████████████████████████████████

      ↓ 3개 Master에 분배

┌─────────────┬─────────────┬─────────────┐

     M1              M2             M3

0 ~ 5460       5461 ~ 10922   10923 ~ 16383

Redis Cluster가 정상 서비스하려면 전체 16,384 Slot을 Master들이 담당해야 합니다.


 

1.2.8 Key는 Slot을 어떻게 결정할까?

예를 들어 애플리케이션에서:

SET user:100 kim

을 실행했다고 하겠습니다.

Redis Cluster는 user:100이라는 Key를 계산합니다.

개념적으로:

user:100

   ↓

CRC16 Hash 계산

   ↓

나머지 연산

   ↓

Hash Slot

예: Slot 2500

Redis Cluster의 계산은 개념적으로:

CRC16(Key) MOD 16384

입니다.

그리고 Slot 2500을 담당하는 Master가:

Master 1
Slot 0 ~ 5460

라면:

user:100

   ↓
Slot 2500

   ↓
Master 1

에 저장됩니다.


 

1.2.9 다른 Key를 넣으면?

예:

SET product:500 notebook

계산 결과:

product:500
     ↓
CRC16
     ↓
Slot 7200

이라고 해보겠습니다.

Slot 7200은:

Master 2
Slot 5461 ~ 10922

이므로:

product:500
     ↓
Slot 7200
     ↓
Master 2

에 들어갑니다.

또:

order:999

   ↓

Slot 15000

   ↓

Master 3

가 될 수 있습니다.


 

1.2.10 그래서 실제 데이터 분산은 이렇게 된다

                Redis Cluster

                     │
              16,384 Slots
                     │

        ┌────────────┼────────────┐
        │            │            │
        ▼            ▼            ▼

     Master 1      Master 2      Master 3

    Slot 0~5460   5461~10922   10923~16383

    user:100      product:500   order:999
    login:10      cart:100      payment:30
    session:20    product:501   order:1000

이게 Redis Cluster에서 데이터가 분산되는 핵심 원리입니다.


 

1.2.11 Replica는 Slot을 따로 담당하나?

아닙니다.

이 부분도 중요합니다.

Master 1
Slot 0 ~ 5460

       │
       │ Replication
       ▼

Replica 1
Master 1 데이터 복제

Replica가 독립적으로:

Slot 5461 ~ 7000

같은 것을 추가로 담당하는 개념이 아닙니다.

Replica는 자기가 따라가는 Master의 데이터를 그대로 복제합니다.

따라서:

Shard 1

Master 1
Slot 0~5460
      │
      │ Replication
      ▼
Replica 1
Slot 0~5460의 데이터 복제본

으로 이해하면 됩니다.


 

1.2.12 Master가 장애 나면 어떻게 될까?

예를 들어:

Shard 1

Master 1
   │
   ▼
Replica 1

에서 Master 1이 장애가 났다고 해보겠습니다.

Master 1
   X 장애

Replica 1

Redis Cluster의 다른 노드들이 장애를 판단하고 Replica를 Master로 승격시킬 수 있습니다.

장애 전

Master 1
   │
   ▼
Replica 1


        ↓ 장애


장애 후

Master 1 ❌

Replica 1
   ↓

New Master

새 Master가 기존 Master의 Slot을 이어받습니다.

기존 Master 1

Slot 0 ~ 5460

       ↓

새로운 Master

Slot 0 ~ 5460

그래서 서비스가 계속될 수 있습니다.


 

1.2.13 그런데 누가 Master 장애를 알아차릴까?

여기서 Cluster Bus가 등장합니다.

Redis Cluster의 Redis Node들은 서로 통신합니다.

             Master 1
             ↕      ↖
             ↕        ↖
             ↕          ↖
Master 2  ↔──────────── Master 3
   ↕                       ↕
Replica 2               Replica 3

이 노드들 사이에서 Cluster 상태 정보를 주고받는 통신망을 이해하기 쉽게:

Cluster Bus

라고 생각하면 됩니다.


 

1.2.14 Cluster Bus가 하는 일

Cluster Bus에서는 대표적으로 이런 정보를 주고받습니다.

"나 정상이다"
"Master 1이 응답하지 않는다"
"현재 내가 담당하는 Slot은 이것이다"
"저 Node가 Master다"
"저 Node가 Replica다"
"Failover가 필요하다"
"새 Master가 선출되었다"

즉 애플리케이션 데이터 자체를 주고받기 위한 통신이라기보다 Redis Cluster를 관리하기 위한 Node 간 통신입니다.


 

1.2.15 일반 Redis Port와 Cluster Bus Port

예를 들어 Redis Port가:

6379

라면 일반적인 Redis OSS Cluster 구성에서 Cluster Bus 포트는 기본적으로:

6379 + 10000

= 16379

가 됩니다.

즉:

6379
→ Client / Redis 명령 통신

16379
→ Redis Node 간 Cluster Bus 통신

입니다.

예:

Application
     │
     │ TCP 6379
     ▼
 Redis Master


 Redis Master 1
     │
     │ TCP 16379
     ▼
 Redis Master 2

이라고 이해하면 쉽습니다.


 

1.2.16 K8s에서는 이게 왜 중요한가? ⭐

온프레미스 K8s이기 때문에 굉장히 중요합니다.

예를 들어:

Worker Node 1
└─ redis-0

Worker Node 2
└─ redis-1

Worker Node 3
└─ redis-2

라고 해보겠습니다.

Redis Cluster 노드끼리:

redis-0 ↔ redis-1
redis-0 ↔ redis-2
redis-1 ↔ redis-2

통신할 수 있어야 합니다.

따라서 NetworkPolicy나 방화벽이 존재한다면 최소한 Redis 구성에 따라:

6379
Cluster Bus Port

통신을 확인해야 합니다.

다만 Cluster Bus port를 단순히 항상 6379+10000이라고 고정해서 설계하면 안 되고, 실제 cluster-port 설정을 확인하는 것이 안전합니다.


 

1.2.17 Redis Cluster 전체를 그림 하나로 합쳐보자

현재 가장 일반적인 3 Master + 3 Replica 구조라고 하겠습니다.

                    Redis Cluster
                총 16,384 Hash Slots


 ┌─────────────────────────────────────────────┐
 │                                             │
 │                   Shard 1                   │
 │                                             │
 │       ┌───────────────────────┐             │
 │       │ Master 1              │             │
 │       │ Slot 0 ~ 5460         │             │
 │       └───────────┬───────────┘             │
 │                   │ Replication             │
 │                   ▼                         │
 │       ┌───────────────────────┐             │
 │       │ Replica 1             │             │
 │       └───────────────────────┘             │
 │                                             │
 └─────────────────────────────────────────────┘


 ┌─────────────────────────────────────────────┐
 │                   Shard 2                   │
 │                                             │
 │       ┌───────────────────────┐             │
 │       │ Master 2              │             │
 │       │ Slot 5461 ~ 10922     │             │
 │       └───────────┬───────────┘             │
 │                   │ Replication             │
 │                   ▼                         │
 │       ┌───────────────────────┐             │
 │       │ Replica 2             │             │
 │       └───────────────────────┘             │
 │                                             │
 └─────────────────────────────────────────────┘


 ┌─────────────────────────────────────────────┐
 │                   Shard 3                   │
 │                                             │
 │       ┌───────────────────────┐             │
 │       │ Master 3              │             │
 │       │ Slot 10923 ~ 16383    │             │
 │       └───────────┬───────────┘             │
 │                   │ Replication             │
 │                   ▼                         │
 │       ┌───────────────────────┐             │
 │       │ Replica 3             │             │
 │       └───────────────────────┘             │
 │                                             │
 └─────────────────────────────────────────────┘

그리고 모든 Redis Node는 Cluster Bus를 통해 서로 상태를 교환합니다.

                Cluster Bus

 Master 1 ←────────────────→ Master 2
    ↑                           ↑
    │                           │
    │                           │
    ↓                           ↓
 Replica 1                   Replica 2

       ↖                     ↗
         ↖                 ↗
           Master 3
              ↕
           Replica 3

 

1.2.18 여기서 RedisShake를 붙이면?

드디어 RedisShake와 연결됩니다.

Source가 Redis Cluster라면 데이터 전체가 Master 1에 존재하지 않습니다.

Master 1
약 1/3

Master 2
약 1/3

Master 3
약 1/3

따라서 이렇게 하면 안 됩니다.

RedisShake
    │
    ▼
Master 1

→ 전체 데이터가 아님

RedisShake는 Cluster topology를 파악하고 각 Source Shard의 Master에서 데이터를 읽어야 합니다.

개념적으로:

                Source Redis Cluster

              16,384 Hash Slots

        ┌─────────┬─────────┬─────────┐
        │         │         │
        ▼         ▼         ▼

     Master 1   Master 2   Master 3
     Shard 1    Shard 2    Shard 3
        │         │         │
        │         │         │
        └────┐    │    ┌────┘
             │    │    │
             ▼    ▼    ▼

          ┌──────────────┐
          │ RedisShake   │
          │              │
          │ Reader 1     │
          │ Reader 2     │
          │ Reader 3     │
          └──────┬───────┘
                 │
                 ▼

            Target Redis

바로 이 이유 때문에 앞 단계에서:

[sync_reader]
cluster = true

가 중요했던 것입니다.


 

1.2.19 K8s까지 포함한 환경 그림

사용자 환경 형태로 그리면:

                 On-Premises Kubernetes

┌─────────────────────────────────────────────────────────┐
│                                                         │
│                 Source Redis Cluster                    │
│                                                         │
│ Worker Node A      Worker Node B      Worker Node C     │
│                                                         │
│  redis-0            redis-1            redis-2          │
│  Master             Master             Master           │
│  Slot 0~5460        Slot 5461~10922    Slot 10923~16383 │
│     │                  │                  │              │
│     │                  │                  │              │
│  redis-3            redis-4            redis-5          │
│  Replica             Replica             Replica         │
│                                                         │
│       Redis Node ↔ Cluster Bus ↔ Redis Node             │
│                                                         │
│                    │                                    │
│                    │ PSync                              │
│                    ▼                                    │
│             ┌───────────────┐                           │
│             │ RedisShake    │                           │
│             │ Pod           │                           │
│             └───────┬───────┘                           │
│                     │                                   │
│                     ▼                                   │
│              Target Redis Cluster                       │
│                                                         │
└─────────────────────────────────────────────────────────┘


1.2.20 Service와 Cluster Bus는 다른 개념이다

이 부분은 K8s에서 특히 헷갈립니다.

Kubernetes의:

Service

와 Redis의:

Cluster Bus

는 전혀 다른 것입니다.

Kubernetes Service

Application
     │
     ▼
K8s Service
     │
     ▼
Redis Pod

Pod에 안정적인 접속 Endpoint를 제공합니다.

Redis Cluster Bus

Redis Pod
    ↕
Redis Pod
    ↕
Redis Pod

Redis Cluster Node끼리 Cluster 상태를 주고받는 프로토콜입니다.

따라서:

구분목적
K8s Service Client → Redis 접근
Headless Service Redis Pod별 DNS/Discovery
Redis Port Redis 명령 처리
Cluster Bus Redis Node 간 Cluster 관리 통신

서로 섞어 이해하면 안 됩니다.


 

1.2.21 Cluster Bus가 데이터 복제도 하나?

여기도 많이 헷갈리는 부분입니다.

아닙니다.

Master → Replica

의 실제 Redis 데이터 복제와:

Node ↔ Node
Cluster Bus

는 목적이 다릅니다.

쉽게 구분하면:

Redis Replication

Master
  │
  │ 실제 데이터
  ▼
Replica

반면:

Cluster Bus

Master 1
   ↕
Master 2

"나 살아 있음"
"저 노드 장애"
"Slot 담당 변경"
"Failover 진행"

입니다.


 

1.2.22 초보자가 가장 헷갈리는 4가지만 비교

개념쉽게 말하면예
Master 실제 데이터를 담당하는 Redis Master1
Replica Master 데이터 복제본 Replica1
Shard 하나의 데이터 분할 영역 Master1 + Replica1
Slot 어떤 Shard에 Key를 보낼지 결정하는 번호 0~16383
Cluster Bus Redis Node끼리 상태를 공유하는 내부 통신 장애감지/Failover

 

1.2.23 가장 쉬운 비유 🏢

Redis Cluster를 대형 물류센터라고 생각해보겠습니다.

전체 물건 번호가:

0 ~ 16383

개 있다고 해보겠습니다.

Shard

물류창고 구역입니다.

A창고
B창고
C창고

Slot

각 창고가 담당하는 물품 번호입니다.

A창고
0 ~ 5460

B창고
5461 ~ 10922

C창고
10923 ~ 16383

Master

각 창고의 실제 담당자입니다.

A창고 관리자
Master 1

Replica

관리자에게 문제가 생겼을 때 대신할 부관리자입니다.

Master 1
   │
   ▼
Replica 1

Cluster Bus

관리자들끼리 사용하는 내부 무전망입니다.

Master 1:
"A창고 정상!"

Master 2:
"B창고 정상!"

Master 3:
"Master 1 응답 없어!"

→ 장애 판단
→ Replica 1을 Master로 승격

RedisShake는 이 물류센터의 물건을 새 물류센터로 이전하는 업체와 비슷합니다.

A창고 ─┐
B창고 ─┼─→ RedisShake → 새 Redis Cluster
C창고 ─┘

한 창고만 복사해서는 전체 데이터가 아니기 때문에 모든 Shard의 Master 데이터를 가져와야 하는 것입니다.


 

🎯 1.2단계 핵심 정리

이 관계만 확실하게 기억하시면 됩니다.

                 Redis Cluster

               16,384 Slots
                     │
          ┌──────────┼──────────┐
          │          │          │
          ▼          ▼          ▼

       Shard 1    Shard 2    Shard 3
          │          │          │

       Master1    Master2    Master3
          │          │          │
       Replica1   Replica2   Replica3

          ↕          ↕          ↕
             Cluster Bus

① Slot
0~16383, 총 16,384개이며 Key가 어느 Master에 저장될지를 결정합니다.

② Shard
Redis 데이터를 나눈 논리적인 영역입니다.

③ Master
해당 Shard의 Slot과 실제 데이터를 담당합니다.

④ Replica
해당 Master의 데이터를 복제하고 장애 발생 시 Master로 승격될 수 있습니다.

⑤ Cluster Bus
Redis Node들이 서로 생존 상태, Slot 정보, Failover 정보를 주고받는 내부 통신입니다.

그리고 RedisShake 관점에서 제일 중요한 결론은:

Redis Cluster에서는 데이터가 여러 Master Shard에 나눠져 있기 때문에 RedisShake가 전체 Cluster topology를 파악하고 각 Shard의 데이터를 가져와야 한다.

이제 1.3단계에서는 K8s 환경을 기준으로 redis-0 ~ redis-5 + StatefulSet + PVC + Headless Service + 일반 Service가 어떻게 연결되는지를 보는 것이 가장 자연스럽습니다. 여기까지 이해하면 그다음부터 RedisShake 설정 YAML과 shake.toml을 실제 구조에 맞춰 들어갈 수 있습니다.

 

 

반응형

댓글