๊ด€๋ฆฌ ๋ฉ”๋‰ด

DOing

ํŒ”๋กœ์ž‰ ๊ธฐ๋ฐ˜ ํ”ผ๋“œ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„ํ•˜๊ธฐ ๋ณธ๋ฌธ

๋””๋ฒ„๊น…์ค‘ ๐ŸŒ 

ํŒ”๋กœ์ž‰ ๊ธฐ๋ฐ˜ ํ”ผ๋“œ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„ํ•˜๊ธฐ

mangdo 2022. 10. 30. 18:16

   100๋งŒ ๊ตฌ๋…์ž, 100k ํŒ”๋กœ์›Œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ธํ”Œ๋ฃจ์–ธ์„œ, ์—ฐ์˜ˆ์ธ๋„ ์•„๋‹ˆ์ง€๋งŒ ์ˆ˜๋งŽ์€ ๊ตฌ๋…์ž๋ฅผ ๊ฐ€์ง€๊ณ ์žˆ๋Š” ์ผ๋ฐ˜์ธ๋“ค์„ ์š”์ฆ˜์—๋Š” ํ”ํ•˜๊ฒŒ ์ฐพ์•„๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋Ÿฐ ๊ณ„์ •์„ ํŒ”๋กœ์›Œํ•˜๋ฉด, ๋‹น์—ฐํžˆ ๋‚ด ํ”ผ๋“œ์— ๋– ์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. ๋‹น์—ฐํ•˜๋‹ค. ํ•˜์ง€๋งŒ ๋‚ด๊ฐ€ ์ง์ ‘ ๊ตฌํ˜„ํ•˜๋ ค๊ณ  ํ•˜๋‹ˆ ๋ญ ํ•˜๋‚˜ ๋‹น์—ฐํ•œ๊ฒŒ ์—†์—ˆ๋‹ค. 

  ์‚ฌ๋‚ด์—์„œ "ํŒ”๋กœ์ž‰ - ํŒ”๋กœ์ž‰ ๊ธฐ๋ฐ˜ ํ”ผ๋“œ"ํ”„๋กœ์ ํŠธ์— ๋ฐฑ์—”๋“œ ์—”์ง€๋‹ˆ์–ด๋กœ์จ ์ฐธ์—ฌํ–ˆ์—ˆ๋‹ค. DB ์„ค๊ณ„, API ์„ค๊ณ„, ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ, ๋ฐฐํฌ์ดํ›„ ๋ชจ๋‹ˆํ„ฐ๋ง ์ „๋ฐ˜์ ์ธ ์ž‘์—…๋“ค์„ ๋‹ด๋‹นํ–ˆ์—ˆ๋‹ค. ์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” ํŒ”๋กœ์ž‰์˜ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„๋‹จ๊ณ„์—์„œ ๊ณ ๋ฏผํ–ˆ์—ˆ๋˜ ์ง€์ ๋“ค์— ๋Œ€ํ•ด์„œ ์ด์•ผ๊ธฐํ•ด๋ณด๋ ค๊ณ ํ•œ๋‹ค.

์‹ค์ œ LINER ํ™”๋ฉด


