[Redis] What is Redis?

yoon-bomiยท2022๋…„ 8์›” 20์ผ
0
post-thumbnail

๐Ÿ’ก [NHN FORWARD 2021] Redis ์•ผ๋ฌด์ง€๊ฒŒ ์‚ฌ์šฉํ•˜๊ธฐ ๋ฅผ ์‹œ์ฒญํ•˜๋ฉฐ ์ •๋ฆฌํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.



What is Redis?

์ „์„ธ๊ณ„์—์„œ ๊ฐ€์žฅ ์œ ๋ช…ํ•œ Caching ์†”๋ฃจ์…˜
๋Œ€๋ถ€๋ถ„ cache ์šฉ๋„๋กœ Redis ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

  • Redis ์ข€ ๋” ์•Œ์•„๋ณด๊ธฐ
    Remote dictionary server (์™ธ๋ถ€ HashMap ์„œ๋ฒ„)
    Single Thread ์„œ๋ฒ„์ด๋‹ค. โ†’ ์‹œ๊ฐ„ ๋ณต์žก๋„ ๊ณ ๋ ค ํ•„์š” (O(N) X)

1. Redis ๋ฅผ cache ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

cache ?

  • cache ๋ž€ ์‚ฌ์šฉ์ž์˜ ์ž…์žฅ์—์„œ ๋ฐ์ดํ„ฐ์˜ ์›๋ž˜ ์†Œ์Šค๋ณด๋‹ค ๋” ๋น ๋ฅด๊ณ  ํšจ์œจ์ ์œผ๋กœ ์—‘์„ธ์Šค ํ•  ์ˆ˜ ์žˆ๋Š” ์ž„์‹œ ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ๋ฅผ ๋œปํ•œ๋‹ค.
  • ๋Œ€๋ถ€๋ถ„์˜ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์†๋„ ํ–ฅ์ƒ์„ ์œ„ํ•ด cache ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ๋”ฐ๋ผ์„œ cache ์— ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์ด ์›๋ณธ์— ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์‰ฝ๊ณ  ๋นจ๋ผ์•ผ ํ•œ๋‹ค.

Q. cache ๋Š” ์–ธ์ œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„๊นŒ?

A. ๋™์ผํ•œ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด ๋ฐ˜๋ณต์ ์œผ๋กœ ์•ก์„ธ์Šค ํ•˜๋Š” ์ƒํ™ฉ์ด ๋งŽ์„ ๋•Œ !

์˜๋ฏธ์žˆ๋Š” cache

  1. ๋ฐ์ดํ„ฐ์˜ ์žฌ์‚ฌ์šฉ ํšŸ์ˆ˜๊ฐ€ ํ•œ ๋ฒˆ ์ด์ƒ์ผ ๊ฒฝ์šฐ
  2. ์ž˜ ๋ณ€ํ•˜์ง€ ์•Š๋Š” ๋ฐ์ดํ„ฐ์ผ์ˆ˜๋ก cache ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋” ํšจ์œจ์ 

Redis as a cache

  • ๋‹จ์ˆœํ•œ key-value ๊ตฌ์กฐ : ์‚ฌ์šฉ์ด ๊ฐ„ํŽธํ•˜๊ณ  ๋ฐ์ดํ„ฐ ์ €์žฅ์ด ์‰ฝ๋‹ค.
  • in-memory ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ (RAM)
    • ๋น ๋ฅธ ์„ฑ๋Šฅ : ํ‰๊ท  ์ž‘์—… ์†๋„ < 1 ms, ์ดˆ๋‹น ์ˆ˜๋ฐฑ๋งŒ ๊ฑด์˜ ์ž‘์—… ๊ฐ€๋Šฅ

์บ์‹ฑ ์ „๋žต(Caching Strategies)

๋ฐ์ดํ„ฐ์˜ ์œ ํ˜•๊ณผ ํ•ด๋‹น ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ํŒจํ„ด์„ ์ž˜ ๊ณ ๋ คํ•ด์„œ ์„ ํƒํ•ด์•ผ ํ•œ๋‹ค.

