(๋ฒˆ์—ญ) Database sharding์ด๋ž€? ๐Ÿ”จ

yeeun leeยท2020๋…„ 10์›” 17์ผ
2
post-custom-banner

์ƒค๋”ฉ์˜ ๊ฐœ๋…์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด, understanding-database-sharding์„ ๋ฒˆ์—ญํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค.

1. ๋œป

shard์˜ ์‚ฌ์ „์  ์˜๋ฏธ๋Š” (์œ ๋ฆฌยท๊ธˆ์† ๋“ฑ์˜) ์กฐ๊ฐ, ํŒŒํŽธ์ด๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ธก๋ฉด์—์„œ ๋ณธ๋‹ค๋ฉด sharding์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์กฐ๊ฐ์œผ๋กœ ๋‚˜๋ˆ„๋Š” ๊ฒƒ์œผ๋กœ ์ƒ๊ฐํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์ƒค๋”ฉ(sharding)์€ horizontal partitioning๊ณผ ๊ด€๋ จ๋œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค๊ณ„ ํŒจํ„ด์ด๋‹ค. ํ•œ ํ…Œ์ด๋ธ”์˜ row๋“ค์„ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์„œ๋กœ ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”, ์ฆ‰ ํŒŒํ‹ฐ์…˜์œผ๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

vertical partitioning์˜ ๊ฒฝ์šฐ ์—ด ์ „์ฒด๊ฐ€ ์™„์ „ํžˆ ์ƒˆ๋กœ์šด ํ…Œ์ด๋ธ”๋กœ ๋ถ„๋ฆฌ๋˜๊ธฐ ๋•Œ๋ฌธ์—, ํ…Œ์ด๋ธ” ๋‚ด์˜ ๋ฐ์ดํ„ฐ๋“ค์€ ๋…๋ฆฝ์ ์ด๋ฉฐ ์—ด๊ณผ ํ–‰์ด ๋ชจ๋‘ ๋‹ฌ๋ผ์ง„๋‹ค.

shards๋Š” ์ƒค๋”ฉ์„ ํ†ตํ•ด ๋‚˜๋ˆ„์–ด์ง„ ๋ธ”๋ก๋“ค์„ ๋งํ•œ๋‹ค. ์ƒค๋”ฉ์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ž‘์€ ๋ฉ์–ด๋ฆฌ(smaller chunks)๋กœ ์ชผ๊ฐœ๋Š” ๊ฒƒ์ด๊ณ , ์ด ์ž‘์€ ๋ฉ์–ด๋ฆฌ๋ฅผ logical shards๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. logical shards๋Š” ๋ถ„๋ฆฌ๋œ physical shard, ์ฆ‰ database node์— ๋ฟŒ๋ ค์ง„๋‹ค.

database node: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งํ•œ๋‹ค. main node๋Š” ์“ฐ๊ธฐ, ๊ทธ ์™ธ์˜ ๋…ธ๋“œ๋Š” ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์ด ์ „ํ˜•์ ์ด๋‹ค. main node๋ฅผ ๋ณ€๊ฒฝํ–ˆ์„ ๋•Œ ๋‚˜๋จธ์ง€ node๋“ค์€ ๊ทธ์— ๋”ฐ๋ผ ๋ณ€ํ•˜๊ฒŒ ๋˜๋Š” ๊ตฌ์กฐ๋‹ค. (์ฐธ๊ณ )

shards๋“ค์€ ์ž๋ฆฝ์„ฑ์ด ๊ฐ•ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋‚˜ ์ปดํ“จํ„ฐ ์ž์›์„ ๊ณต์œ ํ•˜์ง€ ์•Š๋Š”๋‹ค. (๋ฌผ๋ก  reference table๋กœ ์‚ฌ์šฉํ•  ๋ชฉ์ ์œผ๋กœ ๊ฐ shards์— ํŠน์ • ํ…Œ์ด๋ธ”์„ ๋ณต์ œํ•  ์ˆ˜๋Š” ์žˆ๋‹ค.)

