๊ฐœ๋ฐœ์ž HOON
๐Ÿ› HOON DEVLog
๊ฐœ๋ฐœ์ž HOON
์ „์ฒด ๋ฐฉ๋ฌธ์ž
์˜ค๋Š˜
์–ด์ œ
  • ๐Ÿ˜Ž ์ „์ฒด ์นดํ…Œ๊ณ ๋ฆฌ (137)
    • ๐Ÿ“ ์‹ ์ž… ์ธํ„ฐ๋ทฐ ์ค€๋น„ (7)
    • ๐Ÿฆ” ์ทจ์—…์ค€๋น„ ๊ธฐ๋ก (7)
    • โ˜• ์ž๋ฐ” : JAVA (5)
    • ๐Ÿ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ ๋Œ€๋น„ : PS (80)
    • ๐ŸŒฑ ๋ฐฑ์—”๋“œ : Backend (13)
    • ๐Ÿงช ์ปดํ“จํ„ฐ๊ณผํ•™ : CS (11)
    • ๐Ÿ—‚ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค : DB (1)
    • ๐Ÿƒ‍โ™‚๏ธ DEVLOG (8)
    • โš™๏ธ Trouble Shooting (5)

๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

  • ํ™ˆ
  • GitHub
  • Resume

๊ณต์ง€์‚ฌํ•ญ

์ธ๊ธฐ ๊ธ€

์ตœ๊ทผ ๊ธ€

ํ‹ฐ์Šคํ† ๋ฆฌ

hELLO ยท Designed By ์ •์ƒ์šฐ.
๊ฐœ๋ฐœ์ž HOON

๐Ÿ› HOON DEVLog

[Redis] Redis์˜ ๋ฐฑ์—…๊ณผ HA๋ฅผ ์œ„ํ•œ ์ „๋žต (RDB, AOF, Replication, Sentinel, Sharding, Cluster)
๐Ÿ—‚ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค : DB

[Redis] Redis์˜ ๋ฐฑ์—…๊ณผ HA๋ฅผ ์œ„ํ•œ ์ „๋žต (RDB, AOF, Replication, Sentinel, Sharding, Cluster)

2024. 3. 22. 14:00

 

๐Ÿ0. ์„œ๋ก 

 

ํŒ€ ํ”„๋กœ์ ํŠธ์—์„œ Redis๋ฅผ ์‚ฌ์šฉํ•˜๋‹ค๊ฐ€, ์‹ ๊ธฐํ•œ ํ˜„์ƒ์„ ๋ฐœ๊ฒฌํ–ˆ๋‹ค.

์šฐ๋ฆฌ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๋„์ปค๋ฅผ ํ†ตํ•ด ๋ ˆ๋””์Šค ์„œ๋ฒ„๋ฅผ ๋Œ๋ฆฌ๊ณ  ์žˆ์—ˆ๊ณ , JWT Refresh Token์„ ๋ ˆ๋””์Šค ์„œ๋ฒ„์— ์ €์žฅํ•˜๊ณ  ์žˆ์—ˆ๋Š”๋ฐ ๋„์ปค๋ฅผ ์ค‘์ง€ํ•˜๊ณ  ๋ฉฐ์น  ๋’ค์— ๋‹ค์‹œ ์‹คํ–‰์„ ํ•ด๋ณธ ๊ฒฐ๊ณผ ์•„์ง ํ•ด๋‹น ํ† ํฐ๋“ค์ด ๋‚จ์•„์žˆ๋Š” ํ˜„์ƒ์„ ๋ฐœ๊ฒฌํ–ˆ๋‹ค.

 

"์—ฅ? Redis๋Š” InMemory DB๋กœ ์ข…๋ฃŒ๋˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ชจ๋‘ ํœ˜๋ฐœ๋˜์–ด ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๋Š”๊ฒŒ ๋งž์ง€ ์•Š๋‚˜?"

์ด๋Ÿฌํ•œ ์ƒ๊ฐ์„ ๊ฐ€์ง€๊ฒŒ ๋˜์—ˆ๊ณ , Redis์˜ ๋ฐฑ์—…์— ๊ด€๋ จ๋œ ๋‚ด์šฉ์„ ๊ณต๋ถ€ํ•˜์ž ํ•ด๋‹น ์‹ค๋งˆ๋ฆฌ๋ฅผ ํ’€์–ด๋‚ผ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

 

๐Ÿค” 1. Redis์˜ ๋ฐฑ์—… ๋ฐฉ์‹

1-1. RDB(Redis DataBase ๋ฐฉ์‹)

 

์—ฌ๊ธฐ์„œ RDB๋Š” ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์•„๋‹ˆ๋ผ, Redis์˜ ์ž์ฒด์ ์ธ ๋ฐฑ์—… ๋ฐฉ์‹์ธ Redis Database ๋ฐฉ์‹์„ ์˜๋ฏธํ•œ๋‹ค.

Redis๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ์ผ์ • ์ฃผ๊ธฐ๋งˆ๋‹ค Redis๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋Œ€๋กœ ์Šค๋ƒ…์ƒท ํ˜•ํƒœ๋กœ ์ €์žฅํ•ด .rdb ํ™•์žฅ์ž๋ฅผ ๊ฐ€์ง„ ํŒŒ์ผ๋กœ ๋งŒ๋“ค์–ด ๋‚ด๋Š” ๋ฐฉ์‹์ด ๋ฐ”๋กœ RDB์ด๋‹ค. ํ•ด๋‹น ๋ฐฑ์—…์€ Redis ์„œ๋ฒ„๋ฅผ fork๋ฅผ ๋– ์„œ ์ง„ํ–‰๋œ๋‹ค.

 

๊ธฐ๋ณธ์ ์ธ ์„ค์ •์œผ๋กœ Redis๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด RDB ๋ฐฉ์‹์ด ์„ธํŒ…๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์œ„์—์„œ ๋ ˆ๋””์Šค๋ฅผ ์ข…๋ฃŒํ•ด๋„ ํ† ํฐ์ด ๊ทธ๋Œ€๋กœ ๋‚จ์•„์žˆ๋˜ ํ˜„์ƒ์€ ์žฌ์‹œ์ž‘ํ•œ ํ›„ RDB ํŒŒ์ผ์„ ๋ถˆ๋Ÿฌ์™”๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋Œ€๋กœ ๋‚จ์•„์žˆ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

๊ธฐ๋ณธ์ ์œผ๋กœ ์Šค๋ƒ…์ƒท ํ˜•ํƒœ๋กœ ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ž‘์€ ํŒŒ์ผ ์‚ฌ์ด์ฆˆ๋กœ ๋ฐฑ์—… ํŒŒ์ผ ๊ด€๋ฆฌ๊ฐ€ ์šฉ์ดํ•˜๊ณ , ์›๊ฒฉ์ง€ ๋ฐฑ์—…์ด๋‚˜ ๋ฒ„์ „ ๊ด€๋ฆฌ๊ฐ€ ์‰ฝ๋‹ค.

๋˜ํ•œ ํ•ด๋‹น ๋ฐฑ์—…์ด ๋˜๋Š” ๊ณผ์ •์€ Redis ์„œ๋ฒ„๋ฅผ fork๋ฅผ ๋– ์„œ ์ž์‹ ์„œ๋ฒ„์—์„œ ๋ฐฑ์—…์„ ํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ ๋ณธ ํ”„๋กœ์„ธ์Šค์—๋Š” ์„ฑ๋Šฅ์  ์˜ํ–ฅ์ด ์—†๋‹ค.