1. look-aside

๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๋Š” ์ž‘์—…์ด ๋งŽ์„ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. (๊ฐ€์žฅ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•)

1๏ธโƒฃย ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์„ ๋•Œ cache ์— ๋จผ์ € ํ™•์ธํ•œ๋‹ค.

2๏ธโƒฃย cache ์— ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ, cache ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์˜ค๋Š” ์ž‘์—…์„ ๋ฐ˜๋ณตํ•œ๋‹ค.

3๏ธโƒฃย ๋งŒ์•ฝ redis ์— ์ฐพ๋Š” ํ‚ค๊ฐ€ ์—†๋‹ค๋ฉด ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์€ DB ์— ์ ‘๊ทผํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜จ ๋’ค ๋‹ค์‹œ redis ์— ์ €์žฅํ•˜๋Š” ๊ณผ์ •์„ ๊ฑฐ์นœ๋‹ค.

โ‡’ cache ๋Š” ์ฐพ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์„ ๋•Œ์—๋งŒ ์ž…๋ ฅ๋˜๊ธฐ ๋•Œ๋ฌธ์— Lazy Loading (์ง€์—ฐ๋กœ๋”ฉ) ์ด๋ผ๊ณ ๋„ ๋ถ€๋ฅธ๋‹ค.

์žฅ์ ๋‹จ์ 
โ€ข ์ด ๊ตฌ์กฐ๋Š” redis ๊ฐ€ ๋‹ค์šด๋˜๋”๋ผ๋„ ๋ฐ”๋กœ ์žฅ์• ๋กœ ์ด์–ด์ง€์ง€ ์•Š๊ณ  DB ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.โ€ข cache ๋กœ ๋ถ™์–ด์žˆ๋˜ ์ปค๋„ฅ์…˜์ด ๋งŽ์ด ์žˆ์—ˆ๋‹ค๋ฉด, ๊ทธ ์ปค๋„ฅ์…˜์ด ๋ชจ๋‘ DB ์— ๋ถ™๊ธฐ ๋•Œ๋ฌธ์— DB ์— ๊ฐ‘์ž๊ธฐ ๋งŽ์€ ๋ถ€ํ•˜๊ฐ€ ๋ชฐ๋ฆด ์ˆ˜ ์žˆ๋‹ค.
โ€ข ์ด๋Ÿฐ ๊ฒฝ์šฐ์— cache ๋ฅผ ์ƒˆ๋กœ ํˆฌ์ž…ํ•˜๊ฑฐ๋‚˜ DB ์—๋งŒ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ–ˆ๋‹ค๋ฉด ์ฒ˜์Œ์— ์บ์‹œ ๋ฏธ์Šค๊ฐ€ ์—„์ฒญ ๋ฐœ์ƒํ•ด์„œ ์„ฑ๋Šฅ์— ์ €ํ•˜๊ฐ€ ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

โ‡’ DB ์—์„œ cache ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ€์–ด ๋„ฃ์–ด์ฃผ๋Š” ์ž‘์—… : Cache Warming ์„ ํ†ตํ•ด ๋ฐฉ์ง€ ๊ฐ€๋Šฅ

ex) ํ‹ฐ์ผ“๋งํฌ์—์„œ ์ƒํ’ˆ ์˜คํ”ˆ ์ „ ์ƒํ’ˆ์˜ ์ •๋ณด๋ฅผ ๋ฏธ๋ฆฌ DB ์—์„œ cache ๋กœ ์˜ฌ๋ ค์ฃผ๋Š” ์ž‘์—…์„ ๋งค๋ฒˆ ํ•œ๋‹ค.

2. write-around

DB ์—๋งŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•œ๋‹ค.

1๏ธโƒฃย ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ DB ์— ์ €์žฅํ•œ๋‹ค.

2๏ธโƒฃย ์บ์‹œ ๋ฏธ์Šค๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ์—๋งŒ DB ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊บผ๋‚ด cache ๋กœ ๋Œ์–ด ์˜จ๋‹ค.

