[Daily morning study] Redis Cluster ๊ตฌ์„ฑ๊ณผ Failover

#daily morning study

Image


Redis Cluster๋ž€

Redis Cluster๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์—ฌ๋Ÿฌ ๋…ธ๋“œ์— ์ž๋™์œผ๋กœ ๋ถ„์‚ฐ ์ €์žฅํ•˜๋Š” ๋ถ„์‚ฐ Redis ๊ตฌ์„ฑ์ด๋‹ค. ๋‹จ์ผ Redis ์ธ์Šคํ„ด์Šค์˜ ํ•œ๊ณ„์ธ ๋ฉ”๋ชจ๋ฆฌ ์šฉ๋Ÿ‰๊ณผ ์ฒ˜๋ฆฌ๋Ÿ‰์„ ์ˆ˜ํ‰ ํ™•์žฅ์œผ๋กœ ๊ทน๋ณตํ•˜๋ฉด์„œ, ์ผ๋ถ€ ๋…ธ๋“œ ์žฅ์• ์—๋„ ์„œ๋น„์Šค๊ฐ€ ๊ณ„์†๋˜๋„๋ก ๊ณ ๊ฐ€์šฉ์„ฑ์„ ์ œ๊ณตํ•œ๋‹ค.

ํ•ต์‹ฌ ํŠน์ง•:

  • ์ž๋™ ์ƒค๋”ฉ: ๋ฐ์ดํ„ฐ๋ฅผ ์—ฌ๋Ÿฌ ๋…ธ๋“œ์— ๋ถ„์‚ฐ
  • ๊ณ ๊ฐ€์šฉ์„ฑ: ์ผ๋ถ€ ๋…ธ๋“œ ์žฅ์•  ์‹œ ์ž๋™ Failover
  • ์„ ํ˜• ํ™•์žฅ: ๋…ธ๋“œ ์ถ”๊ฐ€๋กœ ์„ฑ๋Šฅยท์šฉ๋Ÿ‰ ํ™•์žฅ ๊ฐ€๋Šฅ

ํ•ด์‹œ ์Šฌ๋กฏ (Hash Slot)

Redis Cluster๋Š” ๋ฐ์ดํ„ฐ๋ฅผ 16384๊ฐœ์˜ ํ•ด์‹œ ์Šฌ๋กฏ์œผ๋กœ ๋‚˜๋ˆ ์„œ ๊ด€๋ฆฌํ•œ๋‹ค. ๊ฐ ๋งˆ์Šคํ„ฐ ๋…ธ๋“œ๊ฐ€ ์Šฌ๋กฏ์˜ ์ผ๋ถ€ ๋ฒ”์œ„๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

ํ‚ค๋ฅผ ์–ด๋А ์Šฌ๋กฏ์— ์ €์žฅํ• ์ง€ ๊ณ„์‚ฐํ•˜๋Š” ๊ณต์‹:

slot = CRC16(key) % 16384

3๊ฐœ์˜ ๋งˆ์Šคํ„ฐ ๋…ธ๋“œ๊ฐ€ ์žˆ๋‹ค๋ฉด ์Šฌ๋กฏ์ด ์ด๋ ‡๊ฒŒ ๋‚˜๋‰œ๋‹ค:

๋…ธ๋“œ๋‹ด๋‹น ์Šฌ๋กฏ ๋ฒ”์œ„
Node A0 ~ 5460
Node B5461 ~ 10922
Node C10923 ~ 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๊ฐ€ ์ง„ํ–‰๋œ๋‹ค.

์žฅ์•  ๊ฐ์ง€

  1. ๋…ธ๋“œ๋“ค์€ ์„œ๋กœ gossip ํ”„๋กœํ† ์ฝœ๋กœ ์ฃผ๊ธฐ์ ์œผ๋กœ PING์„ ์ฃผ๊ณ ๋ฐ›๋Š”๋‹ค
  2. cluster-node-timeout ๋‚ด์— PONG ์‘๋‹ต์ด ์—†์œผ๋ฉด ํ•ด๋‹น ๋…ธ๋“œ๋ฅผ PFAIL(Possible Fail) ์ƒํƒœ๋กœ ํ‘œ์‹œ
  3. ๋‹ค๋ฅธ ๋…ธ๋“œ๋“ค๋„ ๊ฐ™์€ ๋…ธ๋“œ๋ฅผ PFAIL๋กœ ๋ณด๊ณ ํ•˜๋ฉด FAIL ์ƒํƒœ๋กœ ํ™•์ •