๋˜ ๋ฐ์ดํ„ฐ ์Šค๋ƒ…์ƒท์„ ๊ทธ๋Œ€๋กœ ๋ณต๊ตฌํ•˜๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋น ๋ฅธ ๋ณต๊ตฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

 

๋‹จ์ ์ด๋ผ๊ณ  ํ•˜๋ฉด, ์ด๋Ÿฌํ•œ RDB ๋ฐฉ์‹์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ์žˆ๋‹ค๋ฉด ์‰ฝ๊ฒŒ ์œ ์ถ”ํ•  ์ˆ˜ ์žˆ๋‹ค.

์Šค๋ƒ…์ƒท์„ ์ €์žฅํ•˜๋Š” '์‹œ์ '์ด ๋ถ„๋ช…ํžˆ ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ ์‚ฌ์ด์— ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ์œ ์‹ค๋  ์ˆ˜ ์žˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์Šค๋ƒ…์ƒท์„ 1๋ถ„๋งˆ๋‹ค ์ €์žฅํ•˜๋Š” ์ƒํ™ฉ์—์„œ ์Šค๋ƒ…์ƒท์ด ์ €์žฅ๋˜๊ธฐ 1์ดˆ ์ „์— ์„œ๋ฒ„๊ฐ€ ์ค‘๋‹จ๋œ๋‹ค๋ฉด 59์ดˆ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ์†์‹ค์€ ๋ง‰์„ ์ˆ˜ ์—†๋‹ค.

๋˜ํ•œ ๋ณธ ํ”„๋กœ์„ธ์Šค์— ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ๋ผ์น˜์ง€๋Š” ์•Š์ง€๋งŒ, fork๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‹œ๊ฐ„ ๋ฐ CPU์™€ ๋ฉ”๋ชจ๋ฆฌ ์ž์›์„ ์†Œ๋ชจํ•œ๋‹ค๋Š” ๊ฒƒ๋„ ๋‹จ์ ์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ์ด๋‚˜ ์ •ํ•ฉ์„ฑ์— ๋Œ€ํ•œ ์š”๊ตฌ๊ฐ€ ํฌ์ง€ ์•Š์€ ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•˜๋ฉด ์ข‹๋‹ค. ์‚ฌ์‹ค Redis๋ฅผ ์บ์‹œ ์„œ๋ฒ„๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์ ์ ˆํ•œ ์บ์‹ฑ ๋กœ์ง์„ ๊ตฌ์„ฑํ–ˆ๋‹ค๋ฉด ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ์ด๋‚˜ ์ •ํ•ฉ์„ฑ์— ๋Œ€ํ•œ ์š”๊ตฌ๊ฐ€ ํฌ์ง€ ์•Š์€ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์ด ๋ฐœ์ƒํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ์ ์—๋Š” ๊ฐ„๋‹จํ•œ RDB ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ด๋„ ๊ดœ์ฐฎ์•„ ๋ณด์ธ๋‹ค. ๋ฌด๊ฒฐ์„ฑ๊ณผ ์ •ํ•ฉ์„ฑ์„ ๊ฐ•๋ ฅํ•˜๊ฒŒ ์ง€์ผœ์•ผ ํ•œ๋‹ค๋ฉด ์ฐจ๋ผ๋ฆฌ Redis ๋ณด๋‹ค๋Š” RDB๋ฅผ ๊ณ ๋ คํ•˜๊ฒŒ ๋  ๊ฒƒ์ด๋‹ˆ ๋ง์ด๋‹ค.

 

์ด๋Ÿฌํ•œ RDB ๋ฐฉ์‹์— ๋Œ€ํ•ด ์ปค์Šคํ…€์„ ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, redis.conf ํŒŒ์ผ์„ ์ˆ˜์ •ํ•˜๋ฉด ๋œ๋‹ค.

https://redis.io/docs/management/config/

 

Redis configuration

Overview of redis.conf, the Redis configuration file

redis.io

 

์œ„์˜ ๋งํฌ์—์„œ ๋ฒ„์ „์— ๋งž๋Š” redis.conf ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œ ๋ฐ›์•„ ์ˆ˜์ •ํ•ด์„œ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

 

 

 

1-2. AOF(Append Only File ๋ฐฉ์‹)

 

RDB ๋ฐฉ์‹์€ ํ•ด๋‹น ์‹œ์ ์— ์กด์žฌํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์Šค๋ƒ…์ƒท ๋ฐฉ์‹์œผ๋กœ ์ €์žฅํ•˜๊ณ , ๋‹ค์‹œ ๋ณต๊ตฌํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. 

๋ฐ˜๋ฉด AOF๋Š” ์Šค๋ƒ…์ƒท ๋ฐฉ์‹์ด ์•„๋‹Œ, ๋ชจ๋“  ์“ฐ๊ธฐ ์š”์ฒญ์— ๋Œ€ํ•œ ๋กœ๊ทธ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

 

 

ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ ˆ๋””์Šค ์„œ๋ฒ„์— ๋ฐ์ดํ„ฐ๋ฅผ ์“ด๋‹ค๋ฉด, ํ•ด๋‹น ๋ช…๋ น ํ•˜๋‚˜ํ•˜๋‚˜๋ฅผ ๋ชจ๋‘ ๊ธฐ๋กํ•ด์„œ AOF ํŒŒ์ผ์— ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

์Šค๋ƒ…์ƒท ๋ฐฉ์‹๊ณผ ๋‹ค๋ฅด๊ฒŒ ์žฌ์‹œ์ž‘์„ ํ•œ๋‹ค๋ฉด, ์—ฌํƒœ๊ป ๊ธฐ๋ก๋œ ๋ช…๋ น์˜ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ๋ชจ๋‘ ์žฌ์‹คํ–‰ํ•ด ์ด์ „ ๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋“ค์–ด๋‚ด๋Š” ๋ฐฉ์‹์ด๋‹ค.

์ด๋Ÿฌํ•œ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ชจ๋“  ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ๊ธฐ๋ก๋˜๋ฏ€๋กœ RDB ๋ฐฉ์‹์— ๋น„ํ•ด ๋”์šฑ ๋” ์•ˆ์ •์„ฑ์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ์žฅ์ ์ด๋‹ค.

AOF ํŒŒ์ผ์€ ์ด๋ฆ„๊ฐ’ ๋‹ต๊ฒŒ Append Only ํŒŒ์ผ์ด๋ฏ€๋กœ ๋ช…๋ น ์ˆ˜ํ–‰์— ๋Œ€ํ•œ ๋‚ด์šฉ์„ ์‚ฝ์ž…ํ•˜๊ธฐ๋งŒ ํ•˜๋ฏ€๋กœ ๋ฐฑ์—…ํŒŒ์ผ์— ๋Œ€ํ•œ ์†์ƒ ์œ„ํ—˜์ด ๊ต‰์žฅํžˆ ์ ๋‹ค.

๋˜ํ•œ ์‹ค์ œ ์ˆ˜ํ–‰๋œ ๋ช…๋ น์–ด๊ฐ€ ์ €์žฅ๋˜์–ด์žˆ์–ด ์‚ฌ๋žŒ์ด ์ง๊ด€์ ์œผ๋กœ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๊ณ  ํ•ด๋‹น ๋‚ด์šฉ์„ ์ผ๋ถ€ ์ˆ˜์ •ํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ด๋ฆฌ๋Š” ๋ฐฉ์‹๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.

