Spike Traffic์— ๋Œ€ํ•œ ๊ณ ์ฐฐ ๋ฐ ์ฒ˜๋ฐฉ

youngki
  • #Spike Traffic
  • #NoSQL
  • #DynamoDB
  • #fromm

๋“ค์–ด๊ฐ€๋ฉฐ

์•ˆ๋…•ํ•˜์„ธ์š”. ๋…ธ๋จธ์Šค์—์„œ ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์„ ํ•˜๊ณ  ์žˆ๋Š” ์œ ์˜๊ธฐ์ž…๋‹ˆ๋‹ค.

์ €๋Š” ์ด์ „์— ์ €ํฌ๊ฐ€ DynamoDB๋ฅผ ๋„์ž…ํ•˜๋ฉด์„œ ๋А๋‚€ ํ†ต์ฐฐ์„ ๊ทธ๋ฆผ์œผ๋กœ ํ‘œํ˜„ํ•œ ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
RDB_NoSQL.png
์›๋ณธ์— ๊ฐ€๊นŒ์šด ์ฒ˜๋ฆฌ ์ „ ๋ฐ์ดํ„ฐ๋Š” RDB์—,
์ฒ˜๋ฆฌ ํ›„ ์†Œ๋น„ํ•˜๊ธฐ ์ข‹์€ ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ๋Š” NoSQL์—
์ €์žฅํ•˜๋Š” ๊ฒƒ์ด ํšจ๊ณผ์ ์ด๋ผ๋Š” ๋‚ด์šฉ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฒˆ์—๋„ NoSQL์— ๊ด€ํ•œ ๋‚ด์šฉ์ธ๋ฐ, ํŠธ๋ž˜ํ”ฝ ๊ด€์ ์—์„œ ๋ฐ”๋ผ๋ณธ ์‹ค์ œ ์ ์šฉ ์‚ฌ๋ก€์™€ ๊ทธ ํšจ๊ณผ์— ๋Œ€ํ•ด ๊ณต์œ ํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.

RDS Proxy๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์ง€๋งŒ, ๊ฐ™์€ ํŠธ๋ž˜ํ”ฝ์—์„œ Lambda๋Š” ECS๋ณด๋‹ค ํ›จ์”ฌ ๋งŽ์€ RDS connection์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
์ €ํฌ๋Š” latency๊ฐ€ ์ค‘์š”ํ•œ ์„œ๋น„์Šค์—์„œ๋Š” ECS๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ, ๋งŽ์€ ๋ถ€๋ถ„ Lambda๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์–ด, ํŠนํžˆ spike ํŠธ๋ž˜ํ”ฝ์—์„œ ๋”์šฑ ๋ถˆ๋ฆฌํ•œ ์ฒ˜์ง€์˜€์Šต๋‹ˆ๋‹ค.

์ด๋ฒˆ์— ์ €ํฌ๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ์˜ ๋Œ€๊ทœ๋ชจ read spike ํŠธ๋ž˜ํ”ฝ์— ํ•ด๋‹นํ•˜๋Š” ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ๋ฅผ DynamoDB๋กœ ์ด๊ด€ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
Fromm Channel์—๋Š” Artist๊ฐ€ ์ฑ„ํŒ…๊ณผ ํ•จ๊ป˜ Live ๋ฐฉ์†ก์„ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด ์žˆ๋Š”๋ฐ,
์ด๋•Œ ์ฝ์–ด์™€์•ผ ํ•˜๋Š” ์‚ฌ์šฉ์ž๋งˆ๋‹ค์˜ ๊ณ ์œ  ์ •๋ณด๋ฅผ NoSQL๋กœ ์ด๊ด€ํ•˜์—ฌ, ๋Œ€์šฉ๋Ÿ‰ ํŠธ๋ž˜ํ”ฝ์„ ๋ถ„์‚ฐํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

write์—๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ ์•ฝ๊ฐ„์˜ ์ง€์—ฐ์„ ๊ฐ€๋ฏธํ•ด๋„ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์ด ํฌ๊ฒŒ ํ›ผ์†๋˜์ง€ ์•Š๋Š”๋ฐ,
read๋Š” ๋А๋ฆฐ ์‘๋‹ต์ด ์‚ฌ์šฉ์ž ๋งŒ์กฑ๋„์— ๋” ํฐ ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์‹ค์ œ ๊ฒฝํ—˜์„ ๋ฐ”ํƒ•์œผ๋กœ, ๋Œ€๊ทœ๋ชจ ํŠธ๋ž˜ํ”ฝ ์ƒํ™ฉ์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ ํƒ๊ณผ ์„ค๊ณ„์— ๋Œ€ํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

1. ๋Œ€๊ทœ๋ชจ ํŠธ๋ž˜ํ”ฝ์˜ ์ผ๋ฐ˜์ ์ธ ๋Œ€์ฒ˜ ๋ฐฉ์•ˆ