2. ๊ตฌํ˜„

์ฃผ๋กœ application level์—์„œ ์‹คํ–‰๋œ๋‹ค. ์—ฌ๊ธฐ์„œ application์ด๋ž€ ์–ด๋–ค shards์— ์ฝ๊ธฐ์™€ ์“ฐ๊ธฐ๋ฅผ ์ „์†กํ• ์ง€๋ฅผ ์ •์˜ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค. ์–ด๋–ค ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์€ ๋‚ด์žฅ๋œ sharding ๋Šฅ๋ ฅ์ด ์žˆ์–ด์„œ database level์—์„œ ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

3. ์žฅ๋‹จ์ 

benefits

  • ์ˆ˜ํ‰์  ํ™•์žฅ horizontal scaling (=scaling out)์ด ๊ฐ€๋Šฅํ•˜๋‹ค: ์„œ๋ฒ„์˜ ํ•˜๋“œ์›จ์–ด(RAM, CPU ๋“ฑ)๋ฅผ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๋Š” ์ˆ˜์ง์  ํ™•์žฅ๊ณผ ๋‹ค๋ฅด๊ฒŒ, ์กด์žฌํ•˜๋Š” stack์— machine์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋Šฅ๋ ฅ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.
  • ์ฟผ๋ฆฌ ๋ฐ˜์‘ ์†๋„๋ฅผ ๋น ๋ฅด๊ฒŒ ํ•œ๋‹ค: ์Šค์บ” ๋ฒ”์œ„๋ฅผ ์ค„์ด๊ธฐ ๋•Œ๋ฌธ!
  • application์„ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ ๋‹ค: outage๊ฐ€ ์ƒ๊ฒผ์„ ๋•Œ, un-sharded ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ๋‹ค๋ฅด๊ฒŒ ๋‹จ์ผ shard์—๋งŒ ์˜ํ–ฅ์„ ์ค„ ํ™•๋ฅ ์ด ๋†’๋‹ค. application์ด ์ผ๋ถ€๋ผ๋„ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๋„๋ก ์œ„ํ—˜์„ ์™„ํ™”์‹œ์ผœ์ค€๋‹ค.

throwbacks

  • ์ž˜๋ชป ์‚ฌ์šฉํ–ˆ์„ ๋•Œ risk(๋ฐ์ดํ„ฐ ์†์ƒ, ์œ ์‹ค ๋“ฑ)๊ฐ€ ํฌ๋‹ค.
  • ๋ฐ์ดํ„ฐ๊ฐ€ ํ•œ ์ชฝ shards์— ์ ๋ ค sharding์ด ๋ฌด์˜๋ฏธ ํ•ด์งˆ ์ˆ˜ ์žˆ๋‹ค.
  • ํ•œ ๋ฒˆ ์ชผ๊ฐœ๊ฒŒ ๋˜๋ฉด, ๋‹ค์‹œ un-sharded ๊ตฌ์กฐ๋กœ ๋Œ๋ฆฌ๊ธฐ ์–ด๋ ต๋‹ค.
  • ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—”์ง„์—์„œ natively supprt ๋˜์ง€ ์•Š๋Š”๋‹ค.

4. ๊ตฌ์กฐ

๋ฐ์ดํ„ฐ๊ฐ€ ๋งž๋Š” shard์— ๋“ค์–ด๊ฐ€๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ ์žƒ๊ฑฐ๋‚˜ ์ฟผ๋ฆฌ๊ฐ€ ๋งค์šฐ ๋Š๋ ค์ง„๋‹ค. ๋ณดํŽธ์ ์ธ sharding ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

Key Based Sharding