์Šค๋ƒ…์ƒท ๋ฐฉ์‹์ด๋ผ๋ฉด ์ด๋Ÿฌํ•œ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ์•Œ์ง€๋„ ๋ชปํ•  ๋ฟ๋”๋Ÿฌ, ์ €์žฅ ๊ฐ„๊ฒฉ ํƒ“์— ์ง€ํ‚ค์ง€ ๋ชปํ•œ ์ •ํ•ฉ์„ฑ์„ ์›๋ž˜๋Œ€๋กœ ๋Œ๋ฆด ์ƒ๊ฐ๋„ ํ•˜๊ธฐ ์–ด๋ ต๋‹ค.

 

๋‹จ์ ์œผ๋กœ๋Š” RDB๋Š” ์ˆœ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ๊ฒฐ๊ณผ๋ฅผ ์Šค๋ƒ…์ƒท์œผ๋กœ ์ €์žฅํ•˜๋Š” ๊ฒƒ๊ณผ ๋‹ฌ๋ฆฌ ๋ชจ๋“  ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ๊ธฐ๋กํ•˜๋ฏ€๋กœ ํŒŒ์ผ ์‚ฌ์ด์ฆˆ๊ฐ€ ์ปค์ง€๊ณ , ํ•ด๋‹น ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ๋ชจ๋‘ ์žฌ์‹คํ–‰ ๊ณผ์ •์„ ๊ฑฐ์น˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐฑ์—… ๋ฐ ๋ณต๊ตฌ ์†๋„๊ฐ€ ๋А๋ฆฐ ํŽธ์ด๋‹ค. 

 

AOF ๋ฐฑ์—… ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, redis.conf ํŒŒ์ผ์—์„œ 

appendonly yes

์ฝ”๋“œ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ๋œ๋‹ค. ํ…œํ”Œ๋ฆฟ ํŒŒ์ผ์—์„œ๋Š” ์ฃผ์„ ์ฒ˜๋ฆฌ๊ฐ€ ๋˜์–ด์žˆ์œผ๋ฏ€๋กœ ํ•ด์ œํ•˜๋ฉด ๋œ๋‹ค.

 

์ƒ์„ฑ๋œ AOF ํŒŒ์ผ๋ช… ์—ญ์‹œ redis.conf ํŒŒ์ผ์—์„œ

appendfilename appendonly.aof

ํ•ด๋‹น ๋ถ€๋ถ„์„ ์ˆ˜์ •ํ•˜๋ฉด ๋œ๋‹ค.

 

appendfsync everysec

๋งˆ์ง€๋ง‰์œผ๋กœ๋Š” fsync์— ๋Œ€ํ•œ ์ •์ฑ… ์„ค์ •์ด ๊ฐ€๋Šฅํ•œ๋ฐ fsync() ํ˜ธ์ถœ์€ OS์—๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ๋””์Šคํฌ์— ์“ฐ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

ํŒŒ์ผ์— ๋ฐ์ดํ„ฐ๋ฅผ ์“ด๋‹ค๊ณ  ํ•ด์„œ ๋ฐ”๋กœ ๋””์Šคํฌ์— ์ €์žฅ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ OS๋ฅผ ํ†ตํ•ด ์ผ์ • ์‹œ๊ฐ„ ๋ฒ„ํผ๋ง์ด ์กด์žฌํ•˜๋Š”๋ฐ(์™„์ „ํ•œ ์‹ค์‹œ๊ฐ„์ด ์•„๋‹˜), ์ด๋Ÿฌํ•œ ํŒŒ์ผ ์“ฐ๊ธฐ์— ๊ฐ•์ œ ํ˜ธ์ถœ์„ ํ†ตํ•ด ๊ฐ„๊ฒฉ ์กฐ์ •์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

always๋ฅผ ์ฃผ๋ฉด ์ƒˆ๋กœ์šด ์ปค๋งจ๋“œ ํ•˜๋‚˜๊ฐ€ AOF๊ฐ€ ์ถ”๊ฐ€๋˜๋ฉด fsync๊ฐ€ ์ฆ‰์‹œ ํ˜ธ์ถœ๋˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋””์Šคํฌ์— ํ™•์‹คํžˆ ๊ธฐ๋ก๋˜๊ฒŒํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐ€์žฅ ์•ˆ์ „ํ•˜์ง€๋งŒ ๊ฐ€์žฅ ๋А๋ฆฐ ๋ฐฉ์‹์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๋„ˆ๋ฌด ๋А๋ ค์„œ Redis์˜ ์žฅ์ ์ด ํ‡ด์ƒ‰๋˜๊ธฐ๋„ ํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.

 

์˜ˆ์ œ์— ๋‚˜์˜จ everysec์€ 1์ดˆ๋งˆ๋‹ค fsync๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉฐ, ์„ฑ๋Šฅ์€ RDB ์ˆ˜์ค€์— ๊ทผ์ ‘ํ•˜๋‹ค. ์ค‘๊ฐ„์ˆ˜์ค€์˜ ํƒ€ํ˜‘์ด๋ผ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ์˜ต์…˜์ด๋ผ๊ณ  ํ•œ๋‹ค.

 

no ๋ฐฉ์‹์€ OS์— ์ˆœ์ „ํžˆ fsync ํ˜ธ์ถœ์„ ๋งž๊ธฐ๋Š” ๋ฐฉ์‹์ด๋ฉฐ, ๊ฐ€์žฅ ๋น ๋ฅด์ง€๋งŒ ๋œ ์•ˆ์ „ํ•œ ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์–ธ์ œ ์ €์žฅ์ด ๋  ์ง€ ๋ถˆํ™•์‹คํ•˜๋‹ค.

 

 

AOF ๋ฐฉ์‹์ด ๋ฐœ์ „ํ•˜๋ฉด์„œ AOF ๋ฐฉ์‹๊ณผ RDB ๋ฐฉ์‹์ด ํ˜ผํ•ฉ๋œ ํ˜•ํƒœ๊ฐ€ ๋‚˜์˜ค๊ธฐ ์‹œ์ž‘ํ–ˆ๋Š”๋ฐ ๊ทธ ๊ฐœ๋…์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž.

Log rewriting์€ AOF์—์„œ ๋ชจ๋“  ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ์ €์žฅํ•ด ํžˆ์Šคํ† ๋ฆฌ์˜ ํฌ๊ธฐ๊ฐ€ ์ง€๋‚˜์น˜๊ฒŒ ์ปค์ง€๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๊ฐœ๋…์œผ๋กœ, ์ตœ์ข… ์ƒํƒœ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ์ตœ์†Œํ•œ์˜ ๋กœ๊ทธ๋งŒ ๋‚จ๊ธฐ๊ธฐ ์œ„ํ•ด ์ผ๋ถ€๋ฅผ ์ƒˆ๋กœ ์“ฐ๋Š” ๋ฐฉ์‹์ด๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด SET ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ๊ฐ™์€ ํ‚ค์— ๋Œ€ํ•ด ๊ฐ’ ์ˆ˜์ •์„ 100ํšŒ ์ง„ํ–‰ํ–ˆ๋‹ค๊ณ  ํ•˜๋”๋ผ๋„ ์ตœ์ข… ์ƒํƒœ๋Š” 1๊ฐœ ์ด๋ฏ€๋กœ SET 1๊ฐœ๋กœ ๋Œ€์ฒด ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ํžˆ์Šคํ† ๋ฆฌ๊ฐ€ ์ง€๋‚˜์น˜๊ฒŒ ์ปค์ง€๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•œ๋‹ค.

 