์žฅ์ ๋‹จ์ 
?โ€ข cache ๋‚ด์˜ ๋ฐ์ดํ„ฐ์™€ DB ๋‚ด์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค.

3. write-through

DB ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ๋•Œ, cache ์—๋„ ํ•จ๊ป˜ ์ €์žฅํ•œ๋‹ค.

์žฅ์ ๋‹จ์ 
โ€ข cache ์— ํ•ญ์ƒ ์ตœ์‹  ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹ด๊ฒจ์žˆ๋‹ค.โ€ข ์ €์žฅํ• ๋•Œ๋งˆ๋‹ค ๋‘ ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์ณ์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒ๋Œ€์ ์œผ๋กœ ๋Š๋ฆฌ๋‹ค.
โ€ข ์ €์žฅํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์žฌ์‚ฌ์šฉ๋˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๋Š”๋ฐ ๋ฌด์กฐ๊ฑด ์บ์‹œ์— ๋„ฃ์–ด๋ฒ„๋ ค์„œ ์ผ์ข…์˜ ๋ฆฌ์†Œ์Šค ๋‚ญ๋น„๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค.
  • ๋”ฐ๋ผ์„œ, ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ๋•Œ์—๋Š” expire time ์„ ์„ค์ •ํ•ด์ฃผ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

expire time ?
๋ช‡ ๋ถ„, ํ˜น์€ ๋ช‡ ์‹œ๊ฐ„๋™์•ˆ๋งŒ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๊ด€ํ•˜๊ฒ ๋‹ค๋Š” ์˜๋ฏธ

2. Redis ๋ฐ์ดํ„ฐ ํƒ€์ž…

  • Strings : set ์ปค๋งจ๋“œ๋ฅผ ์ด์šฉํ•ด ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋Š” ๋ชจ๋‘ String ํ˜•ํƒœ๋กœ ๋“ค์–ด๊ฐ„๋‹ค.
  • Bitmaps : string ์˜ ๋ณ€ํ˜•, bit ๋‹จ์œ„์˜ ์—ฐ์‚ฐ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  • Lists : ๋ฐ์ดํ„ฐ๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ์ €์žฅ == ํ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์ ์ ˆํ•˜๋‹ค.
  • Hashes : ํ•˜๋‚˜์˜ ํ‚ค ์•ˆ์— ๋˜๋‹ค์‹œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ•„๋“œ์™€ ๋ฒจ๋ฅ˜ ์Œ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•œ๋‹ค.
  • Sets : ์ค‘๋ณต๋˜์ง€ ์•Š์€ ๋ฌธ์ž์—ด์˜ ์ง‘ํ•ฉ
  • Sorted Sets : set ์ฒ˜๋Ÿผ ์ค‘๋ณต๋˜์ง€ ์•Š์€ ๋ชจ๋“  ๊ฐ’์„ score ๋ผ๋Š” ์ˆซ์ž ๊ฐ’์œผ๋กœ ์ €์žฅํ•œ๋‹ค. ์ €์žฅ๋  ๋•Œ๋ถ€ํ„ฐ score ์ˆœ์œผ๋กœ ์ •๋ ฌ๋˜๋ฉฐ, score ๊ฐ€ ๊ฐ™์„ ๋•Œ์—๋Š” ์‚ฌ์ „์ˆœ์œผ๋กœ ์ •๋ ฌ๋œ๋‹ค.
  • HyperLogLogs : ๊ต‰์žฅํžˆ ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ์ฃผ๋กœ ์“ฐ๋ฉฐ ์ค‘๋ณต๋˜์ง€ ์•Š๋Š” ๊ฐ’์˜ ๊ฐœ์ˆ˜๋ฅผ ์นด์šดํŠธํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. โ†’ ๋จผ์†Œ๋ฆฌ์ž„?
  • Streams : log ๋ฅผ ์ €์žฅํ•˜๊ธฐ ๊ฐ€์žฅ ์ข‹์€ ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค.

Best Practice - Counting