๋‹ค๋ฅธ ๋ง๋กœ hash based sharding์ด๋ผ๊ณ ๋„ ๋ถˆ๋ฆฐ๋‹ค. ์ƒˆ๋กœ ์“ฐ์ธ ๋ฐ์ดํ„ฐ(๊ณ ๊ฐ์˜ number ID, ํด๋ผ์ด์–ธํŠธ์˜ IP์ฃผ์†Œ, ์šฐํŽธ ๋ฒˆํ˜ธ์™€ ๊ฐ™์€)๋กœ๋ถ€ํ„ฐ value๋ฅผ ๋ฐ›์•„ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๊ฐ€ ์–ด๋Š shard๋กœ ๊ฐˆ์ง€ ๊ฒฐ์ •ํ•˜๋Š” hash ํ•จ์ˆ˜์™€ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

hash ํ•จ์ˆ˜๋Š” ๊ณ ๊ฐ ์ด๋ฉ”์ผ๊ณผ ๊ฐ™์€ ๋ฐ์ดํ„ฐ ์กฐ๊ฐ์„ Input์œผ๋กœ ๋ฐ›์•„, hash value๋ผ๋Š” ์™„์ „ํžˆ ๋‹ค๋ฅธ ํ˜•ํƒœ์˜ value๋ฅผ Ouput์œผ๋กœ ๋‚ด๋ณด๋‚ธ๋‹ค. sharding์˜ ๊ด€์ ์—์„œ ๋ดค์„ ๋•Œ hash value๋Š” ๋“ค์–ด์˜ค๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋  shard๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” shard ID๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค.

shard key

์˜ฌ๋ฐ”๋ฅธ shard์— ์ผ๊ด€์„ฑ ์žˆ๋Š” ๋ฐฉ์‹์œผ๋กœ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋„๋ก entry๋ฅผ ์œ„์น˜์‹œํ‚ค๊ธฐ ์œ„ํ•ด, hash ํ•จ์ˆ˜์— ๋“ค์–ด๊ฐ€๋Š” value๋“ค์€ ๊ฐ™์€ column์—์„œ ๋‚˜์™€์•ผ ํ•œ๋‹ค. ์ด colum์„ shard key๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

  • ๊ฐ ํ–‰์„ ์œ„ํ•œ ๊ณ ์œ  ์‹๋ณ„์ž๋ฅผ ์ƒ์„ฑํ•œ๋‹ค๋Š” ์ธก๋ฉด์—์„œ shard keys๋Š” primary keys(pk)์™€ ๋น„์Šทํ•˜๋‹ค.
  • ๋„“๊ฒŒ ๋ณธ๋‹ค๋ฉด, shard key๋Š” ์ •์ ์ด์–ด์•ผ ํ•˜๊ณ  ์‹œ๊ฐ„์— ๋”ฐ๋ผ ๋ฐ”๋€Œ์–ด์„œ๋Š” ์•ˆ ๋œ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์—…๋ฐ์ดํŠธ์— ํ•„์š”ํ•œ ์ž‘์—…์ด ์ฆ๊ฐ€ํ•˜๊ณ  ํผํฌ๋จผ์Šค๋ฅผ ๋Š๋ฆฌ๊ฒŒํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‹จ์ 

key based sharding์ด ๋งŽ์ด ์“ฐ์ด๊ธด ํ•˜์ง€๋งŒ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์„œ๋ฒ„๋ฅผ ๋™์ ์œผ๋กœ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•  ๋•Œ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ๋‹ค. ์„œ๋ฒ„๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ ๊ฐ๊ฐ์˜ ์„œ๋ฒ„๋Š” ๊ทธ์— ์ƒ์‘ํ•˜๋Š” hash value๊ฐ€ ์žˆ์–ด์•ผ ํ•˜๊ณ , ์กด์žฌํ•˜๋Š” ๋งŽ์€ entry๋“ค์€ ๋งž๋Š” hash value์— ๋‹ค์‹œ ๋งคํ•‘๋˜๊ณ , ์ ํ•ฉํ•œ ์„œ๋ฒ„์— migrate ๋˜์–ด์•ผ ํ•œ๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ rebalancingํ•˜๋Š” ๊ฒƒ์„ ์‹œ์ž‘ํ•œ๋‹ค๋ฉด ์ƒˆ๋กœ์šด hash ํ•จ์ˆ˜ ๋ฟ ์•„๋‹ˆ๋ผ ์˜ˆ์ „ hsah ํ•จ์ˆ˜๋„ ์œ ํšจํ•˜์ง€ ์•Š๊ฒŒ ๋œ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ migration์„ ํ•˜๋Š” ๋™์•ˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ์“ฐ์ง€ ๋ชปํ•˜๊ณ , ์‰ด ์ˆ˜๋ฐ–์— ์—†๋‹ค.