๋˜ Multipart AOF์˜ ๊ฐœ๋…์ด Redis 7๋ถ€ํ„ฐ ๋‚˜์˜ค๊ฒŒ ๋œ๋‹ค.

AOF ๋‹จ์ผ ํŒŒ์ผ๋กœ ๊ตฌ์„ฑ๋œ ๊ณผ๊ฑฐ์™€ ๋‹ฌ๋ฆฌ Base file, Incremental file, Manifest file ์„ธ ๊ฐ€์ง€์˜ ๊ณ ์œ ํ•œ ์—ญํ• ์„ ๊ฐ€์ง„ ํŒŒ์ผ์œผ๋กœ ๋ถ„ํ• ๋˜๊ฒŒ ๋œ๋‹ค.

Base File์€ RDB ํŒŒ์ผ๋กœ, ๋งˆ์ง€๋ง‰ Rewrite ์‹œ์˜ ์Šค๋ƒ…์ƒท์„ ์ €์žฅํ•ด ๋ชจ๋“  ํžˆ์Šคํ† ๋ฆฌ์˜ ์žฌ์‹œ์ž‘์„ ๋ฐฉ์ง€ํ•ด ๋ฐฑ์—… ์‹œ ์†๋„๋ฅผ ํ–ฅ์ƒ์‹œํ‚จ๋‹ค.

Incremental File์€ ๋งˆ์ง€๋ง‰์œผ๋กœ Base File์ด ์ƒ์„ฑ๋œ ์ดํ›„์˜ ํžˆ์Šคํ† ๋ฆฌ๊ฐ€ ์Œ“์ด๊ฒŒ ๋˜๋Š” AOF ํŒŒ์ผ์ด๋‹ค.

Manifest File์€ ์ด๋Ÿฌํ•œ ํŒŒ์ผ๋“ค์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ์žˆ๋‹ค.

์ฆ‰ Multipart AOF ๊ฐœ๋…์€ RDB + AOF ๋ฐฉ์‹์˜ ์œตํ•ฉ์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

 

 

๐Ÿค” 2. ๋ฐฑ์—…๋งŒ์œผ๋กœ๋Š” ์žฅ์•  ๋Œ€๋น„์— ๋ถ€์กฑํ•ด..!

2-1. Replication๊ณผ Sentinel

 

RDB์˜ ์‚ฌ๋ก€์—์„œ ๋ณด์•˜๋“ฏ์ด ๋ฐฑ์—…์ด ์‹คํŒจํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์กด์žฌํ•˜๊ณ , ๋ณต๊ตฌ๋ฅผ ํ•˜๋Š”๋ฐ ์‹œ๊ฐ„์ด ์†Œ์š”๋œ๋‹ค.

์ด ์‚ฌ์ด์— ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์žฅ์• ๊ฐ€ ์ถฉ๋ถ„ํžˆ ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋ฐฑ์—…๋งŒ์œผ๋กœ๋Š” ์žฅ์•  ๋Œ€๋น„์— ๋ถ€์กฑํ•˜๋‹ค.

 

RDB(๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค)์™€ ๋น„์Šทํ•˜๊ฒŒ Redis๋„ ๋ณต์ œ๋ฅผ ํ†ตํ•ด ๊ฐ€์šฉ์„ฑ์„ ํ™•๋ณดํ•˜๊ณ  ๋น ๋ฅธ ์žฅ์• ์กฐ์น˜๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

์ฆ‰, ์ฝ๊ธฐ๊ฐ€ ๊ฐ€๋Šฅํ•œ Master Redis ์„œ๋ฒ„์™€ ๋™์ผํ•œ ๋‚ด์šฉ์„ ๊ฐ€์ง„ Replica Redis ์„œ๋ฒ„๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ณ , Master ์„œ๋ฒ„๊ฐ€ ์ฃฝ์—ˆ์„ ๊ฒฝ์šฐ Replica ์ค‘ ํ•˜๋‚˜๋ฅผ Master๋กœ ์ „ํ™˜ํ•ด ์ฆ‰์‹œ ์„œ๋น„์Šค๋ฅผ ์ •์ƒํ™” ์‹œํ‚ฌ ์ˆ˜๋„ ์žˆ๋‹ค.

 

๋˜ํ•œ Replica๋Š” Read-only ๋…ธ๋“œ์ด๊ธฐ ๋•Œ๋ฌธ์— ํŠธ๋ž˜ํ”ฝ ๋ถ„์‚ฐ์˜ ์—ญํ• ๋„ ํ•  ์ˆ˜ ์žˆ๋‹ค. (์ฝ๋Š” ์—ฐ์‚ฐ์€ Replica๋กœ, ์“ฐ๊ธฐ ์—ฐ์‚ฐ์€ Master๋กœ)

Master ๋…ธ๋“œ๋Š” RDB๋‚˜ AOF๋ฅผ ์ด์šฉํ•œ ๋ฐฑ์—… ๊ธฐ๋Šฅ ํ™œ์„ฑํ™”๊ฐ€ ํ•„์ˆ˜์ ์ด๋‹ค. (์žฌ์‹œ์ž‘ ํ›„์— ๋น„์–ด์žˆ๋Š” ๋ฐ์ดํ„ฐ ์ƒํƒœ๊ฐ€ ๋ณต์ œ๋˜๋Š” ๊ฒฝ์šฐ ๋ฐฉ์ง€)

๋‹จ์ˆœํžˆ Master ๋…ธ๋“œ๊ฐ€ ์ฃฝ์—ˆ์„ ๋•Œ Replica๋ฅผ Master๋กœ ์ˆ˜๋™์œผ๋กœ ์Šน๊ฒฉ์‹œํ‚ฌ ์ˆ˜๋„ ์žˆ์ง€๋งŒ, Redis๋Š” ๊ณ ๊ฐ€์šฉ์„ฑ์„ ์œ„ํ•ด Sentinel์ด๋ผ๋Š” ์žฅ์น˜๋ฅผ ๋งˆ๋ จํ–ˆ๋‹ค. 

 

Master-Replica ๊ตฌ์กฐ์—์„œ Master๊ฐ€ ๋‹ค์šด ์‹œ Replica๋ฅผ ์ž๋™์œผ๋กœ Master๋กœ ์Šน๊ฒฉ์‹œํ‚ค๋Š” Auto-Failover๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์„ผํ‹ฐ๋„ฌ์˜ ์—ญํ• ์ด๋‹ค.

 

 

์„ผํ‹ฐ๋„ฌ ๋…ธ๋“œ๋Š” 3๊ฐœ ์ด์ƒ์œผ๋กœ ๊ตฌ์„ฑํ•˜๋Š”๋ฐ, ๊ทธ ์ด์œ ๋Š” ์„œ๋ฒ„๊ฐ€ ๋‹ค์šด๋๋‹ค๋Š” ๊ฒฐ์ •์„ ๋‚ด๋ฆฌ๊ธฐ ์œ„ํ•œ '๊ณผ๋ฐ˜์ˆ˜'๋ผ๋Š” ๊ฐœ๋…์„ ๊ฐ–๊ธฐ ์œ„ํ•ด์„œ๋Š” 3๋ช…์ด ์ตœ์†Œ ๋…ธ๋“œ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. (Quorum : ์ •์กฑ์ˆ˜)