StringsBitsHyperLogLogs
โ€ข ๋‹จ์ˆœ ์ฆ๊ฐ ์—ฐ์‚ฐโ€ข ๋ฐ์ดํ„ฐ ์ €์žฅ๊ณต๊ฐ„ ์ ˆ์•ฝโ€ข ๋ชจ๋“  string ๋ฐ์ดํ„ฐ ๊ฐ’์„ ์œ ๋‹ˆํฌํ•˜๊ฒŒ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋‹ค.
โ€ข INCR (increment) / INCRBY (increment by)โ€ข ์ •์ˆ˜๋กœ ๋œ ๋ฐ์ดํ„ฐ๋งŒ ์นด์šดํŒ… ๊ฐ€๋Šฅโ€ข ๋Œ€์šฉ๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์นด์šดํŒ… ํ•  ๋•Œ ์ ์ ˆ
โ€ข ์ €์žฅ๋˜๋Š” ๋ฐ์ดํ„ฐ ๊ฐœ์ˆ˜์— ์ƒ๊ด€์—†์ด ๋ชจ๋‘ 12KB ๋กœ ๊ณ ์ • โ†’ ์šฉ๋Ÿ‰์ด ๋งค์šฐ ์ž‘์Œ
โ€ข ํ•œ ๋ฒˆ ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋Š” ๋‹ค์‹œ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์—†๋‹ค. (๊ฒฝ์šฐ์— ๋”ฐ๋ผ ๋ฐ์ดํ„ฐ ๋ณดํ˜ธ ๊ฐ€๋Šฅ) ex) ๊ฒ€์ƒ‰ ์—”์ง„์—์„œ ๊ฒ€์ƒ‰๋œ ์œ ๋‹ˆํฌํ•œ ๋‹จ์–ด๊ฐ€ ๋ช‡ ๊ฐœ์ธ์ง€

Best Practice - Messaging

ListsStreams
โ€ข ๋ฉ”์„ธ์ง€ ํ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์ ์ ˆโ€ข ๋กœ๊ทธ๋ฅผ ์ €์žฅํ•˜๊ธฐ ๊ฐ€์žฅ ์ ์ ˆํ•œ ์ž๋ฃŒ๊ตฌ์กฐ
โ€ข ์ž์ฒด์ ์ธ Blocking ๊ธฐ๋Šฅ โ†’ ๋ถˆํ•„์š”ํ•œ polling ์„ ๋ง‰์„ ์ˆ˜ ์žˆ๋‹ค, Event Queue ๋กœ ์‚ฌ์šฉโ€ข ์‹ค์ œ ์„œ๋ฒ„์— ๋กœ๊ทธ๊ฐ€ ์Œ“์ด๋Š” ๊ฒƒ์ฒ˜๋Ÿผ append-only ๋ฐฉ์‹์œผ๋กœ ์ €์žฅ, ์ค‘๊ฐ„์— ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ”๋€Œ์ง€ ์•Š๋Š”๋‹ค.
โ€ข ์นดํ”„์นด์˜ ๊ฐœ๋…์„ ๋งŽ์ด ์ฐจ์šฉ

ex) ์ธ์Šคํƒ€, ํŽ˜์ด์Šค๋ถ, ํŠธ์œ„ํ„ฐ์—๋Š” ์œ ์ €๋ณ„๋กœ ํƒ€์ž„๋ผ์ธ์ด ์กด์žฌํ•˜๊ณ , ๊ทธ ํƒ€์ž„๋ผ์ธ์—๋Š” ๋‚ด๊ฐ€ ํŒ”๋กœ์šฐํ•œ ์‚ฌ๋žŒ๋“ค์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋œฌ๋‹ค. ํŠธ์œ„ํ„ฐ์—์„œ๋Š” ๊ฐ ์œ ์ €์˜ ํƒ€์ž„๋ผ์ธ์— ๋ณด์ผ ํŠธ์œ—์„ ์บ์‹ฑํ•˜๊ธฐ ์œ„ํ•ด redis ์˜ list ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, ์ด ๋•Œ RPUSHX ์ปค๋งจ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์ด๋ฅผ ์ด์šฉํ•ด ํŠธ์œ„ํ„ฐ๋ฅผ ์ž์ฃผ ์ด์šฉํ•˜๋˜ ์œ ์ €์˜ ํƒ€์ž„๋ผ์ธ์—๋งŒ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฏธ๋ฆฌ ์บ์‹œํ•ด ๋†“์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ž์ฃผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์œ ์ €๋Š” caching key ์ž์ฒด๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ด ์œ ์ €๋“ค์„ ์œ„ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฏธ๋ฆฌ ์Œ“์•„๋‘๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋น„ํšจ์œจ์ ์ธ ์ž‘์—…์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