์žฅ์ 

์ด ์ „๋žต์˜ ๊ฐ€์žฅ ํฐ ์žฅ์ ์€ hotspots๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๊ณจ๊ณ ๋ฃจ ๋ถ„๋ฐฐํ•  ์ˆ˜ ์žˆ๊ณ , ์•Œ๊ณ ๋ฆฌ์ฆ˜์ ์œผ๋กœ ๋ถ„๋ฐฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— range๋‚˜ directory์™€ ๋‹ค๋ฅด๊ฒŒ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ์–ด๋””์— ์œ„์น˜ํ•˜๋Š”์ง€ ๋งํ•ด์ฃผ๋Š” map์„ ๊ฐ€์งˆ ํ•„์š”๊ฐ€ ์—†๋‹ค.

Range Based Sharding

์ฃผ์–ด์ง„ value์˜ ๋ฒ”์œ„๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ชผ๊ฐ ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์–ด๋–ค ๋ธŒ๋žœ๋“œ์˜ ์นดํƒˆ๋กœ๊ทธ์— ๋ชจ๋“  ์ƒํ’ˆ์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ๋“ค์–ด์žˆ๋‹ค๊ณ  ํ•˜์ž. ์ด ๋ฐฉ์‹์„ ์ ์šฉํ•˜๋ฉด, ๋ช‡๋ช‡ ๊ฐœ์˜ shard๋ฅผ ๋งŒ๋“ค๊ณ  ๊ฐ€๊ฒฉ ๋ฒ”์œ„์— ๋”ฐ๋ผ์„œ ์ƒํ’ˆ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ฒŒ ๋  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

์žฅ์ 

๊ฐ€์žฅ ํฐ ์žฅ์ ์€ ์‹คํ–‰์ด ๋น„๊ต์  ๊ฐ„๋‹จํ•˜๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๋ชจ๋“  shard๋“ค์€ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ , original ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฟ ์•„๋‹ˆ๋ผ ์„œ๋กœ๊ฐ€ ๋˜‘๊ฐ™์€ ์Šคํ‚ค๋งˆ๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค. application code๋Š” ๊ทธ์ € ๋ฐ์ดํ„ฐ๊ฐ€ ์–ด๋–ค ๋ฒ”์œ„์ธ์ง€ ์ฝ๊ณ  ๊ทธ์— ์ƒ์‘ํ•˜๋Š” shard์— ์“ฐ๋ฉด ๋œ๋‹ค.

๋‹จ์ 

๋ฐ˜๋ฉด, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๊ณจ๊ณ ๋ฃจ ๋ถ„๋ฐฐํ•˜์ง€๋Š” ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์•ž์„œ ๋งํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค hotspots๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค. ์œ„ ๊ทธ๋ฆผ ์ƒ์œผ๋กœ๋Š” ๋ชจ๋“  shard๋“ค์ด ๊ฐ™์€ ์–‘์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ, ํŠน์ • ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ์— ๋น„ํ•ด ๋” ๋งŽ์ด ์ฐพ์•„์งˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฝ๋Š” ํšŸ์ˆ˜๊ฐ€ ๋ถˆ๊ท ํ˜•ํ•  ์ˆ˜ ์žˆ๋‹ค.

Directory Based Sharding

์ด sharding์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฐ˜๋“œ์‹œ ์–ด๋–ค shard๊ฐ€ ์–ด๋–ค ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ–๊ณ  ์žˆ๋Š”์ง€๋ฅผ ์ถ”์ ํ•  ์ˆ˜ ์žˆ๋Š” shard key๋ฅผ ์‚ฌ์šฉํ•˜๋Š” lookup table์„ ๋งŒ๋“ค๊ณ  ์œ ์ง€ํ•ด์•ผ ํ•œ๋‹ค.