๋Œ€๊ทœ๋ชจ ํŠธ๋ž˜ํ”ฝ์„ read/write์™€ ๋ฐ์ดํ„ฐ ๋™์ผ์„ฑ ๊ด€์ ์—์„œ ๊ตฌ๋ถ„ํ•˜๊ณ ,
์ œ๊ฐ€ ์ƒ๊ฐํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ๋Œ€์ฒ˜ ๋ฐฉ์•ˆ์„ ๋– ์˜ฌ๋ ค ๋ณด์•˜์Šต๋‹ˆ๋‹ค.

readwrite
๋™์ผํ•œ ๋ฐ์ดํ„ฐCacheIgnore
์„œ๋กœ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐReplicationQueuing

์—ฌ๊ธฐ์„œ ๊ฐ ์ „๋žต์— ๋Œ€ํ•ด ๊ฐ„๋žตํžˆ ์„ค๋ช…ํ•˜์ž๋ฉด:

  • Cache(์บ์‹œ): ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜๋ณต์ ์œผ๋กœ ์ฝ๋Š” ๊ฒฝ์šฐ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ ‘๊ทผ์„ ์ค„์ด๊ธฐ ์œ„ํ•ด Redis๋‚˜ Memcached ๊ฐ™์€ ์ธ๋ฉ”๋ชจ๋ฆฌ ์บ์‹œ๋ฅผ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋งŽ์€ ์‚ฌ์šฉ์ž๊ฐ€ ๋™์ผํ•œ ์ƒํ’ˆ ์ •๋ณด๋ฅผ ์กฐํšŒํ•˜๋Š” ๊ฒฝ์šฐ์— ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค.
  • Ignore(๋ฌด์‹œ): ๋™์ผํ•œ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ค‘๋ณต ์“ฐ๊ธฐ ์š”์ฒญ์€ ์ผ๋ถ€ ๋ฌด์‹œํ•˜๊ฑฐ๋‚˜ ๋ณ‘ํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Replication(๋ณต์ œ): ์„œ๋กœ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๋Š” ๊ฒฝ์šฐ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์—ฌ๋Ÿฌ ๋…ธ๋“œ๋กœ ๋ณต์ œํ•˜์—ฌ ๋ถ€ํ•˜๋ฅผ ๋ถ„์‚ฐ์‹œํ‚ต๋‹ˆ๋‹ค. ๊ฐ ์‚ฌ์šฉ์ž๊ฐ€ ์ž์‹ ์˜ ๊ณ ์œ ํ•œ ์ •๋ณด๋ฅผ ์กฐํšŒํ•˜๋Š” ๊ฒฝ์šฐ์— ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค.
  • Queuing(๋Œ€๊ธฐ์—ด): ์„œ๋กœ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์“ฐ๊ธฐ ์š”์ฒญ์ด ๋งŽ์„ ๊ฒฝ์šฐ, SQS๋‚˜ Kafka ๊ฐ™์€ ๋ฉ”์‹œ์ง€ ํ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์š”์ฒญ์„ ์ˆœ์ฐจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋งŽ์€ ์‚ฌ์šฉ์ž๊ฐ€ ๊ฐ์ž ๋‹ค๋ฅธ ์ฃผ๋ฌธ์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

2. ์ฃผ์š” ํ…Œ์ด๋ธ” ๋ ˆ์ฝ”๋“œ ์ˆ˜ ํ˜„ํ™ฉ

ํ…Œ์ด๋ธ”row ๊ฐœ์ˆ˜
์ƒํ’ˆXXXXX
์‚ฌ์šฉ์žXXXXXX
์ฃผ๋ฌธXXXXXXX

์ƒํ’ˆ < ์‚ฌ์šฉ์ž < ์ฃผ๋ฌธ : ์ˆœ์œผ๋กœ ๋ ˆ์ฝ”๋“œ ์ˆ˜๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.

์ด๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋„๋ฉ”์ธ์˜ ํŠน์„ฑ์„ ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค.
์ƒํ’ˆ ์ˆ˜๋Š” ์ƒ๋Œ€์ ์œผ๋กœ ์ œํ•œ์ ์ธ ๋ฐ˜๋ฉด, ์‚ฌ์šฉ์ž ์ˆ˜๋Š” ๋” ๋งŽ๊ณ , ์ฃผ๋ฌธ์€ ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ๊ณ„์† ๋ˆ„์ ๋ฉ๋‹ˆ๋‹ค.
์ด๋Ÿฌํ•œ ๋ฐ์ดํ„ฐ ํŠน์„ฑ์€ ๊ฐ ํ…Œ์ด๋ธ”์— ์ ํ•ฉํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ ํƒ๊ณผ ํŠธ๋ž˜ํ”ฝ ์ฒ˜๋ฆฌ ์ „๋žต์— ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค.

3. ๋Œ€๊ทœ๋ชจ ํŠธ๋ž˜ํ”ฝ์—์„œ ์ฃผ์š” ํ…Œ์ด๋ธ”์˜ ํŠธ๋ž˜ํ”ฝ ํŒจํ„ด