3. Redis ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์˜๊ตฌ ์ €์žฅํ•˜๊ธฐ(RDB vs AOF)

Redis ๋Š” in-memory ๋ฐ์ดํ„ฐ ์Šคํ† ์–ด

  • ๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์„œ๋ฒ„๋‚˜ redis ์ธ์Šคํ„ด์Šค๊ฐ€ ์žฌ์‹œ์ž‘๋˜๋ฉด ๋ชจ๋“  ๋ฐ์ดํ„ฐ ์œ ์‹ค
  • ๋ณต์ œ ๊ตฌ์กฐ๋กœ ๋˜์–ด์žˆ์–ด๋„ ๋ฐ์ดํ„ฐ ์œ ์‹ค์—์„œ ์•ˆ์ „ํ•˜์ง€ ์•Š๋‹ค.

Redis Persistence Option

1. AOF (Append Only File)

  • ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ์ปค๋ฉ˜๋“œ๊ฐ€ ๋“ค์–ด์˜ค๋ฉด ์ปค๋งจ๋“œ๋ฅผ ๊ทธ๋Œ€๋กœ ๋ชจ๋‘ ์ €์žฅํ•œ๋‹ค. (redis ํ”„๋กœํ† ์ฝœ ํ˜•ํƒœ๋กœ ์ €์žฅ)
  • ๋ฐ์ดํ„ฐ๊ฐ€ ์ถ”๊ฐ€๋˜๊ธฐ๋งŒ ํ•ด์„œ ๋Œ€๋ถ€๋ถ„ RDB ํŒŒ์ผ๋ณด๋‹ค ์‚ฌ์ด์ฆˆ๊ฐ€ ์ปค์ง„๋‹ค. โ†’ ์ฃผ๊ธฐ์ ์œผ๋กœ ์••์ถ•ํ•ด์„œ ์žฌ์ž‘์„ฑ๋˜๋Š” ๊ณผ์ •์„ ๊ฑฐ์ณ์•ผ ํ•œ๋‹ค.

2. RDB

  • ์Šค๋ƒ…์ƒท ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ โ†’ ์ €์žฅ ๋‹น์‹œ์˜ ๋ฉ”๋ชจ๋ฆฌ์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋Œ€๋กœ ์Šค๋ƒ…์ƒท์œผ๋กœ ์ฐ์–ด์„œ ์ €์žฅํ•œ๋‹ค. (๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ ํ˜•ํƒœ๋กœ ์ €์žฅ)

AOF ์™€ RDB ๋ชจ๋‘ ์ปค๋งจ๋“œ๋ฅผ ์ด์šฉํ•ด ์ง์ ‘ ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์›ํ•˜๋Š” ์‹œ์ ์— ์ž๋™์œผ๋กœ ํŒŒ์ผ์ด ์ƒ์„ฑ๋˜๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ž๋™์ˆ˜๋™
AOFredis.conf ํŒŒ์ผ์—์„œ auto-aof-rewrite-percentage ์˜ต์…˜(ํฌ๊ธฐ ๊ธฐ์ค€)BGREWRITEAOF ์ปค๋งจ๋“œ ์ด์šฉ โ†’ CLI ์ฐฝ์—์„œ ์ˆ˜๋™์œผ๋กœ AOF ํŒŒ์ผ ์žฌ์ž‘์„ฑ
RDBredis.conf ํŒŒ์ผ์—์„œ SAVE ์˜ต์…˜(์‹œ๊ฐ„ ๊ธฐ์ค€)BGSAVE ์ปค๋งจ๋“œ ์ด์šฉ โ†’ CLI ์ฐฝ์—์„œ ์ˆ˜๋™์œผ๋กœ RDB ํŒŒ์ผ ์ €์žฅ (SAVE ์ปค๋งจ๋“œ๋Š” ์ ˆ๋Œ€ ์‚ฌ์šฉ X)