lookup table

๊ฐ„๋‹จํžˆ ๋งํ•˜๋ฉด ํŠน์ • ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š”(where specific data can be found) ์ •์ ์ธ ์ •๋ณด๋ฅผ ๊ฐ–๊ณ  ์žˆ๋Š” ํ…Œ์ด๋ธ”์ด๋‹ค.

Delivery Zone ์—ด์€ shard key๋กœ ์ •์˜๋œ๋‹ค. shard key๋กœ๋ถ€ํ„ฐ ์˜จ ๋ฐ์ดํ„ฐ๋Š” ๊ฐ๊ฐ์˜ ํ–‰์ด ์–ด๋–ค shard์— ์“ฐ์—ฌ์ ธ์•ผ ํ•˜๋Š”์ง€๋ฅผ lookup ํ…Œ์ด๋ธ”๊ณผ ํ•จ๊ป˜ ์“ฐ์—ฌ์ง„๋‹ค. range based sharding๊ณผ ๋น„์Šทํ•ด ๋ณด์ด์ง€๋งŒ, ๋ฒ”์œ„๋ฅผ ๊ธฐ์ค€์œผ๋กœ shard key์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚ด๋ ค์ฃผ๋Š” ๊ฒƒ๊ณผ ๋‹ค๋ฅด๊ฒŒ ๊ฐ ํ‚ค๋“ค์€ ๊ฐ์ž ์ž์‹ ๋งŒ์˜ ํŠน๋ณ„ํ•œ shard์— ๋“ค์–ด๊ฐ€๊ฒŒ ๋œ๋‹ค.

์–ด๋–ค ์ƒํ™ฉ์—์„œ ์“ธ์ง€

ํ•ด๋‹น ๋ฐฉ๋ฒ•์€ shard key๊ฐ€ ๋‚ฎ์€ cardinality๋ฅผ ๊ฐ€์งˆ ๋•Œ ์ข‹์€ ์„ ํƒ์ด๋‹ค. hash ํ•จ์ˆ˜๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— key based sharding๊ณผ๋„ ๋‹ค๋ฅด๋‹ค. ๊ทธ์ € lookup table์—์„œ key๋ฅผ ๋ณด๊ณ  ์–ด๋””์— ๋ฐ์ดํ„ฐ๋ฅผ ์“ธ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ ๋ฟ์ด๋‹ค.

์žฅ์ 

์œ ์—ฐ์„ฑ(flexibility)์ด๋‹ค. range based sharding์€ ๋ฒ”์œ„์— ๊ตญํ•œ๋˜๊ณ , key based sharding์€ ๋งŒ๋“ค๊ณ  ๋‚œ ๋’ค ๋ฐ”๊พธ๊ธฐ ๋งค์šฐ ์–ด๋ ค์šด hash ํ•จ์ˆ˜์— ๊ตญํ•œ๋œ๋‹ค. ๋ฐ˜๋ฉด directory based sharding์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ชผ๊ฐœ๊ธฐ ์œ„ํ•œ entry๋“ค์€ ์–ด๋–ค ์‹œ์Šคํ…œ์ด๋‚˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ์ƒ๊ด€ ์—†์ด entry๋ฅผ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค€๋‹ค. ๋™์ ์œผ๋กœ shard๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๋„ ๋น„๊ต์  ์‰ฝ๋‹ค.

๋‹จ์ 

๋ฐ˜๋ฉด ์ฟผ๋ฆฌํ•˜๊ฑฐ๋‚˜ writeํ•˜๊ธฐ ์ „์— lookup table์— ์—ฐ๊ฒฐ์ด ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, application ํผํฌ๋จผ์Šค์— ์•ˆ ์ข‹์€ ์˜ํ–ฅ(detrimental impact)์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ lookup table์€ ์‹คํŒจ ์ง€์ ์ด ๋  ์ˆ˜ ์žˆ๋‹ค. lookup table์ด ์†์ƒ๋˜๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ ์ƒˆ๋กœ ์“ฐ๊ฑฐ๋‚˜ ์กด์žฌํ•˜๋Š” ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