๋ ˆํ”Œ๋ฆฌ์นด ์„ ๊ฑฐ (Election)

๋งˆ์Šคํ„ฐ๊ฐ€ FAIL ์ƒํƒœ๊ฐ€ ๋˜๋ฉด ๊ทธ ๋งˆ์Šคํ„ฐ์˜ ๋ ˆํ”Œ๋ฆฌ์นด๋“ค์ด ์ƒˆ ๋งˆ์Šคํ„ฐ ์„ ์ถœ์„ ์‹œ์ž‘ํ•œ๋‹ค.

  1. ๋ ˆํ”Œ๋ฆฌ์นด๊ฐ€ ๋‹ค๋ฅธ ๋งˆ์Šคํ„ฐ ๋…ธ๋“œ๋“ค์—๊ฒŒ FAILOVER_AUTH_REQUEST๋ฅผ ๋ณด๋ƒ„
  2. ๋งˆ์Šคํ„ฐ๋“ค์ด FAILOVER_AUTH_ACK๋กœ ํˆฌํ‘œ
  3. ๊ณผ๋ฐ˜์ˆ˜ ์ด์ƒ์˜ ๋งˆ์Šคํ„ฐ ํˆฌํ‘œ๋ฅผ ๋ฐ›์€ ๋ ˆํ”Œ๋ฆฌ์นด๊ฐ€ ์ƒˆ ๋งˆ์Šคํ„ฐ๋กœ ์Šน๊ฒฉ
  4. ์ƒˆ ๋งˆ์Šคํ„ฐ๊ฐ€ ์žฅ์•  ๋งˆ์Šคํ„ฐ์˜ ์Šฌ๋กฏ ๋ฒ”์œ„๋ฅผ ์ธ๊ณ„๋ฐ›์Œ

๋ ˆํ”Œ๋ฆฌ์นด๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ๋ฉด, ๋ณต์ œ ์ง€์—ฐ์ด ๊ฐ€์žฅ ์ ์€(๋ฐ์ดํ„ฐ๊ฐ€ ๊ฐ€์žฅ ์ตœ์‹ ์ธ) ๋ ˆํ”Œ๋ฆฌ์นด๊ฐ€ ์šฐ์„ ์ ์œผ๋กœ ์„ ์ถœ๋œ๋‹ค.

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 ClusterRedis Sentinel
๋ชฉ์ ์ˆ˜ํ‰ ํ™•์žฅ + ๊ณ ๊ฐ€์šฉ์„ฑ๊ณ ๊ฐ€์šฉ์„ฑ๋งŒ
๋ฐ์ดํ„ฐ ๋ถ„์‚ฐ์ž๋™ ์ƒค๋”ฉ๋‹จ์ผ ๋…ธ๋“œ(์ „์ฒด ๋ณต์ œ)
์Šค์ผ€์ผ ์•„์›ƒ๊ฐ€๋Šฅ๋ถˆ๊ฐ€
์„ค์ • ๋ณต์žก๋„๋†’์Œ๋‚ฎ์Œ
๋ฉ€ํ‹ฐ ํ‚ค ์—ฐ์‚ฐ์ œํ•œ์ ์ž์œ ๋กœ์›€
๊ถŒ์žฅ ์ƒํ™ฉ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ, ๋†’์€ ์ฒ˜๋ฆฌ๋Ÿ‰ ํ•„์š”์ค‘์†Œ๊ทœ๋ชจ, ๋‹จ์ˆœ HA

๋‹จ์ˆœํžˆ ๋งˆ์Šคํ„ฐ ์žฅ์•  ์‹œ ์ž๋™ ๋ณต๊ตฌ๋งŒ ํ•„์š”ํ•˜๋‹ค๋ฉด Sentinel์ด ๊ฐ„ํŽธํ•˜๋‹ค. ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์•„์„œ ๋‹จ์ผ ๋…ธ๋“œ์— ๋‹ด๊ธฐ ์–ด๋ ต๊ฑฐ๋‚˜ ๋†’์€ ์ฒ˜๋ฆฌ๋Ÿ‰์ด ํ•„์š”ํ•˜๋‹ค๋ฉด Cluster๊ฐ€ ์ ํ•ฉํ•˜๋‹ค.