[Daily morning study] Redis Cluster ๊ตฌ์ฑ๊ณผ Failover
#daily morning study
Redis Cluster๋
Redis Cluster๋ ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฌ ๋ ธ๋์ ์๋์ผ๋ก ๋ถ์ฐ ์ ์ฅํ๋ ๋ถ์ฐ Redis ๊ตฌ์ฑ์ด๋ค. ๋จ์ผ Redis ์ธ์คํด์ค์ ํ๊ณ์ธ ๋ฉ๋ชจ๋ฆฌ ์ฉ๋๊ณผ ์ฒ๋ฆฌ๋์ ์ํ ํ์ฅ์ผ๋ก ๊ทน๋ณตํ๋ฉด์, ์ผ๋ถ ๋ ธ๋ ์ฅ์ ์๋ ์๋น์ค๊ฐ ๊ณ์๋๋๋ก ๊ณ ๊ฐ์ฉ์ฑ์ ์ ๊ณตํ๋ค.
ํต์ฌ ํน์ง:
- ์๋ ์ค๋ฉ: ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฌ ๋ ธ๋์ ๋ถ์ฐ
- ๊ณ ๊ฐ์ฉ์ฑ: ์ผ๋ถ ๋ ธ๋ ์ฅ์ ์ ์๋ Failover
- ์ ํ ํ์ฅ: ๋ ธ๋ ์ถ๊ฐ๋ก ์ฑ๋ฅยท์ฉ๋ ํ์ฅ ๊ฐ๋ฅ
ํด์ ์ฌ๋กฏ (Hash Slot)
Redis Cluster๋ ๋ฐ์ดํฐ๋ฅผ 16384๊ฐ์ ํด์ ์ฌ๋กฏ์ผ๋ก ๋๋ ์ ๊ด๋ฆฌํ๋ค. ๊ฐ ๋ง์คํฐ ๋ ธ๋๊ฐ ์ฌ๋กฏ์ ์ผ๋ถ ๋ฒ์๋ฅผ ๋ด๋นํ๋ ๋ฐฉ์์ด๋ค.
ํค๋ฅผ ์ด๋ ์ฌ๋กฏ์ ์ ์ฅํ ์ง ๊ณ์ฐํ๋ ๊ณต์:
slot = CRC16(key) % 16384
3๊ฐ์ ๋ง์คํฐ ๋ ธ๋๊ฐ ์๋ค๋ฉด ์ฌ๋กฏ์ด ์ด๋ ๊ฒ ๋๋๋ค:
| ๋ ธ๋ | ๋ด๋น ์ฌ๋กฏ ๋ฒ์ |
|---|---|
| Node A | 0 ~ 5460 |
| Node B | 5461 ~ 10922 |
| Node C | 10923 ~ 16383 |
ํด๋ผ์ด์ธํธ๊ฐ ํน์ ํค๋ฅผ ์ฝ๊ฑฐ๋ ์ฐ๋ ค ํ ๋, ํด๋น ์ฌ๋กฏ์ ๋ด๋นํ๋ ๋
ธ๋์ ์์ฒญ์ ๋ณด๋ด์ผ ํ๋ค. ์๋ชป๋ ๋
ธ๋์ ์์ฒญํ๋ฉด MOVED ๋ฆฌ๋ค์ด๋ ์
์๋ต์ด ์จ๋ค.
MOVED 3999 127.0.0.1:6381
๋๋ถ๋ถ์ Redis ํด๋ผ์ด์ธํธ๋ ์ด ๋ฆฌ๋ค์ด๋ ์ ์ ์๋์ผ๋ก ์ฒ๋ฆฌํ๋ค.
Hash Tags
{}๋ก ๋ฌถ์ ๋ถ๋ถ๋ง ํด์ ๊ณ์ฐ์ ์ฌ์ฉ๋๋ค. ๊ฐ์ ์ฌ๋กฏ์ ์ ์ฅํด์ผ ํ๋ ๊ด๋ จ ํค๋ค์ ๋ฌถ์ ๋ ์ด๋ค.
user:{1000}:profile
user:{1000}:session
๋ ํค ๋ชจ๋ 1000์ผ๋ก ์ฌ๋กฏ์ ๊ณ์ฐํ๋ฏ๋ก ๊ฐ์ ๋
ธ๋์ ์ ์ฅ๋๋ค. ๋ฉํฐ ํค ์ฐ์ฐ(MGET, MSET ๋ฑ)์ ๋ชจ๋ ํค๊ฐ ๊ฐ์ ์ฌ๋กฏ์ ์์ด์ผ ํ๋ฏ๋ก Hash Tags๊ฐ ํ์๋ค.
ํด๋ฌ์คํฐ ๊ตฌ์กฐ
Redis Cluster๋ ๋ง์คํฐ-๋ ํ๋ฆฌ์นด ๊ตฌ์กฐ๋ก ์ด๋ฃจ์ด์ง๋ค.
- ๋ง์คํฐ ๋ ธ๋: ์ค์ ๋ฐ์ดํฐ ์ฐ๊ธฐ์ ์ฝ๊ธฐ๋ฅผ ์ฒ๋ฆฌํ๋ฉฐ ํน์ ์ฌ๋กฏ ๋ฒ์๋ฅผ ๋ด๋น
- ๋ ํ๋ฆฌ์นด ๋ ธ๋: ๋ง์คํฐ๋ฅผ ๋ณต์ ํ๋ฉฐ ์ฅ์ ์ ๋ง์คํฐ๋ก ์น๊ฒฉ ๋๊ธฐ
๊ถ์ฅ ์ต์ ๊ตฌ์ฑ์ ๋ง์คํฐ 3๊ฐ + ๋ ํ๋ฆฌ์นด 3๊ฐ(๊ฐ ๋ง์คํฐ๋น 1๊ฐ)๋ค.
Master A (์ฌ๋กฏ 0~5460) Replica A
Master B (์ฌ๋กฏ 5461~10922) Replica B
Master C (์ฌ๋กฏ 10923~16383) Replica C
๋ง์คํฐ๊ฐ 3๊ฐ ๋ฏธ๋ง์ด๋ฉด ํด๋ฌ์คํฐ๊ฐ ์ ์ ๋์ํ์ง ์๋๋ค. ์ฟผ๋ผ(๊ณผ๋ฐ์)์ ๊ตฌ์ฑํ๋ ค๋ฉด ์ต์ 3๊ฐ๊ฐ ํ์ํ๊ธฐ ๋๋ฌธ์ด๋ค.
ํด๋ฌ์คํฐ ์ค์
redis.conf์ ์๋ ํญ๋ชฉ์ ์ถ๊ฐํ๋ฉด ํด๋ฌ์คํฐ ๋ชจ๋๊ฐ ํ์ฑํ๋๋ค.
port 6379
cluster-enabled yes
cluster-config-file nodes-6379.conf
cluster-node-timeout 5000
appendonly yes
cluster-enabled yes: ํด๋ฌ์คํฐ ๋ชจ๋ ํ์ฑํcluster-config-file: ํด๋ฌ์คํฐ ์ํ๋ฅผ ์ ์ฅํ๋ ์๋ ๊ด๋ฆฌ ํ์ผcluster-node-timeout: ๋ ธ๋๋ฅผ ์ฅ์ ๋ก ํ๋จํ๊ธฐ๊น์ง ๋๊ธฐ ์๊ฐ(ms)
6๊ฐ์ ์ธ์คํด์ค๋ฅผ ๋์ด ํ redis-cli๋ก ํด๋ฌ์คํฐ๋ฅผ ์ด๊ธฐํํ๋ค.
redis-cli --cluster create \
127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 \
127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 \
--cluster-replicas 1
--cluster-replicas 1์ ๋ง์คํฐ๋ง๋ค ๋ ํ๋ฆฌ์นด 1๊ฐ๋ฅผ ์๋์ผ๋ก ๋ฐฐ์ ํ๋ผ๋ ๋ป์ด๋ค.
Failover ๊ณผ์
๋ง์คํฐ ๋ ธ๋๊ฐ ์ฅ์ ์ํ๊ฐ ๋๋ฉด ์๋ Failover๊ฐ ์งํ๋๋ค.
์ฅ์ ๊ฐ์ง
- ๋ ธ๋๋ค์ ์๋ก gossip ํ๋กํ ์ฝ๋ก ์ฃผ๊ธฐ์ ์ผ๋ก PING์ ์ฃผ๊ณ ๋ฐ๋๋ค
cluster-node-timeout๋ด์ PONG ์๋ต์ด ์์ผ๋ฉด ํด๋น ๋ ธ๋๋ฅผPFAIL(Possible Fail) ์ํ๋ก ํ์- ๋ค๋ฅธ ๋
ธ๋๋ค๋ ๊ฐ์ ๋
ธ๋๋ฅผ PFAIL๋ก ๋ณด๊ณ ํ๋ฉด
FAIL์ํ๋ก ํ์
๋ ํ๋ฆฌ์นด ์ ๊ฑฐ (Election)
๋ง์คํฐ๊ฐ FAIL ์ํ๊ฐ ๋๋ฉด ๊ทธ ๋ง์คํฐ์ ๋ ํ๋ฆฌ์นด๋ค์ด ์ ๋ง์คํฐ ์ ์ถ์ ์์ํ๋ค.
- ๋ ํ๋ฆฌ์นด๊ฐ ๋ค๋ฅธ ๋ง์คํฐ ๋
ธ๋๋ค์๊ฒ
FAILOVER_AUTH_REQUEST๋ฅผ ๋ณด๋ - ๋ง์คํฐ๋ค์ด
FAILOVER_AUTH_ACK๋ก ํฌํ - ๊ณผ๋ฐ์ ์ด์์ ๋ง์คํฐ ํฌํ๋ฅผ ๋ฐ์ ๋ ํ๋ฆฌ์นด๊ฐ ์ ๋ง์คํฐ๋ก ์น๊ฒฉ
- ์ ๋ง์คํฐ๊ฐ ์ฅ์ ๋ง์คํฐ์ ์ฌ๋กฏ ๋ฒ์๋ฅผ ์ธ๊ณ๋ฐ์
๋ ํ๋ฆฌ์นด๊ฐ ์ฌ๋ฌ ๊ฐ๋ฉด, ๋ณต์ ์ง์ฐ์ด ๊ฐ์ฅ ์ ์(๋ฐ์ดํฐ๊ฐ ๊ฐ์ฅ ์ต์ ์ธ) ๋ ํ๋ฆฌ์นด๊ฐ ์ฐ์ ์ ์ผ๋ก ์ ์ถ๋๋ค.
Before: Master A (์ ์) โ Replica A
After: Master A (์ฅ์ ) โ Replica A (โ ์ Master A๋ก ์น๊ฒฉ)
์๋ Failover
์ด์ ํธ์๋ฅผ ์ํด ์๋์ผ๋ก Failover๋ฅผ ํธ๋ฆฌ๊ฑฐํ ์ ์๋ค. ์ด ๊ฒฝ์ฐ ๋ฐ์ดํฐ ์์ค ์์ด ์์ ํ๊ฒ ๋ง์คํฐ๋ฅผ ๊ต์ฒดํ ์ ์๋ค.
# ๋ ํ๋ฆฌ์นด ๋
ธ๋์์ ์คํ
redis-cli -h 127.0.0.1 -p 6382 CLUSTER FAILOVER
์ฃผ์ ํด๋ฌ์คํฐ ๋ช ๋ น์ด
# ํด๋ฌ์คํฐ ์ ์ฒด ์ํ ํ์ธ
CLUSTER INFO
# ๋ชจ๋ ๋
ธ๋ ๋ชฉ๋ก๊ณผ ์ฌ๋กฏ ๋ฐฐ์น ํ์ธ
CLUSTER NODES
# ํน์ ํค์ ์ฌ๋กฏ ๋ฒํธ ํ์ธ
CLUSTER KEYSLOT mykey
# ํน์ ์ฌ๋กฏ์ ์ํ ํค ๋ชฉ๋ก ํ์ธ
CLUSTER GETKEYSINSLOT 3999 10
# ๋
ธ๋๋ฅผ ํด๋ฌ์คํฐ์ ์ถ๊ฐ
CLUSTER MEET <ip> <port>
# ํ์ฌ ๋
ธ๋๋ฅผ ํน์ ๋ง์คํฐ์ ๋ ํ๋ฆฌ์นด๋ก ์ค์
CLUSTER REPLICATE <master-node-id>
# ํด๋ฌ์คํฐ ์ฌ๊ตฌ์ฑ (์ฌ๋กฏ ์ฌ๋ฐฐ๋ถ ๋ฑ)
redis-cli --cluster rebalance 127.0.0.1:6379
ํด๋ฌ์คํฐ ์ ํ์ฌํญ
Redis Cluster๋ฅผ ๋์ ํ ๋ ์์๋ฌ์ผ ํ ์ ์ฝ์ด ์๋ค.
๋ฉํฐ ํค ์ฐ์ฐ ์ ํ: MGET, MSET, SUNION ๋ฑ ์ฌ๋ฌ ํค๋ฅผ ๋ค๋ฃจ๋ ์ฐ์ฐ์ ๋ชจ๋ ํค๊ฐ ๊ฐ์ ์ฌ๋กฏ์ ์์ด์ผ ํ๋ค. Hash Tags๋ก ํด๊ฒฐ ๊ฐ๋ฅํ์ง๋ง ์ค๊ณ ์ ๋ฏธ๋ฆฌ ๊ณ ๋ คํด์ผ ํ๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค 0๋ง ์ฌ์ฉ: ๋จ์ผ Redis์ SELECT ๋ช
๋ น์ด๋ก ์ฌ๋ฌ DB๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ์์ ํด๋ฌ์คํฐ์์ ์ง์ํ์ง ์๋๋ค. DB 0๋ง ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
Lua ์คํฌ๋ฆฝํธ ์ ํ: ์คํฌ๋ฆฝํธ ๋ด์์ ์ ๊ทผํ๋ ๋ชจ๋ ํค๊ฐ ๊ฐ์ ์ฌ๋กฏ์ ์์ด์ผ ํ๋ค.
ํธ๋์ญ์
์ ํ: MULTI/EXEC ํธ๋์ญ์
๋ ๊ฐ์ ์ฌ๋กฏ์ ํค๋ง ๋ฌถ์ ์ ์๋ค.
ํด๋ฌ์คํฐ vs Sentinel
| ย | Redis Cluster | Redis Sentinel |
|---|---|---|
| ๋ชฉ์ | ์ํ ํ์ฅ + ๊ณ ๊ฐ์ฉ์ฑ | ๊ณ ๊ฐ์ฉ์ฑ๋ง |
| ๋ฐ์ดํฐ ๋ถ์ฐ | ์๋ ์ค๋ฉ | ๋จ์ผ ๋ ธ๋(์ ์ฒด ๋ณต์ ) |
| ์ค์ผ์ผ ์์ | ๊ฐ๋ฅ | ๋ถ๊ฐ |
| ์ค์ ๋ณต์ก๋ | ๋์ | ๋ฎ์ |
| ๋ฉํฐ ํค ์ฐ์ฐ | ์ ํ์ | ์์ ๋ก์ |
| ๊ถ์ฅ ์ํฉ | ๋์ฉ๋ ๋ฐ์ดํฐ, ๋์ ์ฒ๋ฆฌ๋ ํ์ | ์ค์๊ท๋ชจ, ๋จ์ HA |
๋จ์ํ ๋ง์คํฐ ์ฅ์ ์ ์๋ ๋ณต๊ตฌ๋ง ํ์ํ๋ค๋ฉด Sentinel์ด ๊ฐํธํ๋ค. ๋ฐ์ดํฐ๊ฐ ๋ง์์ ๋จ์ผ ๋ ธ๋์ ๋ด๊ธฐ ์ด๋ ต๊ฑฐ๋ ๋์ ์ฒ๋ฆฌ๋์ด ํ์ํ๋ค๋ฉด Cluster๊ฐ ์ ํฉํ๋ค.