๋งŒ์•ฝ ์ฐฐ๋‚˜์˜ ๋„คํŠธ์›Œํฌ ๋‹จ์ ˆ์ด ๋ฐœ์ƒํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ , ๊ณง๋ฐ”๋กœ ๋ณต๊ตฌ๋˜์—ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž. ๋‹จ ํ•˜๋‚˜์˜ ์„ผํ‹ฐ๋„ฌ๋งŒ ์„œ๋ฒ„๊ฐ€ ๋‹ค์šด๋˜์—ˆ๋‹ค๊ณ  ํŒ๋‹จํ•˜๊ณ  ๋‘ ์„ผํ‹ฐ๋„ฌ์€ ์„œ๋ฒ„๊ฐ€ ์ •์ƒ์ ์ด๋‹ค๋ผ๋Š” ํŒ๋‹จ์„ ๋‚ด๋ฆฌ๋ฉด, Master ์„œ๋ฒ„๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™๋˜์—ˆ๋‹ค๊ณ  ํŒ๋‹จํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ฆ‰ ์„œ๋น„์Šค์— ์ง€์žฅ์ด ๊ฐ€์ง€ ์•Š๋Š” ์˜ค๋ฅ˜๋กœ ์ธํ•ด Master ๋…ธ๋“œ๋ฅผ ๋‹ค์šด์ด๋ผ ํŒ๋‹จํ•˜๊ณ  Replica ์„œ๋ฒ„๋ฅผ ์Šน๊ฒฉ์‹œํ‚ค๋Š” ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ์ผ์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

 

์„ผํ‹ฐ๋„ฌ 1๋Œ€๊ฐ€ Master ๋…ธ๋“œ๊ฐ€ ๋‹ค์šด๋˜์—ˆ๋‹ค๊ณ  ํŒ๋‹จํ•˜๋Š” ๊ฒƒ์„ SDOWN(Subjective Down)

์ •์กฑ์ˆ˜๊ฐ€ ์ถฉ์กฑ๋˜์–ด Master ๋…ธ๋“œ๊ฐ€ ๋‹ค์šด๋˜์—ˆ๋‹ค๊ณ  ํŒ๋‹จํ•˜๋Š” ๊ฒƒ์„ ODOWN(Objective Down)์ด๋ผ๊ณ  ํ•œ๋‹ค.

 

์ด๋Ÿฌํ•œ 3๊ฐœ ์ด์ƒ์˜ ์„ผํ‹ฐ๋„ฌ ๋…ธ๋“œ๋“ค์€ ์„œ๋กœ ์—ฐ๊ฒฐ๋˜์–ด์žˆ๊ณ , ์—ฐ๊ฒฐ๋œ Redis Master์™€ Replica๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•œ๋‹ค.

Client๋Š” Master์™€ Replica ๋…ธ๋“œ์— ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์ด ์„ผํ‹ฐ๋„ฌ ๋…ธ๋“œ๋“ค์„ ํ†ตํ•ด Redis์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ SpringBoot + Redis Replica with Sentinel์˜ ๊ตฌ์กฐ๋ผ๋ฉด, ์„ผํ‹ฐ๋„ฌ ๋…ธ๋“œ๋“ค์˜ IP-Port๋ฅผ ๊ธฐ์ž…ํ•ด ์—ฐ๊ฒฐํ•ด์•ผ ํ•œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

์„ผํ‹ฐ๋„ฌ์ด ์ ์ ˆํ•œ Master-Replica ๋…ธ๋“œ์˜ ์ ์ ˆํ•œ ์ฃผ์†Œ๋ฅผ ์ž๋™์œผ๋กœ ์•Œ๋ ค์ฃผ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

์•„๋ž˜๋Š” Docker Compose ํŒŒ์ผ์„ ํ†ตํ•ด Redis Replication + Sentinel์„ ๊ตฌ์„ฑํ•œ ์˜ˆ์ œ์ด๋‹ค.

version: "3"
services: 
  my-redis-a:
    hostname: redis-master
    container_name: redis-master
    image: "bitnami/redis"
    environment:
      - REDIS_REPLICATION_MODE=master
      - ALLOW_EMPTY_PASSWORD=yes
    ports:
      - 5000:6379 
  my-redis-b:
    hostname: redis-replicas-1
    container_name: redis-replicas-1
    image: "bitnami/redis"
    environment:
      - REDIS_REPLICATION_MODE=slave
      - REDIS_MASTER_HOST=redis-master
      - ALLOW_EMPTY_PASSWORD=yes
    ports:
      - 5001:6379
    depends_on:
      - my-redis-a

  redis-sentinel-1:
    container_name: sentinel1
    image: 'bitnami/redis-sentinel:latest'
    environment:
      - REDIS_SENTINEL_DOWN_AFTER_MILLISECONDS=3000
      - REDIS_MASTER_HOST=redis-master
      - REDIS_MASTER_PORT_NUMBER=6379
      - REDIS_MASTER_SET=mymaster
      - REDIS_SENTINEL_QUORUM=2
    ports:
      - 26379:26379
    depends_on:
      - my-redis-a
      - my-redis-b
  redis-sentinel-2:
    container_name: sentinel2
    image: 'bitnami/redis-sentinel:latest'
    environment:
      - REDIS_SENTINEL_DOWN_AFTER_MILLISECONDS=3000
      - REDIS_MASTER_HOST=redis-master
      - REDIS_MASTER_PORT_NUMBER=6379
      - REDIS_MASTER_SET=mymaster
      - REDIS_SENTINEL_QUORUM=2
    ports:
      - 26380:26379
    depends_on:
      - my-redis-a
      - my-redis-b
  redis-sentinel-3:
    container_name: sentinel3
    image: 'bitnami/redis-sentinel:latest'
    environment:
      - REDIS_SENTINEL_DOWN_AFTER_MILLISECONDS=3000
      - REDIS_MASTER_HOST=redis-master
      - REDIS_MASTER_PORT_NUMBER=6379
      - REDIS_MASTER_SET=mymaster
      - REDIS_SENTINEL_QUORUM=2
    ports:
      - 26381:26379
    depends_on:
      - my-redis-a
      - my-redis-b

 

์•„๋ž˜๋Š” SpringBoot ํ”„๋กœ์ ํŠธ์—์„œ์˜ application.yml ํŒŒ์ผ์ด๋‹ค.

spring:
	redis:
    	sentinel:
        	master: mymaster
            nodes: 127.0.0.1:26379, 127.0.0.1:26380, 127.0.0.1:26381

 

๊ธฐ์กด์˜ Redis ์—ฐ๊ฒฐ์—์„œ ํ•ด๋‹น ํŒŒํŠธ๋งŒ ๋ณ€๊ฒฝํ•œ๋‹ค๋ฉด, ๋ฌธ์ œ ์—†์ด ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

 

 

2-2. Redis Cluster

 

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

 

์ฆ‰ ์ƒค๋”ฉ์˜ ์—ญํ• ์„ ํ•œ๋‹ค๊ณ  ๋ณด๋ฉด ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šธ ๊ฒƒ์ด๋‹ค.

 

 