[ IN ์—ฐ์‚ฐ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ ]

   ํŒ”๋กœ์ž‰ ๊ธฐ๋ฐ˜ ์•„ํ‚คํ…์ฒ˜ ๊ตฌ์กฐ๋ฅผ ์ƒ๊ฐํ• ๋•Œ ์ œ์ผ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ƒ๊ฐํ•ด๋‚ผ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ผ ๊ฒƒ์ด๋‹ค. ๋‚ด๊ฐ€ ๋”ฐ๋ฅด๊ณ  ์žˆ๋Š” ์นœ๊ตฌ๋“ค์˜ ๊ฒŒ์‹œ๊ธ€์„ ์กฐํšŒํ•˜๊ธฐ ์œ„ํ•ด์„œ, ๋‚ด๊ฐ€ ๋”ฐ๋ฅด๋Š” ์‚ฌ๋žŒ๋“ค์„ ๋ชจ๋‘ IN์— ๋„ฃ์–ด ์ด๋“ค์˜ ๊ฒŒ์‹œ๊ธ€์„ ์กฐํšŒํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ํ•˜์ง€๋งŒ ๋ฌธ์ œ์ ์ด ์žˆ๋‹ค. ํŒ”๋กœ์ž‰์˜ ์ˆซ์ž๊ฐ€ ๋Š˜์–ด๋‚˜๊ฒŒ ๋˜๋ฉด ์ธ๋ฑ์Šค๋ฅผ ์ œ๋Œ€๋กœ ํƒ€์ง€ ๋ชปํ•œ๋‹ค๋Š” ๋ฌธ์ œ๋‹ค. 
  ์ธ์Šคํƒ€๊ทธ๋žจ์—์„œ๋Š” 7,500๊ฐœ์˜ ํŒ”๋กœ์šฐ ์ œํ•œ์ด ์žˆ์œผ๋ฉฐ(์ž์‹ ์ด ํŒ”๋กœ์šฐ ํ•˜๋Š”๊ฒƒ์— ๋Œ€ํ•˜์—ฌ๋งŒ, ๋‚จ์ด ๋‚˜๋ฅผ ํŒ”๋กœ์ž‰ํ•˜๋Š” ๊ฒƒ์—๋Š” ์ˆ˜ ์ œํ•œ์ด ์—†์Œ), ํŠธ์œ„ํ„ฐ์™€ ํŽ˜์ด์Šค๋ถ์—์„œ๋Š” 5,000๊ฐœ์˜ ํŒ”๋กœ์šฐ ์ œํ•œ์ด ์žˆ๋‹ค.[1][2][3] ์ด์— ๊ธฐ๋ฐ˜ํ•˜์—ฌ ์„œ๋น„์Šค์— 1000๋ช…์ •๋„์˜ ํŒ”๋กœ์šฐ ์ œํ•œ์„ ๊ฑธ์–ด๋‘”๋‹ค๊ณ  ์ƒ๊ฐ์„ ํ–ˆ๊ณ ,  1000๋ช…์˜ ํŒ”๋กœ์šฐ๋ฅผ ํ•œ ์œ ์ €๊ฐ€ ์žˆ์„๋•Œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฟผ๋ฆฌ๊ฐ€ ๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋‹ค. 'select * from (๊ฒŒ์‹œ๊ธ€ ํ…Œ์ด๋ธ”๋ช…) where user_id in (1,2,3,4,5...1000)' ํ•˜์ง€๋งŒ ์ด๋Ÿฐ์‹์œผ๋กœ in์ ˆ์— ๊ฐ’์ด ๋„ˆ๋ฌด ๋งŽ์ด ๋“ค์–ด๊ฐ€๊ฒŒ๋˜๋ฉด ์ธ๋ฑ์Šค๋ฅผ ์ œ๋Œ€๋กœ ํƒ€์ง€ ๋ชปํ•˜๊ฒŒ๋˜๋ฉด์„œ ์„ฑ๋Šฅ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค. 


 * eq_range_index_dive_limit

   : IN ์ ˆ๋‚ด์— ๊ฐ’์˜ ํฌ๊ธฐ๊ฐ€ eq_range_index_dive_limit๊ฐ’(default 200)์„ ์ดˆ๊ณผํ•  ๊ฒฝ์šฐ ์‹คํ–‰๊ณ„ํš์„ ์„ธ์šธ ๋•Œ, index dive ๋ฐฉ์‹์ด ์•„๋‹Œ index statistics ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋„๋ก ํ•œ๋‹ค. index dive๋ž€, ์‹คํ–‰๊ณ„ํš์„ ์„ธ์šธ๋•Œ index range scan์„ ์œ„ํ•œ ์ตœ์ ํ™”์‹œ row๋ฅผ ์˜ˆ์ธกํ•˜๊ธฐ์œ„ํ•ด ์ง์ ‘ index๋ฅผ ์ด์šฉํ•ด์„œ row์ˆ˜๋ฅผ ์˜ˆ์ธกํ•˜๋„๋ก ํ•˜๋Š” ๋ฐฉ์‹์ด๋ฉฐ[4],  index statistics๋ฐฉ์‹์€ MySQL 5.6๋ถ€ํ„ฐ ์ ์šฉ๋œ ๋ฐฉ์‹์œผ๋กœ, index dive๊ฐ€ ์•„๋‹Œ ์ธ๋ฑ์Šค ํ†ต๊ณ„์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์‹คํ–‰๊ณ„ํš์„ ์„ธ์šฐ๋„๋ก ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ํ†ต๊ณ„์ •๋ณด๊ฐ€ ์ •ํ™•ํ• ๋•Œ๋„ ์žˆ์ง€๋งŒ, 100% ์‹ ๋ขฐํ•  ์ˆ˜๋Š”์—†๊ธฐ ๋•Œ๋ฌธ์— ์ƒ๊ฐ์ง€ ๋ชปํ•œ ์„ฑ๋Šฅ์ €ํ•˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.[5] [6]


*  range_optimizer_max_mem_size

   : ์ˆ˜ํ–‰ํ•˜๋Š” ์ฟผ๋ฆฌ์˜ ์šฉ๋Ÿ‰์ด range_optimizer_max_mem_size ๊ฐ’์„ ์ดˆ๊ณผํ•˜๊ฒŒ๋˜๋ฉด ์˜ตํ‹ฐ๋งˆ์ด์ ธ๊ฐ€ ํ’€์Šค์บ” ํ˜น์€ ์ด์™ธ์˜ ์ธ๋ฑ์Šค๋ฅผ ํƒœ์šฐ๋„๋ก ํ•œ๋‹ค. [7]