AOF vs RDB ์„ ํƒ ๊ธฐ์ค€

  • ์šฐ์„  redis ๋ฅผ ์บ์‹œ๋กœ๋งŒ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, ๋‘˜ ๋‹ค ์“ธ ํ•„์š”๊ฐ€ ์—†๋‹ค.

1. ๋ฐฑ์—…์€ ํ•„์š”ํ•˜์ง€๋งŒ ์–ด๋Š ์ •๋„์˜ ๋ฐ์ดํ„ฐ ์†์‹ค์ด ๋ฐœ์ƒํ•ด๋„ ๊ดœ์ฐฎ์€ ๊ฒฝ์šฐ

  • RDB ๋‹จ๋… ์‚ฌ์šฉ
  • redis.conf ํŒŒ์ผ์—์„œ SAVE ์˜ต์…˜์„ ์ ์ ˆํžˆ ์‚ฌ์šฉ
    ex) SAVE 900 1 โ†’ 900 ์ดˆ ๋™์•ˆ ํ•œ ๊ฐœ ์ด์ƒ์˜ ํ‚ค๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ RDB ํŒŒ์ผ์„ ์žฌ์ž‘์„ฑํ•ด๋ผ.

2. ์žฅ์•  ์ƒํ™ฉ ์ง์ „๊นŒ์ง€์˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณด์žฅ๋˜์–ด์•ผ ํ•  ๊ฒฝ์šฐ

  • AOF ์‚ฌ์šฉ
  • APPENDFSYNC ์˜ต์…˜์ด everysec ์ธ ๊ฒฝ์šฐ ์ตœ๋Œ€ 1์ดˆ ์‚ฌ์ด์˜ ๋ฐ์ดํ„ฐ ์œ ์‹ค ๊ฐ€๋Šฅ(๊ธฐ๋ณธ ์„ค์ •)

3. ์ œ์ผ ๊ฐ•๋ ฅํ•œ ๋‚ด๊ตฌ์„ฑ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ

  • RDB & AOF ๋™์‹œ ์‚ฌ์šฉ

4. Redis ์•„ํ‚คํ…์ฒ˜

Replication (๋ณต์ œ)SentinelCluster
โ€ข ๋งˆ์Šคํ„ฐ์™€ ๋ฆฌํ”Œ๋ฆฌ์นด๋งŒ ์กด์žฌํ•˜๋Š” ๊ฐ„๋‹จํ•œ ๊ตฌ์กฐโ€ข ๋งˆ์Šคํ„ฐ์™€ ๋ฆฌํ”Œ๋ฆฌ์นด ๋…ธ๋“œ ์™ธ์— ์„ผํ‹ฐ๋„ ๋…ธ๋“œ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.โ€ข ์„ผํ‹ฐ๋„์€ ์ผ๋ฐ˜ ๋…ธ๋“œ๋“ค์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.
โ€ข ์ตœ์†Œ ์„ธ๋Œ€์˜ ๋งˆ์Šคํ„ฐ๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ ์ƒค๋”ฉ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.