Redis Cluster์˜ ํŠน์ง•์€ ์œ„์™€ ๊ฐ™์ด Full-mesh ๊ตฌ์กฐ๋กœ ํ†ต์‹ ํ•˜๊ฒŒ ๋œ๋‹ค. ์ฆ‰ ๋ชจ๋“  ๋…ธ๋“œ๊ฐ€ ์ž์‹ ์„ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ๋…ธ๋“œ์™€ ์ „๋ถ€ ์—ฐ๊ฒฐ๋˜์–ด ํ†ต์‹ ๋œ๋‹ค๋Š” ๋œป์ด๋‹ค. ์ด๋Ÿฌํ•œ ๊ตฌ์กฐ๋กœ ๋ฐ์ดํ„ฐ์˜ ์ „์†ก์ด ์ด๋ค„์ง€๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ถ๊ธˆ์ฆ์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค.

 

"์ž์‹ ์„ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ๋ชจ๋“  ๋…ธ๋“œ์— ๊ฐ์ž์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•œ๋‹ค๋ฉด ์ง€๋‚˜์น˜๊ฒŒ ๋งŽ์€ ํ†ต์‹ ๋Ÿ‰์ด ์š”๊ตฌ๋˜๋Š” ๊ฒƒ ์•„๋‹Œ๊ฐ€?"

์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Redis Cluster๋Š” Gossip Protocol์ด๋ผ๋Š” ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•œ๋‹ค. Gossip์ด๋ผ๋Š” ์ด๋ฆ„๋‹ต๊ฒŒ ์†Œ๋ฌธ์ด ํผ์ง€๋Š” ํ˜„์ƒ์ฒ˜๋Ÿผ ํ†ต์‹ ์˜ ๊ฐœ์ˆ˜๋ฅผ ์ค„์ด๋”๋ผ๋„ ๋ชจ๋‘ ํ†ต์‹ ์ด ๋˜๊ฒŒ๋” ๋งŒ๋“œ๋Š” ํ”„๋กœํ† ์ฝœ์ด๋‹ค.

 

Gossip Protocol์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์•„๋ž˜์˜ ๊ธ€์—์„œ ์–ป์„ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

http://highscalability.com/blog/2023/7/16/gossip-protocol-explained.html

 

Gossip Protocol Explained - High Scalability -

You can subscribe to the system design newsletter to excel in system design interviews and soft...

highscalability.com

 

Redis Cluster๋Š” Cluster Bus๋ผ๋Š” ๋ณ„๋„์˜ ํฌํŠธ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์„œ๋กœ ํ†ต์‹ ํ•˜๊ฒŒ ๋œ๋‹ค.

๋˜ํ•œ '์ƒค๋”ฉ'์ด ์ ์šฉ๋˜๋ฏ€๋กœ ํ‚ค์— ๋”ฐ๋ผ ๋‹ค๋ฅธ Master-Replica Redis ์„œ๋ฒ„์— ๊ฐ’์ด ์ €์žฅ๋˜๊ฒŒ๋˜๋Š”๋ฐ, ์ด๋Ÿฌํ•œ ํ‚ค์— ๋”ฐ๋ฅธ ๋ ˆ๋””์Šค ์„œ๋ฒ„ ์„ ํƒ์€ Hash Slot์ด๋ผ๋Š” ๋ฐฉ์‹์— ์˜ํ•ด ๊ฒฐ์ •๋œ๋‹ค.

 

Sentinel๊ณผ ๋‹ค๋ฅธ ์ ์œผ๋กœ๋Š”, Sentinel ์—ญ์‹œ HA๋ฅผ ์œ„ํ•œ ๋„๊ตฌ์ด๊ธฐ๋Š” ํ•˜๋‚˜, ์˜ค์ง ํ•œ ์Œ์˜ Master-Replica ๋ชจ๋ธ์„ ๊ฐ€์ง€๊ณ  ์šด์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•œ๊ณ„๊ฐ€ ์กด์žฌํ•œ๋‹ค. ๋ ˆ๋””์Šค ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ƒค๋”ฉ์„ ์ ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋”์šฑ ๋” ๋†’์€ ์ˆ˜์ค€์˜ ๊ณ ๊ฐ€์šฉ์„ฑ์„ ์ด๋ฃฐ ์ˆ˜ ์žˆ๋‹ค.

๋˜ํ•œ ๋ ˆ๋””์Šค ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์„œ๋กœ Full-Mesh ๊ตฌ์กฐ๋กœ ํ†ต์‹ ํ•˜๋ฉฐ ์„œ๋กœ์˜ Heart Beat๋ฅผ ์ฒดํฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณ„๋„์˜ ๋ชจ๋‹ˆํ„ฐ๋ง ์„œ๋น„์Šค(Sentinel)์ด ํ•„์š” ์—†๊ฒŒ ๋œ๋‹ค. 

Sentinel์—์„œ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ชจ๋“  ์„ผํ‹ฐ๋„ฌ ๋…ธ๋“œ์— ์ ‘์†์„ ํ–ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ, Redis Cluster ์—ญ์‹œ ํด๋ผ์ด์–ธํŠธ๋Š” ๋ชจ๋“  Cluster ๋…ธ๋“œ์— ์ ‘์†ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ด๋ค„์ง„๋‹ค.

 

Redis Cluster๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์•ฝ๊ฐ„์˜ ์ œํ•œ ์‚ฌํ•ญ์ด ์กด์žฌํ•˜๋Š”๋ฐ, ๊ทธ๊ฒƒ์€ ๋ฐ”๋กœ DB0๋งŒ ์‚ฌ์šฉํ•˜๋‹ค๋Š” ๊ฒƒ๊ณผ, MultiKey Operation์ด ๋ถˆ๊ฐ€ํ•˜๋‹ค๋Š” ์ ์ด๋‹ค. ์ด๋Ÿฌํ•œ ์ œํ•œ์‚ฌํ•ญ์— ํฌ๊ฒŒ ๋ฒ—์–ด๋‚˜์ง€ ์•Š๊ณ , ๊ณ ๊ฐ€์šฉ์„ฑ์„ ์ฑ™๊ธฐ๊ณ  ์‹ถ๋‹ค๋ฉด Redis Cluster๋ฅผ ์„ ํƒํ•˜๋Š” ๊ฒƒ์€ ์ข‹์€ ๋ฐฉํ–ฅ์œผ๋กœ ๋ณด์ธ๋‹ค.

๋ฐ˜๋ฉด์— ๊ทœ๋ชจ๊ฐ€ ๊ทธ๋‹ค์ง€ ํฌ์ง€ ์•Š๊ฑฐ๋‚˜ MultiKey Operation์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋Š” Redis Cluster๋ณด๋‹ค๋Š” Sentinel์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

 

 