* MATERIALIZED select type
   : ์‹ค์ œ๋กœ ์˜ˆ์ƒ์ฟผ๋ฆฌ์ธ select * from (๊ฒŒ์‹œ๊ธ€ ํ…Œ์ด๋ธ”๋ช…) where user_id in (1,2,3,4,5...1000) order by id desc limit 20 ์˜ ์‹คํ–‰๊ณ„ํš์„ ๋Œ๋ ค๋ณด์•˜์„๋•Œ MATERIALIZED ๋ผ๋Š” select type์ด ๋ฐœ์ƒํ–ˆ์—ˆ๋‹ค. 

  : MATERIALIZED์€ MySQL 5.6 ๋ฒ„์ „์— ์ถ”๊ฐ€๋œ ์…€๋ ‰ํŠธ ํƒ€์ž…์œผ๋กœ, IN ์ ˆ ๋‚ด์˜ ์„œ๋ธŒ์ฟผ๋ฆฌ๋ฅผ ์ž„์‹œํ…Œ์ด๋ธ”๋กœ ๋งŒ๋“ค์–ด ์กฐ์ธ์„ ํ•˜๋Š” ํ˜•ํƒœ๋กœ ์ตœ์ ํ™”๋ฅผ ํ•ด์ค€๋‹ค. ์ฐธ๊ณ ๋กœ 5.6 ๋ฒ„์ „์—์„œ๋Š” IN์ ˆ๋‚ด์— ์„œ๋ธŒ์ฟผ๋ฆฌ๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ ๋งค ๋ ˆ์ฝ”๋“œ ๋งˆ๋‹ค ์„œ๋ธŒ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰์‹œํ‚ค๋Š” ํ˜•ํƒœ๋กœ ์ˆ˜ํ–‰๋˜์—ˆ๋‹ค๊ณ  ํ•œ๋‹ค.




[ ๋‹ค๋ฅธ ์†Œ์…œ ๋„คํŠธ์›Œํฌ ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜ ]

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

  ํฌ์ŠคํŒ… ์ „์†ก, ์ฆ‰ ํŒฌ์•„์›ƒ(fanout)์€ ์–ด๋–ค ์‚ฌ์šฉ์ž์˜ ์ƒˆ ํฌ์ŠคํŒ…์„ ๊ทธ ์‚ฌ์šฉ์ž์™€ ์นœ๊ตฌ ๊ด€๊ณ„์— ์žˆ๋Š” ๋ชจ๋“  ์‚ฌ์šฉ์ž์—๊ฒŒ ์ „๋‹ฌํ•˜๋Š” ๊ณผ์ •์ด๋‹ค. ๋„๋ฆฌ ์•Œ๋ ค์ง„ ์†Œ์…œํ˜• ๋„คํŠธ์›Œํฌ ์„œ๋น„์Šค๋“ค์˜ ํŒฌ์•„์›ƒ ๊ธฐ๋Šฅ์—๋Š” ํฌ๊ฒŒ ๋‘๊ฐ€์ง€๋ชจ๋ธ์ด ์žˆ๋‹ค. ํ•˜๋‚˜๋Š” ์“ฐ๊ธฐ ์‹œ์ ์— ํŒฌ์•„์›ƒํ•˜๋Š” ๋ชจ๋ธ(fanout-on-write, ๋˜๋Š” push ๋ชจ๋ธ)์ด๊ณ , ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ์ฝ๊ธฐ ์‹œ์ ์— ํŒฌ์•„์›ƒ ํ•˜๋Š” ๋ชจ๋ธ(fanout-on-read, ๋˜๋Š” pull ๋ชจ๋ธ)์ด๋‹ค. fanout-on-write๋ชจ๋ธ์˜ ๋Œ€ํ‘œ ์„œ๋น„์Šค๋Š” ํŠธ์œ„ํ„ฐ๊ฐ€ ์žˆ๊ณ , fanout-on-read ๋ชจ๋ธ์˜ ๋Œ€ํ‘œ ์„œ๋น„์Šค๋กœ๋Š” ํŽ˜์ด์Šค๋ถ์ด ์žˆ๋‹ค. ๊ฐ๊ฐ์˜ ๋ชจ๋ธ๋“ค์— ๋Œ€ํ•ด์„œ ๊ฐ„๋žตํ•˜๊ฒŒ ์‚ดํŽด๋ณด๊ณ , ํŠธ์œ„ํ„ฐ์™€ ํŽ˜์ด์Šค๋ถ์ด ์™œ ๊ทธ ๋ชจ๋ธ๋“ค์„ ์„ ์ •ํ•˜์˜€์œผ๋ฉฐ, ์„ ํƒํ•œ ๋ชจ๋ธ๋“ค์˜ ํ•œ๊ณ„์ ์„ ๋„˜๊ธฐ๊ธฐ์œ„ํ•˜์—ฌ ์–ด๋–ค ๋…ธ๋ ฅ๋“ค์„ ํ–ˆ๋Š”์ง€ ์•Œ์•„๋ณด๊ฒ ๋‹ค.

 