1. Replication ๊ตฌ์„ฑ

  • ๋‹จ์ˆœํ•œ ๋ณต์ œ ์—ฐ๊ฒฐ
  • ๋ชจ๋“  redis ์˜ ๊ตฌ์กฐ์—์„œ ๋ณต์ œ๋Š” ๋น„๋™๊ธฐ์‹์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค. โ†’ ๋งˆ์Šคํ„ฐ์—์„œ ๋ณต์ œ๋ณธ์— ๋ฐ์ดํ„ฐ๊ฐ€ ์ž˜ ์ „๋‹ฌ๋๋Š”์ง€ ๋งค๋ฒˆ ํ™•์ธํ•˜๊ณ  ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๋Š”๋‹ค.
  • ์ด ๊ตฌ์กฐ๋Š” HA (High Availability) ๊ธฐ๋Šฅ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋งˆ์Šคํ„ฐ์— ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ˆ˜๋™์œผ๋กœ ๋ณ€๊ฒฝํ•ด์ค˜์•ผ ํ•˜๋Š” ์ž‘์—…๋“ค์ด ๋งŽ๋‹ค.
    (๋ฆฌํ”Œ๋ฆฌ์นด ๋…ธ๋“œ์— ์ง์ ‘ ์ ‘์†ํ•ด์„œ ๋ณต์ œ๋ฅผ ๋Š์–ด์•ผ ํ•˜๊ณ , ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋„ ์—ฐ๊ฒฐ ์„ค์ •์„ ๋ณ€๊ฒฝํ•˜์—ฌ ๋ฐฐํฌํ•˜๋Š” ์ž‘์—…์ด ํ•„์š”ํ•˜๋‹ค.)
  • HA (High Availability) ๊ธฐ๋Šฅ ?
    ์ž๋™ ํŽ˜์ผ์˜ค๋ฒ„(์žฅ์•  ๊ทน๋ณต ๊ธฐ๋Šฅ)

2. Sentienl ๊ตฌ์„ฑ

  • ์ž๋™ ํŽ˜์ผ์˜ค๋ฒ„ ๊ฐ€๋Šฅํ•œ HA ๊ตฌ์„ฑ(High Availability)
  • ์„ผํ‹ฐ๋„ ๋…ธ๋“œ๋Š” ์ผ๋ฐ˜์ ์ธ ๋‹ค๋ฅธ ๋…ธ๋“œ๋ฅผ ๊ณ„์† ๋ชจ๋‹ˆํ„ฐ๋ง โ†’ ๋งˆ์Šคํ„ฐ๊ฐ€ ์ฃฝ์œผ๋ฉด ์ž๋™์œผ๋กœ ํŽ˜์ผ์˜ค๋ฒ„๋ฅผ ๋ฐœ์ƒ์‹œ์ผœ ๊ธฐ์กด์˜ ๋ฆฌํ”Œ๋ฆฌ์นด ๋…ธ๋“œ๊ฐ€ ๋งˆ์Šคํ„ฐ๊ฐ€ ๋œ๋‹ค. ์ด๋•Œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ์—ฐ๊ฒฐ ์ •๋ณด๋ฅผ ๋ณ€๊ฒฝํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์„ผํ‹ฐ๋„ ๋…ธ๋“œ๋งŒ ์•Œ๊ณ  ์žˆ์œผ๋ฉด ๋˜๊ณ , ์„ผํ‹ฐ๋„์ด ๋ณ€๊ฒฝ๋œ ๋งˆ์Šคํ„ฐ ์ •๋ณด๋กœ ๋ฐ”๋กœ ์—ฐ๊ฒฐ์‹œ์ผœ ์ค€๋‹ค.
  • ์ด ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์„ผํ‹ฐ๋„ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ถ”๊ฐ€๋กœ ๋„์›Œ์•ผ ํ•˜๋Š”๋ฐ, ์„ผํ‹ฐ๋„์€ ํ•ญ์ƒ ์„ธ๋Œ€ ์ด์ƒ์˜ ํ™€์ˆ˜๋กœ ์กด์žฌํ•ด์•ผ ํ•œ๋‹ค.