์œ„์—์„œ ํ‚ค์— ๋”ฐ๋ผ ์–ด๋–ค ํด๋Ÿฌ์Šคํ„ฐ ๋…ธ๋“œ์— ๋“ค์–ด๊ฐ€๋Š” ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฐ”๋กœ Hash Slot์„ ์ด์šฉํ•œ ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ์–ธ๊ธ‰ํ–ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ์ƒค๋”ฉ์€ ๋‹จ์ˆœ ํ•ด์‹œ๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ๋…ธ๋“œ๋ฅผ ์ถ”์ ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, ์ด ๋ฐฉ๋ฒ•์€ ๊ต‰์žฅํžˆ ์ข‹๊ณ  ๊ฐ„๋‹จํ•˜๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด key ๊ฐ’์ด 'fruit'๋ผ๊ณ  ํ•˜๋ฉด, ํ•ด์‹œํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด key ๊ฐ’์˜ ํ•ด์‹œ๊ฐ’์„ ๊ตฌํ•˜๊ณ , ์ƒค๋”ฉ๋œ ์ด ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜๋งŒํผ ๋ชจ๋“ˆ๋Ÿฌ ์—ฐ์‚ฐ์„ ํ†ตํ•ด ์–ด๋А ๋…ธ๋“œ์— ์ €์žฅ๋  ์ง€ ๊ฒฐ์ •ํ•˜๋ฉด ๋˜๊ธฐ ๋–„๋ฌธ์ด๋‹ค!

๊ต‰์žฅํžˆ ์ง๊ด€์ ์ด๊ณ  ๊ฐ•๋ ฅํ•˜๊ณ  ์ข‹์€ ๋ฐฉ๋ฒ•์ด์ง€๋งŒ, ๋‹จ์ ์ด ๋ถ€๊ฐ๋˜๋Š” ์ƒํ™ฉ์€ ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์„ ๊ฒฝ์šฐ์ด๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด Hash ๊ฐ’์ด 2๋ผ๊ณ  ๊ฐ€์ •ํ•˜๊ณ , ํด๋Ÿฌ์Šคํ„ฐ ๋ณ€๊ฒฝ ์ „ ์ด ๋…ธ๋“œ ์ˆ˜๊ฐ€ 2๊ฐœ, ๋ณ€๊ฒฝ ์ดํ›„๋Š” 3๊ฐœ๋ผ๊ณ  ๊ฐ€์ •ํ•˜์ž.

๋ณ€๊ฒฝ์ „์—๋Š” 2 % 2 = 0 ์œผ๋กœ 0๋ฒˆ ๋…ธ๋“œ์— ์ €์žฅ๋˜์ง€๋งŒ, ๋ณ€๊ฒฝ ํ›„์—๋Š” 2 % 3 = 2๋กœ 2๋ฒˆ ๋…ธ๋“œ์— ์ €์žฅ๋˜๊ฒŒ ๋œ๋‹ค.

๋‹จ์ˆœ ํ•ด์‹œ์—์„œ๋Š” ํด๋Ÿฌ์Šคํ„ฐ์˜ ์ˆ˜์˜ ๋ณ€๊ฒฝ์— ์˜ํ•ด ๋ชจ๋“  ๋งคํ•‘์ด ์ƒˆ๋กœ ๊ณ„์‚ฐ๋˜์–ด์•ผ๋งŒ ํ•˜๋Š” ์†Œ์š”๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ๋ฐ–์— ์—†๋‹ค. ์ด๊ฒƒ์€ ์น˜๋ช…์ ์ธ ๋‹จ์ ์ด๋‹ค.

 

Hash Slot์„ ํ†ตํ•œ ๋ฐ์ดํ„ฐ ๋ถ„์‚ฐ์€ ์•ฝ๊ฐ„ ๋‹ค๋ฅด๋‹ค.

https://jaehoney.tistory.com/328

 

์œ„์˜ ๊ทธ๋ฆผ์„ ๋ณด๋ฉด, Redis Cluter๊ฐ€ ์ด 3๊ฐœ์˜ Master ๋…ธ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. Redis Cluster Hash Slot์€ 0~16383์˜ ์Šฌ๋กฏ์„ ๋ฏธ๋ฆฌ ๊ตฌ์„ฑํ•ด๋†“๊ณ , ํ•ด๋‹น ์Šฌ๋กฏ์˜ ๊ฐ ๋ฒ”์œ„๋ฅผ Cluster๊ฐ€ ๊ฐ๊ฐ ๋‚˜๋ˆ  ๊ฐ€์ง€๊ฒŒ ๋˜๋Š” ๊ตฌ์กฐ๋กœ ๊ตฌ์„ฑํ•œ๋‹ค.

Hash ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ CRC16์„ ์‚ฌ์šฉํ•˜๋ฉฐ, ํ‚ค๊ฐ’์„ ํ•ด๋‹น ์—ฐ์‚ฐ์„ ํ†ตํ•ด ํ•ด์‹œ ๊ฐ’์„ ์–ป์–ด๋‚ธ ์ดํ›„, ๋ชจ๋“ˆ๋Ÿฌ ์—ฐ์‚ฐ์„ ํ†ตํ•ด Hash Slot์˜ ๊ฐ’์„ ์–ป์–ด๋‚ธ๋‹ค.

ํ•ด๋‹น HashSlot์— ๋งคํ•‘๋œ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์ฐพ์•„๊ฐ€๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด์žˆ๋‹ค.

 

์ด๋ ‡๊ฒŒ ๋˜๋ฉด, ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ์ถ”๊ฐ€๋˜๊ณ  ์‚ญ์ œ๋˜๋ฉด ์˜ํ–ฅ์ด ๊ฐ€๋Š” Hash Slot์— ๋Œ€ํ•ด์„œ๋งŒ ๋ฐ์ดํ„ฐ์˜ ์žฌ๊ตฌ์„ฑ์ด ์ด๋ค„์ง€๋ฉด ๋œ๋‹ค.

๋ชจ๋“  ๋ฐ์ดํ„ฐ์— ์˜ํ–ฅ์ด ๊ฐ€๋Š” ๊ธฐ์กด ๋ฐฉ์‹๊ณผ๋Š” ์•ฝ๊ฐ„ ๋‹ค๋ฅธ ์ ์ด๋‹ค.

 

๋งŒ์•ฝ ํ•ด์‹œ์Šฌ๋กฏ์— ๋งคํ•‘๋˜์ง€ ์•Š์€ ๋‹ค๋ฅธ ํด๋Ÿฌ์Šคํ„ฐ์— ์š”์ฒญ์ด ๊ฐ€๋ฉด Redis๋Š” ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ• ๊นŒ?

Redis Cluster๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ MOVED ์—๋Ÿฌ๋ฅผ ๋‚ด๋ณด๋‚ธ๋‹ค.

 

 

MOVED [Hash Slot Num] [IP:Port]์˜ ํ˜•์‹์œผ๋กœ, ํ•ด๋‹น ๋…ธ๋“œ๊ฐ€ ๋‹ด๋‹นํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์˜๋ฏธ์˜ ์—๋Ÿฌ๋ฅผ ๋‚ด๋ณด๋‚ด๊ณ , ํ•ด๋‹น ํ•ด์‹œ์Šฌ๋กฏ์„ ๋‹ด๋‹นํ•˜๋Š” ์˜ฌ๋ฐ”๋ฅธ ํด๋Ÿฌ์Šคํ„ฐ ์„œ๋ฒ„์˜ IP์™€ ํฌํŠธ๋ฒˆํ˜ธ๋ฅผ ์•Œ๋ ค์ฃผ๊ฒŒ ๋œ๋‹ค.

 

"๊ทธ๋Ÿผ Redis๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ ์ž…์žฅ์—์„œ๋Š” ํด๋Ÿฌ์Šคํ„ฐ์— ์š”์ฒญ์„ ๋˜์ง€๊ณ  MOVED ์—๋Ÿฌ์— ๋Œ€ํ•œ ํ›„์ฒ˜๋ฆฌ๊นŒ์ง€ ๊ณ ๋ คํ•ด์•ผ ํ•˜๋Š” ์ˆ˜๊ณ ๋กœ์›€์ด ๋” ์žˆ์ง€ ์•Š๋А๋ƒ?"