* Push ๋ชจ๋ธ
   : ์ƒˆ๋กœ์šด ํฌ์ŠคํŒ…์„ ๊ธฐ๋กํ•˜๋Š” ์‹œ์ ์— ๋‰ด์Šคํ”ผ๋“œ๋ฅผ ๊ฐฑ์‹ ํ•˜๊ฒŒ ๋œ๋‹ค. ๋‹ค์‹œ ๋งํ•ด, ํฌ์ŠคํŒ…์ด ์™„๋ฃŒ๋˜๋ฉด ๋ฐ”๋กœ ํ•ด๋‹น ์‚ฌ์šฉ์ž์˜ ์บ์‹œ์— ํ•ด๋‹น ํฌ์ŠคํŒ…์„ ๊ธฐ๋กํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

  : ์ƒˆ ํฌ์ŠคํŒ…์ด ๊ธฐ๋ก๋˜๋Š” ์ˆœ๊ฐ„์— ๋‰ด์Šค ํ”ผ๋“œ๊ฐ€ ๊ฐฑ์‹ ๋จ์œผ๋กœ(on-demand๊ฐ€ ์•„๋‹Œ pre-computed), ๋‰ด์Šคํ”ผ๋“œ๋ฅผ ์ฝ๋Š”๋ฐ ๋“œ๋Š” ์‹œ๊ฐ„์ด ์งง์•„์ง„๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์„œ๋น„์Šค๋ฅผ ์ž˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋น„ํ™œ์„ฑํ™” ์œ ์ €์˜ ๋‰ด์Šค ํ”ผ๋“œ๋„ ๊ฐฑ์‹ ํ•ด์•ผํ•˜๋ฏ€๋กœ ์ปดํ“จํŒ… ์ž์›์ด ๋‚ญ๋น„๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ฌธ์ œ์ ์ด ์žˆ๋‹ค. ๋˜ํ•œ ํŒ”๋กœ์›Œ๊ฐ€ ๋งŽ์€ ์‚ฌ์šฉ์ž์˜ ๊ฒฝ์šฐ, ์นœ๊ตฌ ๋ชฉ๋ก์„ ๊ฐ€์ ธ๊ณ ์˜ค๊ณ  ๊ทธ ๋ชฉ๋ก์— ์žˆ๋Š” ์‚ฌ์šฉ์ž ๋ชจ๋‘์˜ ๋‰ด์Šคํ”ผ๋“œ๋ฅผ ๊ฐœ์‹ ํ•˜๋Š” ๋ฐ ๋งŽ์€ ์‹œ๊ฐ„์ด ์†Œ์š”๋  ์ˆ˜ ์žˆ๋‹ค. ํ”ํžˆ hot-key, hot-spot ๋ฌธ์ œ, ์œ ๋ช…์ธ ๋ฌธ์ œ, ์ €์Šคํ‹ด ๋น„๋ฒ„ ๋ฌธ์ œ๋“ฑ๋“ฑ...์ด๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๋ฌธ์ œ์ด๋‹ค.

 

 

* Pull ๋ชจ๋ธ
   : ํ”ผ๋“œ๋ฅผ ์ฝ์–ด์•ผํ•˜๋Š” ์‹œ์ ์— ๋‰ด์Šค ํ”ผ๋“œ๋ฅผ ๊ฐฑ์‹ ํ•˜๋Š” ์š”์ฒญ ๊ธฐ๋ฐ˜(on-demand)๋ชจ๋ธ์ด๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ๋ณธ์ธ์˜ ํ”ผ๋“œ๋ฅผ ๋กœ๋”ฉํ•˜๋Š” ์‹œ์ ์— ์ƒˆ๋กœ์šด ํฌ์ŠคํŠธ๋ฅผ ๊ฐ€์ ธ์˜ค๊ฒŒ ๋œ๋‹ค. 

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

 

[ ํŽ˜์ด์Šค๋ถ : Pull ๋ชจ๋ธ ]

  ํŽ˜์ด์Šค๋ถ์€ ์†Œ์…œ ๊ทธ๋ž˜ํ”„๋ฅผ push ๋ณด๋‹ค๋Š” ์ตœ๋Œ€ํ•œ pull ํ•˜๋Š” ๋ฐฉ์‹์„ ์„ ํƒํ•ด์™”๋‹ค. ์ด๋Ÿฌํ•œ ๊ตฌํ˜„ ์ „๋žต์€ DB์— ๋งŽ์€ ์ฝ๊ธฐ๋ฅผ ์š”๊ตฌํ•˜๊ฒŒ๋œ๋‹ค. ์ด๋•Œ๋ฌธ์— ํŽ˜์ด์Šค๋ถ์€ ์ฃผ์ปค๋ฒ„๊ทธ๊ฐ€ ์ดˆ๊ธฐ ํŽ˜์ด์Šค๋ถ์„ ๋งŒ๋“ค๋˜ 2005๋…„ ๋ถ€ํ„ฐ memcache๋ฅผ ์‚ฌ์šฉํ•ด์™”๋‹ค. ํ•˜์ง€๋งŒ, ํŽ˜์ด์Šค๋ถ ํ”ผ๋“œ์˜ ์š”๊ตฌ์‚ฌํ•ญ์ด ๋ณต์žกํ•ด์ง์— ๋”ฐ๋ผ์„œ TAO(The Associations and Objects)๋ฅผ ๋„์ž…ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. TAO๋Š” ๊ทธ๋ž˜ํ”„ ์ž๋ฃŒ๊ตฌ์กฐ์˜ write-through ๋ถ„์‚ฐ์บ์‹œ๋‹ค. TAO์˜ ํ‚ค์›Œ๋“œ๋ฅผ ํ•˜๋‚˜์”ฉ ์ด์•ผ๊ธฐํ•ด๋ณด๋ฉด์„œ ์ข€ ๋” ์‚ดํŽด๋ณด๊ฒ ๋‹ค.

 