3. Cluster ๊ตฌ์„ฑ

  • ์Šค์ผ€์ผ ์•„์›ƒ๊ณผ HA ๊ตฌ์„ฑ (High Availability)
  • ๋ฐ์ดํ„ฐ๊ฐ€ ์—ฌ๋Ÿฌ ๋งˆ์Šคํ„ฐ ๋…ธ๋“œ์— ์ž๋™์œผ๋กœ ๋ถ„ํ• ๋˜์–ด ์ €์žฅ๋˜๋Š” ์ƒค๋”ฉ ๊ธฐ๋Šฅ(์Šค์ผ€์ผ ์•„์›ƒ)์„ ์ œ๊ณตํ•œ๋‹ค.
  • ๋ชจ๋“  ๋…ธ๋“œ๊ฐ€ ์„œ๋กœ ๊ฐ์‹œํ•˜๊ณ  ์žˆ๋‹ค๊ฐ€ ๋งˆ์Šคํ„ฐ๊ฐ€ ๋น„์ •์ƒ ์ƒํƒœ์ผ ๋•Œ ์ž๋™์œผ๋กœ ํŽ˜์ผ์˜ค๋ฒ„๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค.
  • ์ตœ์†Œ ์„ธ๋Œ€ ์ด์ƒ์˜ ๋งˆ์Šคํ„ฐ ๋…ธ๋“œ๊ฐ€ ํ•„์š”ํ•˜๊ณ , ๋ฆฌํ”Œ๋ฆฌ์นด ๋…ธ๋“œ๋ฅผ ํ•˜๋‚˜์”ฉ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒŒ ์ผ๋ฐ˜์ ์ธ ๊ตฌ์กฐ์ด๋‹ค.

5. Redis ์šด์˜ ํŒ๊ณผ ์žฅ์•  ํฌ์ธํŠธ

redis ๋Š” ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ๋กœ ๋™์ž‘ํ•œ๋‹ค.

ํ•œ ์‚ฌ์šฉ์ž๊ฐ€ ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ์ปค๋งจ๋“œ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค๋ฉด ๋ณ‘๋ชฉํ˜„์ƒ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

์‚ฌ์šฉํ•˜๋ฉด ์•ˆ๋˜๋Š” ์ปค๋งจ๋“œ

  • keys โ†’ scan ์œผ๋กœ ๋Œ€์ฒด
  • Hash ๋‚˜ Sorted Set ๋“ฑ ์ž๋ฃŒ๊ตฌ์กฐ
    • hgetall โ†’ hscan
    • del โ†’ unlink

๋ณ€๊ฒฝํ•˜๋ฉด ์žฅ์• ๋ฅผ ๋ง‰์„ ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ณธ ์„ค์ •๊ฐ’

  • STOP-WRITES-ON-BGSAVE-ERROR = NO
    • RDB ํŒŒ์ผ ์ €์žฅ ์‹คํŒจ ์‹œ redis ๋กœ์˜ ๋ชจ๋“  write ๋ถˆ๊ฐ€๋Šฅ
  • MAXMEMORY-POLICY = ALLKEYS-LRU
    • redis ๋ฅผ ์บ์‹œ๋กœ ์‚ฌ์šฉํ•  ๋•Œ expire time ์„ค์ • ๊ถŒ์žฅ
    • ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๊ฐ€๋“ ์ฐผ์„ ๋•Œ MAXMEMORY-POLICY ์ •์ฑ…์— ์˜ํ•ด ํ‚ค ๊ด€๋ฆฌ : ALLKEYS-LRU โ†’ ๋ชจ๋“  key ์— ๋Œ€ํ•ด lru ๋ฐฉ์‹(๊ฐ€์žฅ ์ตœ๊ทผ์— ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜๋˜ key ๋ถ€ํ„ฐ ์‚ญ์ œํ•œ๋‹ค)์œผ๋กœ key ๋ฅผ ์‚ญ์ œํ•˜๊ฒ ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธ



ref. https://www.youtube.com/watch?v=92NizoBL4uA

profile
์›น ํ’€์Šคํƒ์—์„œ ๋ฐฑ์—”๋“œ๋กœ ์ง„ํ™”์ค‘ ๐Ÿงš๐Ÿปโ€โ™€๏ธ

0๊ฐœ์˜ ๋Œ“๊ธ€