5. Should I Shard?

์—ฌ๋Ÿฌ ๋ณต์žก์„ฑ ๋•Œ๋ฌธ์—, sharding์€ ๋Œ€๊ทœ๋ชจ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค.

์ด๋Ÿฐ ์ƒํ™ฉ์—์„œ ์œ ์šฉํ•˜๋‹ค

  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐ์ดํ„ฐ์˜ ์–‘์ด ๋‹จ์ผ database node์˜ ์Šคํ† ๋ฆฌ์ง€ ํ•œ๊ณ„๋ฅผ ์ดˆ๊ณผํ–ˆ์„ ๋•Œ
  • ์“ฐ๊ธฐ & ์ฝ๊ธฐ ์–‘์ด ๋‹จ์ผ ๋…ธ๋“œ๋‚˜ read replica๊ฐ€ ํ•ธ๋“ค๋งํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜์ค€์„ ๋„˜์–ด์„œ์„œ ๋ฐ˜์‘์ด ๋Š๋ ค์กŒ์„ ๋•Œ
  • ํ•˜๋‚˜์˜ database node ๋˜๋Š” read replica์— ๊ฐ€๋Šฅํ•œ ๋„คํŠธ์›Œํฌ ๋Œ€์—ญํญ์„ ์ดˆ๊ณผํ•ด ๋ฐ˜์‘ ์†๋„๊ฐ€ ๋Š๋ ค์กŒ์„ ๋•Œ

๋‹ค๋ฅธ ์˜ต์…˜์€ ์—†์„๊นŒ?

sharding์„ ํ•˜๊ธฐ ์ „, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๋‹ค๋ฅธ ์˜ต์…˜๋“ค์„ ๊ฒ€ํ† ํ•ด์•ผ ํ•œ๋‹ค. ์˜ต์…˜ ๋“ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

setting up a remote database

monolithic ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๋“ค์ด ๊ฐ™์€ ์„œ๋ฒ„์— ์žˆ๋Š”)์„ ์ž‘์—…ํ•œ๋‹ค๋ฉด, ์ž์‹ ๋งŒ์˜ ๋จธ์‹ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์˜ฎ๊ฒจ ํผํฌ๋จผ์Šค๋ฅผ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”์„ ๊ฑด๋“ค์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— sharding๋งŒํผ ๋ณต์žกํ•˜์ง€ ์•Š์ง€๋งŒ, ๋‚˜๋จธ์ง€ ์ธํ”„๋ผ์™€๋Š” ๋ณ„๊ฐœ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ˆ˜์ง ํ™•์žฅํ•˜๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•œ๋‹ค.

Implementing caching

์ฝ๊ธฐ ํผํฌ๋จผ์Šค๊ฐ€ ๋ฌธ์ œ๋ผ๋ฉด, ์บ์‹ฑ๋„ ์ข‹์€ ๋ฐฉ๋ฒ•์ด๋‹ค. ์ด๋ฏธ ์š”์ฒญ๋œ ๋ฐ์ดํ„ฐ๋“ค์„ ์ผ์‹œ์ ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•˜๊ณ , ๋‚˜์ค‘์— ์ ‘๊ทผํ•  ๋•Œ ํ›จ์”ฌ ๋น ๋ฅด๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.

Creating one or more read replicas