- ๊ทธ๋ž˜ํ”„ ์ž๋ฃŒ๊ตฌ์กฐ

https://www.usenix.org/system/files/conference/atc13/atc13-bronson.pdf

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

  “์•จ๋ฆฌ์Šค๊ฐ€ Golden Gate Bridge์— ๊ฐ€์„œ ์นœ๊ตฌ์ธ bob์„ ํƒœ๊ทธํ–ˆ๋‹ค, Golden Gate Bridge์— ๊ฐ„ ๊ธ€์„ bob์˜ ์นœ๊ตฌ์ธ Cathy๊ฐ€ ๋Œ“๊ธ€์„ ๋‚จ๊ฒผ๊ณ , ๊ทธ ๋Œ“๊ธ€์— Cathy์˜ ์นœ๊ตฌ์ธ David๊ฐ€ ์ข‹์•„์š”๋ฅผ ๋ˆŒ๋ €๋‹ค.” ์œ„ ๊ทธ๋ฆผ์ด ํ‘œํ˜„ํ•˜๋Š” ๋ฌธ์žฅ์ด๋‹ค. ์ด ๋ฌธ์žฅ์„ ๋งŒ์•ฝ์— ๋‚ด๊ฐ€ ๊ฐ€์žฅ ์ฒ˜์Œ์— ๋งํ–ˆ์—ˆ๋˜ OR ์„ ์‚ฌ์šฉํ–ˆ์—ˆ๋‹ค๋ฉด, ํ”ผ๋“œ๋ฅผ ๊ตฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ˆ˜๋งŽ์€ ํ…Œ์ด๋ธ”๊ณผ ์บ์‹œ๋“ค์„ ํ—ค์ง‘๊ณ  ๋‹ค๋…”์–ด์•ผํ•  ๊ฒƒ์ด๋‹ค. “์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ์ตœ์†Œํ•œ์˜ ๊ตฌ์กฐ๋กœ ์ตœ๋Œ€ํ•œ์˜ ํ‘œํ˜„๋ ฅ์„ ๊ฐ€์ง€๋ฉฐ ํ”ผ๋“œ ์ •๋ณด๋ฅผ ๋น ๋ฅด๊ฒŒ ์ฝ์„ ์ˆ˜ ์žˆ์„๊นŒ?”์— ๋Œ€ํ•œ ๊ณ ๋ฏผ์˜ ๋‹ต์œผ๋กœ ํŽ˜์ด์Šค๋ถ์€ ๊ทธ๋ž˜ํ”„ ์ž๋ฃŒ ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜์˜€๋‹ค.

 

- ์„ฑ๊ฒฉ์ด ๋‹ค๋ฅธ ๋‘๊ฐœ์˜ DB(Memcache, MySQL) ์œ ์ง€์— ๋Œ€ํ•œ ์–ด๋ ค์›€

TAO ์ด์ „์—๋Š” ํŽ˜์ด์Šค๋ถ์˜ ์›น์„œ๋ฒ„๊ฐ€ MySQL์— ์ง์ ‘ ์ ‘๊ทผํ•˜์—ฌ ์†Œ์…œ ๊ทธ๋ž˜ํ”„๋ฅผ ์ฝ๊ฑฐ๋‚˜ ์ž‘์„ฑํ–ˆ์œผ๋ฉฐ, memcahe๋ฅผ lookaside ์บ์‹œ๋กœ ์‚ฌ์šฉํ–ˆ๋‹ค. memcache๋Š” ํ‚ค-๊ฐ’ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ์ด ์žˆ๋Š” ๋ฒ”์šฉ ๋„คํŠธ์›Œํฌ ์ธ๋ฉ”๋ชจ๋ฆฌ ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ๋‹ค. ์บ์‹œ ๋ˆ„๋ฝ์‹œ, ์ž๋™์œผ๋กœ ์ฑ„์šฐ๊ฑฐ๋‚˜ ์บ์‹œ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•ด์ฃผ์ง€๋Š” ์•Š์•˜๋‹ค. ๋•Œ๋ฌธ์— ์—”์ง€๋‹ˆ์–ด๋“ค์€ MySQL๊ณผ memcache ๋ผ๋Š” ๋‘๊ฐœ์˜ ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ์—, ์„œ๋กœ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ๋กœ ์ž‘์—…์„ ํ–ˆ์–ด์•ผํ–ˆ๋‹ค. Memcahce-MySQL ์กฐํ•ฉ์„ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์‹œ์Šคํ…œ ๋‚ด๋ถ€์— ๋Œ€ํ•œ ์ƒ๋‹นํ•œ ์ง€์‹์ด ํ•„์š”ํ–ˆ๊ณ , ์ด๋กœ ์ธํ•œ ๋ฒ„๊ทธ์™€ ์„ฑ๋Šฅ๋ฌธ์ œ๋กœ ์ด์–ด์ง€๋Š” ์‹ค์ˆ˜๊ฐ€ ์žˆ์—ˆ๋‹ค. ๋˜ํ•œ ์ œํ’ˆ์˜ ์š”๊ตฌ์‚ฌํ•ญ์ด ๋ณ€ํ•จ์— ๋”ฐ๋ผ ํ…Œ์ด๋ธ” ์Šคํ‚ค๋งˆ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด ๊ฐ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ์šด์˜์ž๊ฐ„์˜ ์กฐ์ •์ด ํ•„์š”ํ–ˆ๋‹ค. TAO๋Š” ์ด๋Ÿฌํ•œ ์ž‘์—…๋“ค์„ ์ถ”์ƒํ™”ํ•˜์—ฌ lookaside ์บ์‹œ ์•„ํ‚คํ…์ฒ˜์˜ ๊ทผ๋ณธ์ ์ธ ๋‹จ์ ์„ ํ”ผํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. TAO๋Š” persistence DB๋กœ MySQL์„ ๊ณ„์† ์‚ฌ์šฉํ•˜์ง€๋งŒ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ์ค‘์žฌํ•˜๊ณ  ์ž์ฒด ๊ทธ๋ž˜ํ”„ ์ธ์‹ ์บ์‹œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