๋ผ๋Š” ์งˆ๋ฌธ์„ ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, Spring ํ™˜๊ฒฝ์—์„œ๋Š” ์ด๋Ÿฌํ•œ ์ ์„ ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š๋„๋ก ์•Œ์•„์„œ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋œ๋‹ค.

๋‚ด๋ถ€์ ์œผ๋กœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ key-node๋ฅผ ๋งต์„ ์บ์‹ฑํ•ด์„œ ์ด๋Ÿฌํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋œ ๋ฐœ์ƒํ•˜๊ฒŒ๋” ๋งŒ๋“ค๊ณ , ๋ฐœ์ƒํ•˜๋”๋ผ๋„ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์•„๋„ ๋˜๊ฒŒ๋”(Redirect ๊ธฐ๋Šฅ) ํŽธ๋ฆฌํ•˜๊ฒŒ ๊ตฌ์„ฑ๋˜์–ด์žˆ๋‹ค.

 

์ด๋Ÿฌํ•œ Redis Cluster๋ฅผ ํ†ตํ•ด์„œ Single Redis๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ ๋งŒํผ์˜ ํผํฌ๋จผ์Šค๋ฅผ ๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

 

๋‹ค๋งŒ, Redis Cluster๊ฐ€ ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ์ด ํ•ญ์ƒ ์ง€์ผœ์ง€๋А๋ƒ?๋ผ๊ณ  ํ•œ๋‹ค๋ฉด ๊ทธ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค.

ํ•ญ์ƒ ๋ถ„์‚ฐ์‹œ์Šคํ…œ์—์„œ๋Š” ์„ฑ๋Šฅ์€ ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ๊ณผ trade-off ๊ด€๊ณ„์ด๊ธฐ ๋–„๋ฌธ์ด๋‹ค.

Redis Cluster๋Š” Master-Replica ๊ฐ„ ๋ฐ์ดํ„ฐ ๋ณต์ œ๊ฐ€ ๋น„๋™๊ธฐ ๋ฐฉ์‹์œผ๋กœ ์ด๋ค„์ง„๋‹ค. ์•„๋ž˜์˜ ๊ทธ๋ฆผ์„ ๋ณด๋ฉด ์ข€ ๋” ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์›Œ์ง„๋‹ค.

 

์‚ฌ์šฉ์ž๊ฐ€ Master ์„œ๋ฒ„์— ์“ฐ๊ธฐ ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด Master์—์„œ Replica๋กœ์˜ ๋ณต์ œ๋ฅผ ํ•˜๋Š” ๊ณผ์ •๊ณผ, ํ•ด๋‹น ๋‚ด์šฉ์„ ์“ฐ๊ธฐ ์™„๋ฃŒํ–ˆ๋‹ค๋Š” Ack ์‹ ํ˜ธ ๋ฆฌํ„ด์ด ๋™์‹œ์— ์ด๋ค„์ง„๋‹ค. ๋งŒ์•ฝ ์•„๋ž˜์™€ ๊ฐ™์€ ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ์ด๋ค„์ง„๋‹ค๋ฉด ๋ณต์ œ๋Š” ์‹คํŒจํ•˜๊ฒŒ ๋˜์–ด ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ์ด ๋–จ์–ด์ง€๊ฒŒ ๋œ๋‹ค.

 

1) ์“ฐ๊ธฐ ์š”์ฒญ ๋งˆ์Šคํ„ฐ ๋…ธ๋“œ์— ์ „๋‹ฌ

2) Replica๋กœ ๋ณต์ œ ์š”์ฒญ๊ณผ Ack ์‹ ํ˜ธ๋ฅผ ๋™์‹œ์— ์ „๋‹ฌ

3) ๋ณต์ œ ์š”์ฒญ์ด ์ด๋ค„์ง€๊ธฐ ์ „ master ๋…ธ๋“œ์˜ ๋‹ค์šด ๋ฐœ์ƒ

4) ๋ฐ์ดํ„ฐ ์œ ์‹ค

 

Redis Cluster๋Š” Sentinel๊ณผ ๋น„์Šทํ•˜๊ฒŒ Auto Failover ๊ธฐ๋Šฅ์„ ์ง€์›ํ•œ๋‹ค. ํŠน์ • Master ๋…ธ๋“œ๊ฐ€ ๋‹ค์šด๋˜๋”๋ผ๋„ ๊ณผ๋ฐ˜์ˆ˜ ์ด์ƒ์˜ Master ๋…ธ๋“œ๊ฐ€ ์‚ด์•„์žˆ์œผ๋ฉฐ ๋‹ค์šด๋œ ๋…ธ๋“œ์˜ Replica๊ฐ€ ์‚ด์•„์žˆ๋‹ค๋ฉด Failover ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๊ณ  Replica๋ฅผ Master๋กœ ์Šน๊ฒฉ์‹œํ‚ค๋Š” ์ž‘์—…์„ ์ž๋™์œผ๋กœ ์ˆ˜ํ–‰ํ•œ๋‹ค.

 

๋งŒ์•ฝ Replica๊ฐ€ Master๋กœ ์Šน๊ฒฉ๋œ ์ดํ›„์— ํ•ด๋‹น Master ๋…ธ๋“œ์˜ ํ†ต์‹ ์ด ์žฌ๊ฐœ๋˜๊ฑฐ๋‚˜ ์žฌ์‹œ์ž‘์„ ํ•œ๋‹ค๋ฉด, ์ด๋ฏธ Replica๊ฐ€ Master๋กœ ์Šน๊ฒฉ๋˜์—ˆ์œผ๋ฏ€๋กœ ํ•ด๋‹น ๋…ธ๋“œ๋Š” Replica๋กœ์จ ๋™์ž‘ํ•˜๊ฒŒ ๋œ๋‹ค.

 

๋˜ํ•œ Master๊ฐ€ ํ†ต์‹  ๋ถˆ๋Šฅ์ด๋ผ๋Š” ํŒ๋‹จ์€ ๊ณผ๋ฐ˜์ˆ˜์˜ master ๋…ธ๋“œ์™€ ํ†ต์‹ ํ•˜์ง€ ๋ชปํ•œ ๊ฒฝ์šฐ ์Šค์Šค๋กœ error state๋กœ ๋น ์ง€๊ฒŒ ๋˜๋ฉฐ write ์š”์ฒญ์„ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค.

 

 

 

 

์ €์ž‘์žํ‘œ์‹œ ๋น„์˜๋ฆฌ ๋™์ผ์กฐ๊ฑด (์ƒˆ์ฐฝ์—ด๋ฆผ)
    ๊ฐœ๋ฐœ์ž HOON
    ๊ฐœ๋ฐœ์ž HOON
    ์ข‹์€ ๋ฐฑ์—”๋“œ ์—”์ง€๋‹ˆ์–ด๊ฐ€ ๋˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋ก์„ ๋ชจ์•˜์Šต๋‹ˆ๋‹ค. # ์ฃผ๋‹ˆ์–ด # ๋ฐฑ์—”๋“œ # ๊ฐœ๋ฐœ์ž

    ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”