์ฝ๊ธฐ ํผํฌ๋จผ์Šค๋ฅผ ๋†’์—ฌ์ค„ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์€ primary server์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์นดํ”ผํ•ด ํ•œ ๊ฐœ ์ด์ƒ์˜ secondary server๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ƒˆ๋กœ ์“ฐ์ธ ๊ฒƒ๋“ค์€ secondary๋กœ ์นดํ”ผ๋˜๊ธฐ ์ „์— primary๋กœ ๊ฐ€๊ณ , ์ฝ๊ธฐ๋Š” secondary์—์„œ๋งŒ ๋ฐœ์ƒํ•œ๋‹ค.
์ฝ๊ธฐ์™€ ์“ฐ๊ธฐ๋ฅผ ๋‚˜๋ˆ„๋Š” ๊ฒƒ์€ ํ•œ ๊ฐœ์˜ ๋จธ์‹ ์—์„œ ๋„ˆ๋ฌด ๋งŽ์ด ๋กœ๋“œํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ด์ฃผ๊ณ , ๋Š๋ ค์ง€๊ฑฐ๋‚˜ ์ถฉ๋Œ์ด ์ƒ๊ธฐ๋Š” ๊ฒƒ์„ ๋ง‰์•„์ค€๋‹ค. computing resource, ์ฆ‰ ๋ˆ์ด ๋” ๋งŽ์ด ๋“ค๊ธฐ ๋•Œ๋ฌธ์— ๋ˆ„๊ตฐ๊ฐ€์—๊ฒŒ๋Š” ์ œ์•ฝ์ด ๋  ์ˆ˜ ์žˆ๊ธด ํ•˜๋‹ค.

Upgrading to a larger server

๋Œ€๋ถ€๋ถ„์˜ ์ƒํ™ฉ์—์„œ ๋” ๋งŽ์€ ์ž์›์„ ๊ฐ€์ง„ ๋จธ์‹ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ scaling up ํ•˜๋Š” ๊ฒƒ์€ sharding์— ๋น„ํ•ด ๊ณต์ˆ˜๊ฐ€ ์ ๊ฒŒ ๋“ ๋‹ค. replica๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ด ์„œ๋ฒ„๋ฅผ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๋Š” ๊ฒƒ์€ ๋น„์šฉ์ด ๋” ๋“ ๋‹ค. ๋”ฐ๋ผ์„œ ์—…๊ทธ๋ ˆ์ด๋“œ๊ฐ€ ๋ฒ ์ŠคํŠธ ์˜ต์…˜์ด๋ผ๋ฉด ๋ฆฌ์‚ฌ์ด์ง•์„ ๊ฑฐ์ณ์•ผํ•  ๊ฒƒ์ด๋‹ค.

6. ๊ฒฐ๋ก 

sharding์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ˆ˜ํ‰ ํ™•์žฅ์„ ๊ณ ๋ คํ•  ๋•Œ ์ข‹์€ ํ•ด๊ฒฐ์ฑ…์ด ๋  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ณต์žก์„ฑ๊ณผ ์ž ์žฌ์  ์‹คํŒจ ์ง€์ ์„ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ๋‹ค. ์–ด๋–ค ์ด์—๊ฒŒ๋Š” ํ•„์š”ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ๋‹ค๋ฅธ ๊ฒฝ์šฐ sharding์ด ์ฃผ๋Š” ์ด์ ๋ณด๋‹ค sharded architecture๋ฅผ ๋งŒ๋“ค๊ณ  ์œ ์ง€ํ•˜๋Š”๋ฐ ๋“œ๋Š” ์‹œ๊ฐ„๊ณผ ๋น„์šฉ์ด ์••๋„์ ์ผ ์ˆ˜๋„ ์žˆ๋‹ค.

์•ž์œผ๋กœ ๋‚˜์•„๊ฐ€๊ธฐ ์œ„ํ•ด, ์ •๋ณด๋ฅผ ์ตœ๋Œ€ํ•œ ์ฐพ์•„๋ณด๊ณ  application์— ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ์ด๋‹ค.

profile
์ด์‚ฌ๊ฐ„ ๋ธ”๋กœ๊ทธ: yenilee.github.io
post-custom-banner

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

comment-user-thumbnail
2022๋…„ 3์›” 23์ผ

์ž˜ ๋ณด๊ณ  ๊ฐ‘๋‹ˆ๋‹ค.

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