์บ์‹œ์˜ ์ตœ์ข… ์ผ๊ด€์„ฑ ์œ ์ง€๋ฅผ ์œ„ํ•œ leader-follower ์บ์‹œ ์•„ํ‚คํ…์ฒ˜๋„ ํฅ๋ฏธ๋กญ๊ฒŒ ์ฝ์—ˆ๋Š”๋ฐ, ์ด๋Š” Meta ๊ธฐ์ˆ ๋ธ”๋กœ๊ทธ[8], ํ˜น์€ ๋…ผ๋ฌธ์˜ 4 Architecture๋กœ ๊ฐ€๋ฉด ๋” ์ž์„ธํ•˜๊ฒŒ ์•Œ ์ˆ˜ ์žˆ๋‹ค.[9]

 

 

[ ํŠธ์œ„ํ„ฐ : Push ๋ชจ๋ธ ]

http://content.time.com/time/specials/packages/article/0,28804,1901188_1901207_1901196,00.html

  ํŽ˜์ด์Šค๋ถ์€ ๊ฒŒ์‹œํŒ ๊ตฌ์กฐ์—์„œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์™”์—ˆ๋‹ค. ๊ฒŒ์‹œํŒ์˜ ํ•„ํ„ฐ ๊ฒ€์ƒ‰์ด๋ผ๋Š” ๊ธฐ๋Šฅ์ฒ˜๋Ÿผ, ํ”ผ๋“œ๋ฅผ ๊ตฌ์„ฑํ•ด๊ฐ”๋‹ค. Pull ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜๊ณ , ๋” ๋น ๋ฅด๊ฒŒ ์กฐํšŒ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋„๋ก ์บ์‹œ๋ฅผ ์ ๊ทน์ ์œผ๋กœ ์‚ฌ์šฉํ–ˆ๋‹ค. ์œ„ ๊ทธ๋ฆผ์—์„œ์˜ ํŠธ์œ„ํ„ฐ ์†Œ๊ฐœ๋ฅผ ๋ณด๋ฉด, friend with communicate, exchange of quick frequent answer ์ด๋ผ๋Š” ๋ฌธ์žฅ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์• ์ดˆ์— ํŠธ์œ„ํ„ฐ๋ผ๋Š” ์„œ๋น„์Šค๋Š” ๋ฉ”์‹œ์ง€ ์ „๋‹ฌ์ด๋ผ๋Š” ๊ด€์ ์—์„œ ์‹œ์ž‘๋œ ์„œ๋น„์Šค๋‹ค. ํŠธ์œ„ํ„ฐ์˜ ํŠธ๋ ˆ์ด๋“œ ๋งˆํฌ๋กœ ์•Œ๋ ค์ง„ 140์ž ์ œํ•œ์€ SMS ๊ธ€์ž์ˆ˜๋กœ ๋ถ€ํ„ฐ ์‹œ์ž‘๋˜์—ˆ๋‹ค. ์ด์ฒ˜๋Ÿผ SMS, ์ด๋ฉ”์ผ ์„œ๋น„์Šค์™€ ํก์‚ฌํ•˜๊ฒŒ ์‹œ์ž‘ํ•œ ํŠธ์œ„ํ„ฐ๋Š” ์•„ํ‚คํ…์ฒ˜์—๋„ ์ด๋Ÿฌํ•œ ํŠน์ง•๋“ค์„ ๋‹ด๊ณ  ์žˆ๋‹ค. ๋‚˜์˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ˆ˜์‹ ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์€ ๋‚˜๋ฅผ ํŒ”๋กœ์šฐํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์ด๋ฉฐ, ๊ฒฐ๊ตญ ๋‚ด๊ฐ€ ๋ฉ”์‹œ์ง€์„ ์˜ฌ๋ฆฐ๋‹ค๋Š” ๊ฒƒ์€ ๋‚˜๋ฅผ ํŒ”๋กœ์šฐํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์˜ ๋ฐ›๋Š” ๋ฉ”์‹œ์ง€ํ•จ์œผ๋กœ ์ˆ˜์‹ ๋˜์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋ฉ”์ผ์˜ ๊ฒฝ์šฐ์—๋Š” ์ „์ฒด ๋ฌธ์ž๋ฅผ ๋ฐฐ๋‹ฌํ•˜์ง€๋งŒ, ํŠธ์œ„ํ„ฐ์˜ ๊ฒฝ์šฐ์—๋Š” ์›๋ณธ๋ฉ”์‹œ์ง€๋Š” ํ•˜๋‚˜๋งŒ ๋‘๊ณ , ํŒ”๋กœ์›Œ๋“ค์˜ ํƒ€์ž„๋ผ์ธ์—๋Š” ์ฐธ์กฐํ‚ค๋งŒ ์ €์žฅ์‹œํ‚ค๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•œ๋‹ค.

  ์“ฐ๊ธฐ ์š”์ฒญ์— ๋น„ํ•ด ์ฝ๊ธฐ ์š”์ฒญ์ด ๋งŽ์€ ์„œ๋น„์Šค๋ผ๋ฉด, ์ฐจ๋ผ๋ฆฌ ์ฝ๊ธฐ์— ๋ถ€๋‹ด์„ ์ฃผ๋Š” ํŽ˜์ด์Šค๋ถ์˜ Pull ๋ชจ๋ธ๋ณด๋‹ค๋Š” ํŠธ์œ„ํ„ฐ์˜ Push ๋ชจ๋ธ์ด ์ข‹์€ ์„ ํƒ์ผ ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด ๋˜ํ•œ ๊ฝค ๋†’์€ ๋น„์šฉ์ด ๋“ค ์ˆ˜ ์žˆ๋‹ค. ๋‚ด๊ฐ€ ํŒ”๋กœ์šฐํ•˜๊ณ  ์žˆ๋Š” ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ํŠธ์œ—์„ ์“ธ ๋•Œ๋งˆ๋‹ค ๋‚ด ํƒ€์ž„๋ผ์ธ์— ํŠธ์œ—์˜ ์ฐธ์กฐ ํ‚ค๊ฐ€ ๋ฐฐ๋‹ฌ๋œ๋‹ค. ์ €์Šคํ‹ด ๋น„๋ฒ„๋ฅผ ์˜ˆ๋กœ ๋“ค์–ด ์ƒ๊ฐํ•ด๋ณด๋ฉด, ์ €์Šคํ‹ด ๋น„๋ฒ„๋Š” ํ˜„์žฌ 1.1์–ต ํŒ”๋กœ์›Œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. 1์–ต๋ช… ์ค‘์—๋Š” ์‚ฌ์‹ค ํŠธ์œ„ํ„ฐ๋ฅผ ๋ฐฉ๋ฌธํ•œ์ง€ ํ•œ๋‹ฌ์ด ๋„˜์€ ์ดํƒˆ์œ ์ €๋“ค๋„ ๋งŽ์ด ํฌํ•จ๋˜์–ด์žˆ์„ ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ ์ด ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ํŠธ์œ—์˜ ์ฐธ์กฐํ‚ค๋ฅผ ์ „์†กํ•ด์•ผ๋งŒ ํ•œ๋‹ค. ๋Œ€๋žต์ ์œผ๋กœ ๊ณ„์‚ฐ์„ ํ•ด๋ณด๋ฉด 8๋ฐ”์ดํŠธ(์ฐธ์กฐ ํ‚ค ํฌ๊ธฐ) x 1์–ต = 800MB๋‚˜ ๋œ๋‹ค. ์ด๋Ÿฐ ์ธํ”Œ๋ฃจ์–ธ์„œ๋“ค์ด ํŠธ์œ—์„ ์ž‘์„ฑํ•˜๋Š” ์ˆœ๊ฐ„์— ์—„์ฒญ๋‚œ ์–‘์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•ด์•ผ ํ•˜๋Š”๋ฐ, DB๋กœ ์ด๋Ÿฐ ํŠธ๋ž˜ํ”ฝ์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐ›์•„๋‚ด๋Š” ๊ฒƒ์€ ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ์ž์˜ ํŠธ์œ— ์ˆ˜์‹ ํ•จ, ์ฆ‰ ํƒ€์ž„๋ผ์ธ์€ Redis ํด๋Ÿฌ์Šคํ„ฐ๋กœ ๊ตฌ์„ฑํ•˜๋ฉฐ[10] ๊ฒฐ๊ตญ์—๋Š” MySQL๋กœ ์ €์žฅํ•˜๊ณ , Gizzard( twitter sharding and replication framework on top of MySQL)๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค.[11]

 

   Pull(fanout-on-read) ๋ชจ๋ธ์€ ์‚ฌ์šฉ์ž๊ฐ€ ํ”ผ๋“œ๋ฅผ ์กฐํšŒํ• ๋•Œ ํฐ ์—ฐ์‚ฐ์„ ํ•„์š”๋กœ ํ•˜๊ณ , Push(fanout-on-write) ๋ชจ๋ธ์€ ์‚ฌ์šฉ์ž๊ฐ€ ๊ธ€์„ ๊ฒŒ์‹œํ• ๋•Œ ํฐ ์—ฐ์‚ฐ์„ ํ•„์š”๋กœ ํ•œ๋‹ค. ๋•Œ๋ฌธ์— Pull ๋ชจ๋ธ์„ ์„ ํƒํ•œ๋‹ค๋ฉด "์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ์กฐํšŒ์‹œ๊ฐ„์„ ์ค„์ผ ์ˆ˜ ์žˆ๋Š๋ƒ?"๊ฐ€ ๊ด€๊ฑด์ด๊ณ , ํŽ˜์ด์Šค๋ถ์€ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ์œ„ํ•ด์„œ ์กฐํšŒ๋ฅผ ๋” ํšจ๊ณผ์ ์œผ๋กœํ•  ์ˆ˜์žˆ๋Š” TAO๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค. ์ด์— ๋ฐ˜ํ•ด Push(fanout-on-write) ๋ชจ๋ธ์€ "์ด ๋งŽ์€ ๋ฐ์ดํ„ฐ๋“ค์„ ์–ด๋–ป๊ฒŒ ์ €์žฅ์‹œํ‚ฌ ๊ฒƒ์ธ๊ฐ€, ์–ด๋–ป๊ฒŒํ•˜๋ฉด ๋นจ๋ฆฌ ์ €์žฅ์‹œํ‚ฌ๊ฒƒ์ธ๊ฐ€?"๊ฐ€ ๊ด€๊ฑด์ด๊ณ , ํŠธ์œ„ํ„ฐ๋ฅผ ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ DB์— ์ตœ์ข… ์ผ๊ด€์„ฑ๊ณผ MySQL ์ƒค๋”ฉ์„ ์œ„ํ•œ Gizzard๋ฅผ ๋„์ž…ํ–ˆ๋‹ค. ํ•˜๋‚˜๋ฅผ ๋ฐ˜๋“œ์‹œ ์„ ํƒํ•˜๊ธฐ ๋ณด๋‹ค๋Š” pull๊ณผ push๋ฅผ ํ˜ผํ•ฉ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ์šฉ์ž์— ๋Œ€ํ•ด์„œ๋Š” Push ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜๊ณ , ํŒ”๋กœ์›Œ๊ฐ€ ์•„์ฃผ ๋งŽ์€ ์‚ฌ์šฉ์ž์˜ ๊ฒฝ์šฐ์—๋Š” ํŒ”๋กœ์–ด๋กœ ํ•˜์—ฌ๊ธˆ ํ•ด๋‹น ์‚ฌ์šฉ์ž์˜ ํฌ์ŠคํŒ…์„ ํ•„์š”๋กœ ํ• ๋•Œ ๊ฐ€์ ธ๊ฐ€๋„๋ก ํ•˜๋Š” Pull ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ์ด์ฒ˜๋Ÿผ pull๊ณผ push์˜ ํ˜ผํ•ฉ์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋…ผ๋ฌธ์ด Yahoo์—์„œ ๋‚˜์™”๋‹ค.[12] ์–ด๋–ค ๋ชจ๋ธ์ด ๋” ์šฐ์ˆ˜ํ•˜๊ธฐ ๋ณด๋‹ค๋Š” ์„œ๋น„์Šค ํŠน์„ฑ๊ณผ ํ˜„์žฌ ๊ฐœ๋ฐœ ์ƒํ™ฉ์— ๋งž๊ฒŒ ์„ ํƒํ•˜๋ฉด ๊ทธ๊ฒƒ์ด ๊ฐ€์žฅ ์ตœ์„ ์˜ ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค.


 

 

 

Ref)

[1] https://www.instafollowers.co/blog/limits-on-instagram

[2] https://mention.com/en/reports/instagram/followers/

[3] https://help.twitter.com/en/rules-and-policies/twitter-limits
[4] http://small-dbtalk.blogspot.com/2016/02/

[5] https://jobc.tistory.com/216

[6] https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_eq_range_index_dive_limit

[7] https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html

[8] https://engineering.fb.com/2013/06/25/core-data/tao-the-power-of-the-graph/

[9] https://www.usenix.org/system/files/conference/atc13/atc13-bronson.pdf

[10] https://blog.twitter.com/engineering/en_us/a/2012/mysql-at-twitter

[11] https://github.com/twitter-archive/gizzard
[12] https://hyse.org/pdf/distsyspapers/sigmod278-silberstein.pdf

https://d2.naver.com/helloworld/551588