ํ…Œ์ด๋ธ”readwrite
์ƒํ’ˆ๋Œ€์šฉ๋Ÿ‰ ์ค‘๋ณต ์ฝ๊ธฐ (๋งŽ์€ ์‚ฌ์šฉ์ž๊ฐ€ ๋™์ผํ•œ ์ƒํ’ˆ ์ •๋ณด ์กฐํšŒ)์†Œ๊ทœ๋ชจ ์ƒ์„ฑ ํŠธ๋ž˜ํ”ฝ
์‚ฌ์šฉ์ž๋Œ€์šฉ๋Ÿ‰ ๋ถ„์‚ฐ ์ฝ๊ธฐ (๊ฐ ์‚ฌ์šฉ์ž๊ฐ€ ์ž์‹ ์˜ ์ •๋ณด๋งŒ ์กฐํšŒ)์†Œ๊ทœ๋ชจ ๊ฐฑ์‹  ํŠธ๋ž˜ํ”ฝ
์ฃผ๋ฌธ์†Œ๊ทœ๋ชจ ์กฐํšŒ ํŠธ๋ž˜ํ”ฝ๋Œ€์šฉ๋Ÿ‰ ๋ถ„์‚ฐ ์“ฐ๊ธฐ (๋งŽ์€ ์‚ฌ์šฉ์ž๊ฐ€ ๊ฐ์ž ๋‹ค๋ฅธ ์ฃผ๋ฌธ ์ƒ์„ฑ)

๊ฐ ํ…Œ์ด๋ธ”์˜ ํŠธ๋ž˜ํ”ฝ ํŒจํ„ด์„ ์ž์„ธํžˆ ์‚ดํŽด๋ณด๋ฉด:

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

4. ์„œ๋กœ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ์˜ ๋Œ€๊ทœ๋ชจ ํŠธ๋ž˜ํ”ฝ ๋Œ€์‘ ์ „๋žต: NoSQL ์ ์šฉ

readwrite
์„œ๋กœ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐreplication or NoSQLqueuing or NoSQL

์•ž์„œ ์„œ๋กœ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ๋Œ€๊ทœ๋ชจ ํŠธ๋ž˜ํ”ฝ ์ฒ˜๋ฆฌ๋ฅผ ์ผ๋ฐ˜์ ์ธ ๋ฐฉ์•ˆ์œผ๋กœ replication๊ณผ queuing์œผ๋กœ ์ •๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ์ด๋Ÿฌํ•œ ํŒจํ„ด์—์„œ๋Š” ํ˜„์žฌ ์ €ํฌ๊ฐ€ ์‚ฌ์šฉ ์ค‘์ธ DynamoDB ๊ฐ™์€ NoSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋„์ž…๋„ ํšจ๊ณผ์ ์ธ ๋Œ€์•ˆ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

NoSQL์˜ ์žฅ์ 

DynamoDB์™€ ๊ฐ™์€ NoSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ๋Œ€๊ทœ๋ชจ ํŠธ๋ž˜ํ”ฝ ์ฒ˜๋ฆฌ์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค:

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

๋งˆ์น˜๋ฉฐ

replication๋ฅผ ์‚ฌ์šฉํ•˜๋”๋ผ๋„, ์˜ˆ์ธก ๋ถˆ๊ฐ€๋Šฅํ•œ ๋Œ€๊ทœ๋ชจ ํŠธ๋ž˜ํ”ฝ์— ๋Œ€๋น„ํ•˜๋ ค๋ฉด ๋งŽ์€ ์ˆ˜์˜ replica๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ์ €ํฌ๊ฐ€ ์ฆ๊ฒจ ์‚ฌ์šฉํ•˜๋Š” Lambda๋Š” DynamoDB์™€ ๋น„์šฉ ๊ด€์ ์—์„œ ๋งค์šฐ ์œ ๋ฆฌํ•œ ์กฐํ•ฉ์ž…๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ์™€ Join ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๊ณ (Key Value ํ˜•ํƒœ๋กœ ์ €์žฅํ•  ์ˆ˜ ์žˆ๊ณ , ์‚ฌ์šฉ์ž๋ผ๋ฆฌ ๊ณต์œ ํ•˜์ง€ ์•Š๋Š” ๋ฐ์ดํ„ฐ),
์งง์€ ์‹œ๊ฐ„์— read ํ˜น์€ write๋˜๋Š” ๋ฐ์ดํ„ฐ๋ผ๋ฉด NoSQL์„ ๊ณ ๋ คํ•ด ๋ณผ ๋งŒํ•ฉ๋‹ˆ๋‹ค.

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

โ† ๋ชฉ๋ก์œผ๋กœ ๋Œ์•„๊ฐ€๊ธฐ

Art Changes Life

๋…ธ๋จธ์Šค์™€ ํ•จ๊ป˜ ์—”ํ„ฐํ…Œํฌ ์‚ฐ์—…์„ ํ˜์‹ ํ•ด๋‚˜๊ฐˆ ๋ฉค๋ฒ„๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.

์ฑ„์šฉ ์ค‘์ธ ๊ณต๊ณ  ๋ณด๊ธฐ