Skip to content

Instantly share code, notes, and snippets.

@yebonkim
Last active November 20, 2018 02:41
Show Gist options
  • Select an option

  • Save yebonkim/f307c11566b0998fb748682caa9bc3d5 to your computer and use it in GitHub Desktop.

Select an option

Save yebonkim/f307c11566b0998fb748682caa9bc3d5 to your computer and use it in GitHub Desktop.

Deview 2018์— ๋‹ค๋…€์™€ ๋“ค์—ˆ๋˜ ์„ธ์…˜์„ ๋‹ค์‹œ ์ตํž ๊ฒธ ์ •๋ฆฌํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ๋Š” ๊ฐ Day๋ณ„๋กœ ๊ฐ€์žฅ ์ธ์ƒ ๊นŠ์—ˆ๋˜ 2๊ฐœ์˜ ์„ธ์…˜์”ฉ์„ ์ •๋ฆฌํ•˜์˜€์Šต๋‹ˆ๋‹ค.

JavaScript ๋ฐฐํ‹€๊ทธ๋ผ์šฐ๋“œ๋กœ๋ถ€ํ„ฐ ์‚ด์•„๋‚จ๊ธฐ

javascript_1

๋ฐœํ‘œ์ž๋ฃŒ ๋งํฌ

Vue, React, Angular ๋“ฑ ๋‹ค์–‘ํ•œ ์›น ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๊ณ„์† ์ ‘ํ•˜๋ฉด์„œ ๋ชจ๋‘ JavaScript์˜ ์ค‘์š”์„ฑ์„ ๋А๋ผ๊ณ  ์žˆ์„ ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋˜ ๋น ๋ฅด๊ฒŒ ๋ณ€ํ•˜๋Š” ์ƒํ™ฉ ์†์—์„œ JavaScript๋Š” ์–ด๋–ป๊ฒŒ ๋” ๊ณต๋ถ€ํ• ์ง€, ์ƒˆ๋กœ์šด ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ์–ธ์ œ ๋ฐฐ์›Œ๋ณผ์ง€ ๊ณ ๋ฏผํ•˜๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๋งŽ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. โ€œJavaScript ๋ฐฐํ‹€๊ทธ๋ผ์šด๋“œ๋กœ๋ถ€ํ„ฐ ์‚ด์•„๋‚จ๊ธฐโ€์—์„œ๋Š” ์ด๋Ÿฌํ•œ ๊ณ ๋ฏผ์„ ํ•˜๋Š” ๊ฐœ๋ฐœ์ž๋“ค์—๊ฒŒ ํ•„์š”ํ•œ ์„ธ์…˜์ด์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด ์„ธ์…˜์€ ์•„๋ž˜์™€ ๊ฐ™์€ ์ˆœ์„œ๋กœ ์ง„ํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

- JavaScript์˜ ํƒ„์ƒ๊ณผ ํ˜„์žฌ
- ํŒŒ์ƒ ๋ฒ„์ „, ServerSide Framework ๋“ฑ ๋‹ค์–‘ํ•œ ๋ฐœ์ „ ๋ฒ„์ „
- Transpiling
- ์šฐ๋ฆฌ๊ฐ€ ๊ฐ€์ ธ์•ผ ํ•  ์ž์„ธ

๋”ฐ๋ผ์„œ ์œ„์˜ ๋‚ด์šฉ์„ ์ˆœ์„œ๋Œ€๋กœ ๊ฐ„๋žตํžˆ ์ถ”๋ ค๋ณด์•˜์Šต๋‹ˆ๋‹ค.

JavaScript์˜ ํƒ„์ƒ๊ณผ ํ˜„์žฌ

JavaScript๋Š” 1995๋…„ 12์›” 4์ผ ์ฒ˜์Œ ๋ฐœํ‘œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹น์‹œ์— ์›น์„ ๋™์ ์œผ๋กœ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ Java์™€ Java Applets ์ด ํฐ ์ธ๊ธฐ์˜€์œผ๋‚˜ ๋น„ ๊ฐœ๋ฐœ์ž๋“ค์—๊ฒŒ ๋‹ค์†Œ ์–ด๋ ค์›Œ ๋” ๊ฐ€๋ณ๊ณ  ๋‹จ์ˆœํ•œ ์–ธ์–ด๊ฐ€ ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋•Œ JavaScript์˜ ์ด๋ฆ„์€

Mocha -> LiveScript -> JavaScript

๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”๋ฐ ์ด๋Š” Netscape์™€ Sun์˜ ํ˜‘์ •์œผ๋กœ Java์ฒ˜๋Ÿผ ๋ณด์—ฌ์•ผ ํ•œ๋‹ค๋Š” ๋งˆ์ผ€ํŒ…์  ์••๋ ฅ์ด ์žˆ์—ˆ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์ดํ›„๋กœ ๊ณ„์† ํ‘œ์ค€ํ™”๊ฐ€ ์ง„ํ–‰๋˜์—ˆ์ง€๋งŒ ES4๊นŒ์ง€๋Š” ํ•ฉ์˜ ๋„์ถœ์— ์‹คํŒจํ–ˆ์—ˆ์Šต๋‹ˆ๋‹ค. ES5 ๋ฒ„์ „๋ถ€ํ„ฐ๋Š” ESํ‘œ์ค€์ด ์žกํžˆ๊ธฐ ์‹œ์ž‘ํ–ˆ์œผ๋ฉฐ ํ˜„์žฌ๋Š” ES9๊นŒ์ง€ ๋‚˜์™”์Šต๋‹ˆ๋‹ค.

ํŒŒ์ƒ ๋ฒ„์ „, ServerSide Framework ๋“ฑ ๋‹ค์–‘ํ•œ ๋ฐœ์ „ ๋ฒ„์ „

๊ทธ๋ฆฌ๊ณ  JavaScript์˜ ํŒŒ์ƒ ๋ฒ„์ „์œผ๋กœ

  - JScript
  - ActionScript

๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ ์•„๋ž˜ 2๊ฐ€์ง€๋„ JavaScript๋กœ๋ถ€ํ„ฐ ๋ฐœ์ „ํ–ˆ์Šต๋‹ˆ๋‹ค.

  - AJAX - ๋น„๋™๊ธฐ์‹ ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์„ ์œ„ํ•œ ์›น ๊ฐœ๋ฐœ ๊ธฐ๋ฒ•
  - JSON - ๊ฐ€๋ฒผ์šด Data ๊ตํ™˜ ํ˜•์‹

JavaScript๋Š” NodeJS๊ฐ€ ๋“ฑ์žฅํ•˜๋ฉด์„œ ServerSide์—ญ์‹œ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋Š” ์–ธ์–ด๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋˜ ๋‹ค์–‘ํ•˜๊ณ  ๋งŽ์€ ํŒจํ‚ค์ง€๊ฐ€ ๊ฐœ๋ฐœ๋˜๋ฉด์„œ ์ด๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ Package Manager์ธ

  - npm
  - bower
  - yarn

๋“ฑ์ด ๋“ฑ์žฅํ–ˆ์Šต๋‹ˆ๋‹ค.

ํŠนํžˆ yarn์€ ๋“ฑ์žฅํ–ˆ์„ ๋‹น์‹œ npm์— ๋น„ํ•ด ๋น ๋ฅธ ์†๋„๋กœ ์ฃผ๋ชฉ๋ฐ›์•˜์ง€๋งŒ ์•„๋ž˜์™€ ๊ฐ™์ด npm ์—…๋ฐ์ดํŠธ ์ดํ›„ ๊ทธ ์ฐจ์ด๊ฐ€ ๊ฑฐ์˜ ์—†์–ด์ ธ ๊ฐ€๊ณ  ์žˆ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

javascript_2

์•„๋ž˜์™€ ๊ฐ™์ด ๋‹ค์–‘ํ•œ Framework๋“ค๋„ ๋“ฑ์žฅํ–ˆ์—ˆ์Šต๋‹ˆ๋‹ค.

1st Generation : jQuery, Prototype, MooTools
2nd Generation : AngularJS, React, Vue,js

๋˜ ๋‹ค์–‘ํ•œ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋“ฑ์žฅํ•˜๋ฉด์„œ ๋ฒ„์ „ ๋งค์นญ์ด ์ค‘์š”ํ•ด์กŒ์Šต๋‹ˆ๋‹ค.

์˜ค๋Š˜ ๋‚ ์˜ Javascript๋Š” ์ˆœ์ˆ˜ํ•˜๊ฒŒ ๊ทธ๋Œ€๋กœ ์“ฐ์ด๊ธฐ ๋ณด๋‹ค Framework์™€ ๊ฐœ๋ฐœ๋„๊ตฌ๋ฅผ ํ†ตํ•ด ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋Œ€๋‹ค์ˆ˜ ๊ธฐ๋Šฅ๋“ค์€ npm๊ฐ™์€ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ ธ๋ฅผ ํ†ตํ•ด ์„ค์น˜ํ•˜๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Transpiling

JavaScript ์†Œ์Šค๋ฅผ ์ฝ์–ด ์ ์ ˆํ•œ ์†Œ์Šค๋กœ ๋ฐ”๊ฟ”์ฃผ๋Š” Transpiling ์–ธ์–ด๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฒƒ๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค.

- TypeScript
- CoffeScript
- elm
- Dart
- GWT

Transpiling์„ ํ†ตํ•ด ES๊ฐ„์˜ ๋ฒ„์ „์„ ํ˜ธํ™˜ํ•  ์ˆ˜ ์žˆ๋Š” BABEL์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ๊ฐ€์ ธ์•ผ ํ•  ์ž์„ธ

๋งˆ์ง€๋ง‰์€ ์ด๋ ‡๊ฒŒ ๋งŽ์€ ๋ฒ„์ „๊ณผ ํ”„๋ ˆ์ž„์›Œํฌ๋“ค ์‚ฌ์ด์—์„œ ์šฐ๋ฆฌ๋Š” ์–ด๋– ํ•œ ์ž์„ธ๋กœ JavaScript๋ฅผ ๊ณต๋ถ€ํ•ด์•ผ ํ•˜๋Š”๊ฐ€์— ๋Œ€ํ•ด์„œ ๋งํ•ด์ฃผ์…จ์Šต๋‹ˆ๋‹ค.

๋Œ€์ฒด๋กœ ๊ฐœ๋ฐœ์ž๋“ค์€ ๊ธฐ์กด์— ๋ฌธ์ œ์—†์ด ์‚ฌ์šฉํ•˜๋˜ ๊ธฐ์ˆ ๋“ค์ด ์žˆ์Œ์—๋„ ์ƒˆ๋กœ์šด ๊ธฐ์ˆ ์— ์‰ฝ๊ฒŒ ๊ด€์‹ฌ์„ ๋บ๊ธด๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

๋˜ jQuery๊ฐ€ ๋Œ€์„ธ์ผ ๋•Œ๊ฐ€ ์žˆ์—ˆ๋Š”๊ฐ€ ํ•˜๋ฉด AngularJS, React, Vue๊ฐ€ ๋Œ€์„ธ๊ฐ€ ๋˜์—ˆ๋“ฏ์ด ๋‹ค์–‘ํ•œ framework๊ฐ€ ๋‚˜์˜ค๋ฉด์„œ ํ•ญ์ƒ โ€˜์ €๊ฑด ์–ธ์ œ ๊ณต๋ถ€ํ•˜์ง€?โ€™๋ผ๋Š” ์ƒ๊ฐ์„ ๊ฐ€์ง€๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ณ ๋ฏผ์— ๋Œ€ํ•ด

์šฐ๋ฆฌ๋Š” ๋ชจ๋‘ ๋‹ค ์•Œ ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์ธ์ •ํ•˜๊ณ  ์ ๋‹นํ•œ ํ˜ธ๊ธฐ์‹ฌ๊ณผ ๊พธ์ค€ํ•จ์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ํ•„์š”ํ•˜๋‹ค

๊ณ  ํ•˜์…จ์Šต๋‹ˆ๋‹ค.

๋„ค์ด๋ฒ„์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€ Data Platform, ๊ทธ๋ฆฌ๊ณ  MongoDB

mongodb_1

๋ฐœํ‘œ์ž๋ฃŒ ๋งํฌ

์ตœ๊ทผ NoSQL DB์ธ MongoDB, DynamoDB ๋งŽ์ด ๋“ฑ์žฅํ•˜๋ฉด์„œ NoSQL์— ๋Œ€ํ•œ ๊ด€์‹ฌ์ด ์ปค์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ € ๋˜ํ•œ ๋„ค์ด๋ฒ„์—์„œ๋Š” MongoDB๋ฅผ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”์ง€, NoSQL์˜ ์žฅ๋‹จ์ ์€ ๋ฌด์—‡์ธ์ง€ ์•Œ๊ณ  ์‹ถ์–ด ์„ธ์…˜์„ ๋“ฃ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

ํ•ด๋‹น ์„ธ์…˜์€ ์•„๋ž˜์™€ ๊ฐ™์€ ์ฃผ์ œ๋กœ ์ง„ํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

  - ๋„ค์ด๋ฒ„์—์„œ์˜ Data Platform
  - MongoDB๊ฐ€ ๋„ค์ด๋ฒ„์—์„œ ์–ด๋–ค ๊ฒฝ์šฐ ๋Œ€์•ˆ์ด ๋˜๊ณ  ์žˆ๋Š”๊ฐ€?
  - ๋„ค์ด๋ฒ„์—์„œ MongoDB๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ๊ฒช์€ ์—ํ”ผ์†Œ๋“œ๋“ค
  - ๊ฐœ์ธ์ ์œผ๋กœ ๋ฐ”๋ผ๋ณด๋Š” MongoDB์˜ ์žฅ๋‹จ์  ๊ทธ๋ฆฌ๊ณ  ์ „๋ง(vs RDBMS)

๋„ค์ด๋ฒ„์—์„œ์˜ Data Platform

์ดˆ์ฐฝ๊ธฐ์—๋Š” ๊ฑฐ์˜ ๋ชจ๋“  ์„œ๋น„์Šค๊ฐ€ Web Server์™€ RDBMS Server๋กœ๋งŒ ์ด๋ฃจ์–ด์ ธ ์žˆ์—ˆ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ด ํ›„ ์„œ๋น„์Šค๊ฐ€ ์ ์  ํ™•์žฅ๋˜๋ฉด์„œ ๋น ๋ฅธ ์‘๋‹ต์„ ์œ„ํ•ด Cache๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋˜ ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ๋ฅผ ๋น„์šฉ๊ณผ ์šฉ๋Ÿ‰ ์ธก๋ฉด์—์„œ ํšจ์œจ์ ์œผ๋กœ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด HBase๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

mongodb_2

๋”ฐ๋ผ์„œ ์œ„์™€ ๊ฐ™์€ ๊ตฌ์กฐ๋กœ ์„œ๋น„์Šค๊ฐ€ ์œ ์ง€๋˜๊ณ  ์žˆ์—ˆ์œผ๋‚˜ ์ ์  MongoDB๋ฅผ ์ž์ฒด์ ์œผ๋กœ ์„ค์น˜ํ•˜์—ฌ ์šด์˜ํ•˜๋Š” ๊ฐœ๋ฐœํŒ€์ด ๋Š˜์–ด๋‚ฌ์Šต๋‹ˆ๋‹ค.

์ด๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ๋ฌธ์ œ์  ๋•Œ๋ฌธ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

- Schema less
- Sharding ์ง€์›
- Secondary Index ์ง€์›
- Transactoin ์ง€์›
- JSON ์ง€์›
- IDC DR ์ง€์›

์œ„์˜ 6๊ฐ€์ง€๊ฐ€ ๊ฐ๊ฐ ๋ฌด์—‡์ธ์ง€ ์‚ดํŽด๋ณด์•˜์Šต๋‹ˆ๋‹ค.

Schema less

์‚ฌ์ „์— ๋ฐ์ดํ„ฐ์˜ ๊ตฌ์กฐ๋ฅผ ๋ฏธ๋ฆฌ ๋ช…์‹œํ•˜์ง€ ์•Š์•„๋„ ๋˜๋Š” ๊ตฌ์กฐ๋ฅผ ๋œปํ•ฉ๋‹ˆ๋‹ค. RDBMS์—์„œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ Table๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜์ง€๋งŒ Schema Less DB๋Š” ์ด๋Ÿฌํ•œ ์ž‘์—…์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋„ค์ด๋ฒ„์˜ ๊ฐ๊ฐ ๋‹ค์–‘ํ•œ ์„œ๋น„์Šค์—์„œ DB๋ฅผ ๋”ฐ๋กœ ์“ด๋‹ค๋ฉด ๋น„ํšจ์œจ์ ์ด๊ธฐ ๋•Œ๋ฌธ์— Schema Less๋ฅผ ํ†ตํ•ด ํ†ตํ•ฉ์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ํ•„์š”๊ฐ€ ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค.

์ด ๋•Œ MongoDB๋Š” ์นผ๋Ÿผ๋ช…๊นŒ์ง€ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด์„œ 1 document๋‹น 46byte๋ฅผ ์ฐจ์ง€ํ•˜๊ธฐ ๋•Œ๋ฌธ์— RDBMS์— ๋น„ํ•ด read/write ๋น„์šฉ์ด ์ฆ๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

Sharding

์„œ๋น„์Šค ๊ทœ๋ชจ๊ฐ€ ์ปค์ง€๋ฉด์„œ DB Scale Up์˜ ํ•œ๊ณ„๊ฐ€ ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ RDBMS๋กœ Scale Out์ธ ์ƒค๋”ฉ์„ ๊ตฌํ˜„ํ•  ๊ฒฝ์šฐ ํ™•์žฅ์„ฑ์ด ๋–จ์–ด์ง€๋ฉฐ ๊ฐœ๋ฐœ ๋ฐ ๊ด€๋ฆฌ ๋น„์šฉ์ด ๋“ญ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Auto Sharding์ด ๊ฐ€๋Šฅํ•œ Platform์ด ํ•„์š”ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ์ƒค๋”ฉ์ด๋ž€ ๊ฐ™์€ ํ…Œ์ด๋ธ” ๊ตฌ์กฐ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์ˆ˜์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ถ„์‚ฐํ•˜์—ฌ ์ €์žฅํ•˜๋Š” ๊ฒƒ์„ ๋œปํ•ฉ๋‹ˆ๋‹ค.

Secondary Index

์œ„์—์„œ ์–ธ๊ธ‰ํ•˜์˜€๋“ฏ์ด ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด HBase๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์„ ๋•Œ Secondary Index ๊ธฐ๋Šฅ์ด ํ•„์š”ํ–ˆ์ง€๋งŒ HBase์—์„œ๋Š” ์ง€์›ํ•ด์ฃผ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. HBase๋Š” File๋ณ„๋กœ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๋ถ„๋ฆฌ๋˜์–ด ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ MongoDB๋Š” Shard๋ณ„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ Chunk๋‹จ์œ„๋กœ ๋…ผ๋ฆฌ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ณ  Secondary Index๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋งŒ Chunk๋ฅผ ๋‚˜๋ˆ„์–ด์ฃผ๊ฑฐ๋‚˜ ํ•ฉ์น  ๋•Œ ๋ถ€ํ•˜๊ฐ€ ์ƒ๊ธด๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

mongodb_3

Transaction

NoSQL ์ค‘์—์„œ๋„ Transaction์„ ์ง€์›ํ•˜๋Š” Platform์ด ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ Transaction์ด๋ž€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ƒํƒœ๋ฅผ ๋ณ€ํ™”์‹œํ‚ค๋Š” ์ž‘์—…์˜ ๋‹จ์œ„๋กœ ์›์ž์„ฑ, ์ผ๊ด€์„ฑ, ๋…๋ฆฝ์„ฑ, ์ง€์†์„ฑ๊ณผ ๊ฐ™์€ ์†์„ฑ์„ ์ง€์›ํ•˜์—ฌ ์—ฌ๋Ÿฌ ์ž‘์—…์„ ํ•œ ๋ฒˆ์— ์ฒ˜๋ฆฌํ•  ๋•Œ ๋ณด๋‹ค ์•ˆ์ •์ ์ž…๋‹ˆ๋‹ค.

IDC DR

์„œ๋น„์Šค๊ฐ€ ์ปค์ง€๋ฉด์„œ IDC์˜ ์ด์ค‘ํ™”๊ฐ€ ํ•„์š”ํ•ด์กŒ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ MongoDB๋Š” IDC๊ฐ„์˜ Auto Failover๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์ฒœ์žฌ์ง€๋ณ€์ด ์ผ์–ด๋‚ฌ์„ ๊ฒฝ์šฐ ์žฅ์• ๊ฐ€ ์ผ์–ด๋‚œ IDC๋ฅผ ์ œ์™ธํ•˜๊ณ  ์ •์ƒ ์ž‘๋™ํ•˜๋Š” IDC๋กœ Failoverํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ IDC๋Š” Internet Data Center๋กœ ์„œ๋ฒ„ ์ปดํ“จํ„ฐ์™€ ๋„คํŠธ์›Œํฌ ํšŒ์„  ๋“ฑ์„ ์ œ๊ณตํ•˜๋Š” ์‹œ์„ค์„ ๋œปํ•ฉ๋‹ˆ๋‹ค.

๋„ค์ด๋ฒ„์—์„œ MongoDB๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ๊ฒช์€ ์—ํ”ผ์†Œ๋“œ๋“ค

Mongos๊ด€๋ฆฌ

์ œ์กฐ์‚ฌ๋Š” routing์— ์“ฐ์ด๋Š” Mongos๋ฅผ client์™€ ๊ฐ™์ด ๋ฐฐํฌํ•  ๊ฒƒ์„ ๊ถŒ์žฅํ•˜์ง€๋งŒ ๊ทธ๋ ‡๊ฒŒ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋ฐฐํฌ ๊ด€๋ฆฌ๊ฐ€ ๋น„ํšจ์œจ์ ์ด๊ธฐ ๋•Œ๋ฌธ์ธ๋ฐ ๋„ค์ด๋ฒ„์—์„œ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์€ mongos๊ฐ€ ์•„๋‹ˆ๋ฉฐ dba๊ฐ€ ์—„๊ฒฉํžˆ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ†ตํ•ฉ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๋น„ํšจ์œจ์ ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

L4์™€ getmore ๋ฌธ์ œ

๋„ค์ด๋ฒ„์—์„œ๋Š” Sharding์‹œ์— L4๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ด ๊ถŒ์žฅ๋˜์—ˆ์œผ๋‚˜ getmore์ด์Šˆ๋กœ ์ œ๊ฑฐํ•˜์˜€์Šต๋‹ˆ๋‹ค.

getmore ๋™์ž‘ ์ค‘์— ๋‹ค๋ฅธ mongos๋กœ ๊ฐ€๋ฉด ์—๋Ÿฌ๊ฐ€ ๋‚ฌ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. L4๋Š” Round Robin ๋ฐฉ์‹์œผ๋กœ mongos๊ฐ€ ๊ณ„์† ๋ฐ”๋€Œ์–ด L4๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ๋ฐ–์— ์—†์—ˆ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

mongodb_4

์—ฌ๊ธฐ์„œ L4๋Š” ๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ผ์šฐํŒ… ๊ธฐ๋Šฅ์„ ํฌํ•จํ•œ ์Šค์œ„์น˜ ์žฅ๋น„์ž…๋‹ˆ๋‹ค.

Mongos <-> Shard์ปค๋„ฅ์…˜

๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ฌธ์ œ๋ผ๊ณ  ๊ฐ•์กฐ๋ฅผ ํ•˜์…จ๋˜ ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. Mongos์™€ Shard Server ๊ฐ„์˜ ์ปค๋„ฅ์…˜ ๊ด€๋ฆฌ์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š”๋ฐ ์ด๋Š” ์š”์ฒญ์ด ๋งŽ์•„์ง€๋ฉด max๊ฐ€ unlimited์ด๊ธฐ ๋•Œ๋ฌธ์— ์ปค๋„ฅ์…˜์„ ๊ณ„์† ๋งบ์–ด ๋ถ€ํ•˜๊ฐ€ ์—„์ฒญ๋‚˜๋‹ค๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์•„๋ž˜์™€ ๊ฐ™์€ ์˜ต์…˜์„ ์ ์šฉํ•ด์•ผ ํ•œ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

mongodb_5

Storage Engine โ€“ Eviction Problem

WiredTiger ์—”์ง„ ์‚ฌ์šฉ์‹œ 3.2.11 ๋˜๋Š” 3.4 ๋ฒ„์ „ ์ด์ƒ์„ ์‚ฌ์šฉํ•˜์—ฌ์•ผ Eviction Problem์„ ๊ฒช์ง€ ์•Š๋Š”๋‹ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋งŒ์•ฝ 3.0๋ฒ„์ „์„ ์“ฐ๊ณ  ์žˆ์œผ๋ฉฐ WiredTiger ์—”์ง„ ๋ฒ„์ „ ์—…๋ฐ์ดํŠธ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ nmap์‚ฌ์šฉ์„ ์ถ”์ฒœํ–ˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ Eviction Problem์ด๋ž€ Memory Buffer์—์„œ ์˜ค๋ž˜๋œ Data๊ฐ€ ์‚ญ์ œ๋˜๋Š” ๋ฌธ์ œ๋ฅผ ๋œปํ•ฉ๋‹ˆ๋‹ค.

Storage Engine โ€“ Checkpoint

์—ฌ๊ธฐ์„œ Checkpoint๋Š” memory buffer์™€ disk ์‚ฌ์ด์˜ ๋ฐ์ดํ„ฐ ๋ถˆ์ผ์น˜๋ฅผ ํ•ด์†Œํ•˜๊ธฐ ์œ„ํ•ด์„œ memory์—์„œ disk๋กœ data๋ฅผ syncํ•˜๋Š” ์ž‘์—…์„ ๋œปํ•ฉ๋‹ˆ๋‹ค. Checkpoint ์‹คํ–‰ ์‹œ ๋ชจ๋“  Dirty Page๋ฅผ ๋‚ด๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— Disk IO๊ฐ€ ๋งŽ์•„์ ธ ์„ฑ๋Šฅ์ด ํ•˜๋ฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

mongodb_6

Background Index

RDBMS์—์„œ๋Š” Background index ์ƒ์„ฑ์‹œ ๊ด€๋ จ ํ…Œ์ด๋ธ”๋งŒ lock๋˜์ง€๋งŒ MongoDB์—์„œ๋Š” db ์ž์ฒด๊ฐ€ lock๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ฟผ๋ฆฌ ์ง€์—ฐ์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Background index ์ƒ์„ฑ์€ ์ฃผ๋กœ ํŠธ๋ž˜ํ”ฝ์ด ๋‚ฎ์€ ์ƒˆ๋ฒฝ์— ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค.

๋Œ€ํ˜• ์ปจํ…Œ์ด๋„ˆ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ์˜ ๊ณ ๊ฐ€์šฉ์„ฑ

container_0

๋ฐœํ‘œ์ž๋ฃŒ ๋งํฌ

๊ฐœ์ธ์ ์œผ๋กœ ์„œ๋ฒ„ ์•„ํ‚คํ…์ณ์— ๊ด€์‹ฌ์ด ๋งŽ์•„์ ธ ๊ฐ€์žฅ ์žฌ๋ฏธ์žˆ๋˜ ์„ธ์…˜์ด์—ˆ์Šต๋‹ˆ๋‹ค.ใ…Žใ…Ž

ํ•ด๋‹น ์„ธ์…˜์€ ์•„๋ž˜์™€ ๊ฐ™์€ ๋‚ด์šฉ์œผ๋กœ ์ง„ํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

- ๋Œ€๊ทœ๋ชจ ์ปจํ…Œ์ด๋„ˆ ํด๋Ÿฌ์Šคํ„ฐ์˜ Load Balancing
- Large Scale Load Balancing
- ๊ณ ๊ฐ€์šฉ์„ฑ์„ ์œ„ํ•œ Consistent Hashing
- IPVS Maglev Hashing Scheduler
- ํ™•์žฅ์„ฑ ์žˆ๊ณ  ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” Load Balancer

๋Œ€๊ทœ๋ชจ ์ปจํ…Œ์ด๋„ˆ ํด๋Ÿฌ์Šคํ„ฐ์˜ Load Balancing

๋Œ€๊ทœ๋ชจ ์ปจํ…Œ์ด๋„ˆ ํด๋Ÿฌ์Šคํ„ฐ๋ž€ ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ์—ฌ๋Ÿฌ ํด๋Ÿฌ์Šคํ„ฐ์— ์ˆ˜ ์ฒœ๊ฐœ ์ด์ƒ์˜ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์šด์˜๋˜๋Š” ํ™˜๊ฒฝ์„ ๋œปํ•ฉ๋‹ˆ๋‹ค.

container_1

์ด๋ ‡๊ฒŒ ์—ฌ๋Ÿฌ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์žˆ์„ ๋•Œ Container Load Balancing์ด๋ž€ Layer4 Load Balancer๊ฐ€ ๋ถ€ํ•˜์— ๋”ฐ๋ผ ์ ์ ˆํ•œ ์ปจํ…Œ์ด๋„ˆ๋“ค๋กœ ์—ฐ๊ฒฐํ•ด ์ฃผ๋Š” ๊ฒƒ์„ ๋œปํ•ฉ๋‹ˆ๋‹ค. ์ด ๋•Œ Dynamic Load Balancer์—๋Š” ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” Container์˜ ์ฃผ์†Œ๋ฅผ ์ •์ ์œผ๋กœ ์ €์žฅํ•ด ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ƒํ™ฉ์—์„œ ์ปจํ…Œ์ด๋„ˆ๋Š” ์ž์ฃผ ์ถ”๊ฐ€, ์‚ญ์ œ, ์žฌ์‹œ์ž‘ ๋˜๋ฉด์„œ ์•„๋ž˜์™€ ๊ฐ™์ด ์†Œ์†๋˜๋Š” Container Host๊ฐ€ ๋ฐ”๋€Œ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋นˆ๋ฒˆํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ ์ •์ ์œผ๋กœ ์ฃผ์†Œ๋ฅผ ๊ด€๋ฆฌํ•  ๊ฒฝ์šฐ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ณ€ํ•˜๋Š” Container๋“ค์˜ ์ƒํƒœ๋ฅผ ๋ฐ˜์˜ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

container_2

๊ฒŒ๋‹ค๊ฐ€ Container๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ์— ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๋ฉด ํ•ด๋‹น ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ์— ์—ฐ๊ฒฐ๋˜์–ด์žˆ๋˜ Container๋“ค์— ๋Œ€ํ•œ Connection์„ ๋ชจ๋‘ ์žƒ๊ฒŒ ๋˜๋Š” ๋ฌธ์ œ๋„ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๋•Œ๋ฌธ์— ๊ณ ๊ฐ€์šฉ์„ฑ์„ ์œ„ํ•ด ์œ„์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค.

<์š”์•ฝ>

- Load Balancer์˜ Container ์—ฐ๊ฒฐ์ด ๊ณ ์ •์ ์ด๊ธฐ ๋•Œ๋ฌธ์— Dynamicํ•˜๊ฒŒ ๋ณ€ํ•˜๋Š” Container์ƒํ™ฉ์— ๋Œ€์‘ํ•  ์ˆ˜ ์—†์Œ
- Load Balancer์ž์ฒด์— ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ์‹œ Load Balancer์— ์—ฐ๊ฒฐ๋œ Connection๋“ค์„ ๋ชจ๋‘ ์œ ์‹คํ•˜๊ฒŒ ๋จ

Large Scale Load Balancing

๊ธฐ์กด์˜ Layer3 Routing์€ ๊ฐ™์€ ๋น„์šฉ์œผ๋กœ ์—ฌ๋Ÿฌ ๊ฒฝ๋กœ๋ฅผ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Œ์—๋„ ํ•˜๋‚˜์˜ ๊ฒฝ๋กœ๋งŒ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์œ„์™€ ๊ฐ™์€ ๋ฌธ์ œ์  ํ•ด๊ฒฐ์„ ์œ„ํ•ด BGP(Border Gateway Protocol)๊ณผ ECMP(Equal Cost Multi Path)๋ฅผ ๋„์ž…ํ•˜์˜€์œผ๋‚˜ ๋˜ ์•„๋ž˜์™€ ๊ฐ™์€ ๋ฌธ์ œ์ ์ด ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค. ECMP์—์„œ ๊ฒฝ๋กœ์„ค์ •์ด Hashing์„ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์— Load Balancer์˜ ๊ฐœ์ˆ˜ N์œผ๋กœ ๋‚˜๋ˆ„์–ด์ค„ ๋•Œ Load Balancer์— ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๊ฒฝ์šฐ Hashing์‹œ์— N-1๋กœ ๋‚˜๋ˆ„์–ด์ฃผ๊ฒŒ ๋˜์–ด ์ด์ „์˜ ์—ฐ๊ฒฐ์ด ๋ชจ๋‘ ๋ฐ”๋€Œ๊ฒŒ ๋œ๋‹ค๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ ์žฅ์• ๊ฐ€ ์ผ์–ด๋‚œ ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ Hashing์ด ๋ฐ”๋€ ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ ์—ญ์‹œ TCP Connection์ด ์œ ์‹ค๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฌธ์ œ์ ๋“ค์€ ๊ณ ๊ฐ€์šฉ์„ฑ์˜ ์„œ๋น„์Šค๋ฅผ ๊ตฌ์ถ•ํ•˜๊ธฐ ํž˜๋“ค๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๊ฒฐ์ด ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค.

container_4

<์š”์•ฝ>

BGP/ECMP ์‚ฌ์šฉ์‹œ ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ์— ์žฅ์• ๊ฐ€ ์ผ์–ด๋‚ฌ์„ ๊ฒฝ์šฐ Hash Disruption์ด ์ผ์–ด๋‚จ

๊ณ ๊ฐ€์šฉ์„ฑ์„ ์œ„ํ•œ Consistent Hashing

์œ„์˜ Hashing ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Consistent Hashing์„ ๋„์ž…ํ•˜์˜€์Šต๋‹ˆ๋‹ค. Consistent Hashing์€ ์ตœ๋Œ€ K/n ๋งŒํผ์˜ disruption์„ ๋ณด์žฅํ•˜์ง€๋งŒ ํšจ์œจ์ ์ธ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ ๋ฐฉ์‹์€ ์•„๋‹ˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ๊ฐ ๋™์ผํ•œ ์ˆ˜์˜ Connection์„ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๊ฒŒ ๋  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ K๋Š” ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ํ•ด์„์ด ๋‹ค์–‘ํ•˜๋‚˜ PPT์—์„œ๋Š” Connection์˜ ๊ฐœ์ˆ˜๋กœ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ Consistent Hashing์ด๋ž€ ์•„๋ž˜์™€ ๊ฐ™์ด Hash ๊ฐ’์„ Ringํ˜•์œผ๋กœ ๊ตฌ์„ฑํ•˜์—ฌ ๊ฐ ๋…ธ๋“œ๋Š” ๋ง์—์„œ ๋งก์€ ๋ฒ”์œ„๋ฅผ ๋ถ„ํ• ํ•˜์—ฌ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

container_3

์—ฌ๊ธฐ์„œ ๊ตฌ๊ธ€์˜ Maglev Load Balancer๋ผ๋Š” Consistent Hashing์„ ์ง€์›ํ•˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๋ฐœ๊ฒฌํ•ฉ๋‹ˆ๋‹ค. Maglev์—์„œ๋Š” permutation๊ณผ population ๋ฐฉ๋ฒ•์„ ํ†ตํ•ด index table์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

๋จผ์ € ์•„๋ž˜์™€ ๊ฐ™์ด Backend ๊ฐœ์ˆ˜์™€ Table Size์— ๋”ฐ๋ผ Permutation Table์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

container_5

๋‹ค์Œ Population ๊ณผ์ •์„ ํ†ตํ•ด Backend๋ฅผ LookUp Table์— ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ํ• ๋‹นํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋นจ๊ฐ„์ƒ‰, ์ดˆ๋ก์ƒ‰, ๋…ธ๋ž‘์ƒ‰ ํ™”์‚ดํ‘œ ์ˆœ์„œ๋Œ€๋กœ ๋ฉ”๋ชจ๋ฅผ ์ฐธ์กฐํ•ด์ฃผ์„ธ์š”. ์ด ์ˆœ์„œ๋Œ€๋กœ ๊ฐ€์žฅ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์€ BackEnd๋ฅผ ํ• ๋‹นํ•˜๋ฉฐ ์ด๋ฏธ ์‚ฌ์šฉ๋˜์–ด์ง€๊ณ  ์žˆ๋Š” ์ž๋ฆฌ๋Š” ์ฐจ์ˆœ์œ„์˜ BackEnd๋ฅผ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.

container_6

์œ„์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์•„๋ž˜ ์ˆ˜๋„์ฝ”๋“œ๋ฅผ ์ฐธ์กฐํ•˜๋ฉด ๋” ์ดํ•ด๊ฐ€ ์‰ฝ์Šต๋‹ˆ๋‹ค.

container_7

ํ•ด๋‹น Maglev ์ž๋ฃŒ๋Š” ์ด ์ž๋ฃŒ ์—์„œ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฅผ ํ†ตํ•ด ํšจ์œจ์ ์ธ Load Balancing์„ ํ•˜๊ณ  Backend๊ฐ€ ์‚ญ์ œ๋˜๊ฑฐ๋‚˜ ์ถ”๊ฐ€๋˜๋Š” ์ƒํ™ฉ์—์„œ๋„ K/n ๋งŒํผ์˜ Disruption๋งŒ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์ด Disruption์€ Lookup Tableํฌ๊ธฐ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ๊ฐ์†Œํ•ฉ๋‹ˆ๋‹ค.

IPVS Maglev Hashing Scheduler

์œ„์™€ ๊ฐ™์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํ•„์š”ํ•œ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•ด์•ผํ–ˆ์Šต๋‹ˆ๋‹ค. ๋„ค์ด๋ฒ„๋Š” ์ด๋ฅผ Linux Kernel์˜ Netfilter๋ฅผ ํ†ตํ•ด ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค. Maglev Software์—์„œ Consistent Hashing ์•Œ๊ณ ๋ฆฌ์ฆ˜๋งŒ ํ•„์š”ํ•œ๋ฐ ๋‹ค๋ฅธ ๋ถ€๊ฐ€์ ์ธ ๊ธฐ์ˆ ์ธ Packet Forwarding์ด๋‚˜ Packet Processing, Backend Selection๋„ ๊ตฌํ˜„ํ•ด์•ผํ•˜๋Š” ๋ฌธ์ œ์ ์ด ์ƒ๊ฒจ IPVS ์œ„์—์„œ Consistent Hashing ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ Scheduling ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋ชจ๋“ˆ๋ณ„๋กœ ์ œ๊ณตํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์Šค์ผ€์ฅด๋Ÿฌ ๋ณ€๊ฒฝ์ด ์šฉ์ดํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋„ค์ด๋ฒ„๋Š” ์—ฌ๊ธฐ์— Maglev ๋ชจ๋“ˆ์„ ์ถ”๊ฐ€ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ IPVS kernel ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ

- sloppy_tcp : ipvs๊ฐ€ sync์•„๋‹Œ tcp ๋ฉ”์‹œ์ง€๋Š” ๋ชจ๋‘ ๋ฒ„๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ์ด ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํ†ตํ•ด ๋ชจ๋‘ ํฌ์›Œ๋”ฉ๋ฐ›์„ ์ˆ˜ ์žˆ์Œ
- conn_reuse_mode : ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ ํผํฌ๋จผ์Šค๋ฅผ ์˜ฌ๋ ค์คŒ

๊ฐ€ ์žˆ๊ณ  ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๋„ค์ด๋ฒ„ ๊ฒ€์ƒ‰๊ณผ ๊ฐœ์ธํ™”

personalize_0

๋ฐœํ‘œ์ž๋ฃŒ ๋งํฌ

ํ•ด๋‹น ์„ธ์…˜์€ ์•„๋ž˜์™€ ๊ฐ™์€ ์ˆœ์„œ๋กœ ์ง„ํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

- ๊ฒ€์ƒ‰์˜ ๋ชฉํ‘œ
- ๊ฐœ์ธํ™”๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ
- ๊ฐœ์ธ ๊ฒ€์ƒ‰์˜๋„ ํŒŒ์•…
- ๊ฐœ์ธํ™” ๊ฒ€์ƒ‰ ํ™•์žฅ

๊ฒ€์ƒ‰์˜ ๋ชฉํ‘œ

์ด์ „๊นŒ์ง€ ๊ฒ€์ƒ‰์€ โ€˜์ตœ๋Œ€ ๋‹ค์ˆ˜์˜ ์ตœ๋Œ€ ๋งŒ์กฑโ€™์„ ์ด๋ฃจ๊ธฐ ์œ„ํ•ด ์ตœ๋Œ€ํ•œ ๋งŽ์€ ์‚ฌ๋žŒ์„ ๋งŒ์กฑ ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ๋™์ผํ•œ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ์ œ๊ณตํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ตœ๋Œ€ํ•œ ๋‹ค์–‘ํ•œ ์˜๋„๋ฅผ ๋งŒ์กฑ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์•„๋ž˜ ๊ทธ๋ฆผ์—์„œ์ฒ˜๋Ÿผ ์ž๋™์ฐจ ์™ธ๊ด€์„ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด 3D๋กœ ์ฐจ๋ฅผ ํšŒ์ „์‹œํ‚ค๋Š” ๊ธฐ๋Šฅ๋“ฑ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ๊ฐœ๋ฐœํ•˜์˜€์Šต๋‹ˆ๋‹ค.

personalize_1

๊ฐœ์ธํ™”๊ฐ€ ํ•„์š”ํ•œ ์ด์œ 

์ ์  ์œ ์ €์˜ ๊ฒ€์ƒ‰ ์˜๋„๊ฐ€ ๋‹ค์–‘ํ•ด์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์ด โ€˜ํŽœํƒ€๊ณคโ€™ ์ด๋ผ๋Š” ๋‹จ์–ด์— ๋Œ€ํ•ด ๊ฒ€์ƒ‰ํ•  ๋•Œ ์•„์ด๋Œ ํŽœํƒ€๊ณค๊ณผ ๋ฏธ๊ตญ์˜ ํŽœํƒ€๊ณค ์ค‘ ์–ด๋А ๊ฒƒ์„ ์˜๋„ํ•˜์˜€๋Š”์ง€ ์•Œ๊ธฐ ์‰ฝ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ตœ๋Œ€ ๋‹ค์ˆ˜์˜ ์ตœ๋Œ€ ๋งŒ์กฑ๋ณด๋‹ค ๊ฐœ์ธ์˜ ์ตœ๋Œ€ ๋งŒ์กฑ์ด ์ค‘์š”ํ•ด์ง„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด์™€ ๊ฐ™์€ ๊ด€์ ์—์„œ๋„ ๋˜‘๊ฐ™์€ ์งˆ์˜์–ด์— ๋Œ€ํ•ด์„œ ๋˜‘๊ฐ™์€ ๋‚ด์šฉ์„ ๋ณด์—ฌ์ค€๋‹ค๊ณ  ํ•˜๋”๋ผ๋„ ์–ด๋–ค ๋ ˆ์ด์•„์›ƒ์— ์–ด๋–ค ์ •๋ณด๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ด์กŒ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ด๋ฏธ์ง€๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ ์ž ํ•˜๋Š” ๋ชฉ์ ์ด์—ˆ๋‹ค๋ฉด ์ด๋ฏธ์ง€๋ฅผ ๋„์–ด์ฃผ๊ณ  ์‹ค์‹œ๊ฐ„ Talk์„ ๋ณด๊ธฐ์œ„ํ•œ ๋ชฉ์ ์ด์—ˆ๋‹ค๋ฉด TALK์„ ๋„์›Œ์ค„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

personalize_2

์ด์™€ ๊ฐ™์€ ๊ฐœ์ธํ™” ๊ฒ€์ƒ‰์€ ๋„ค์ด๋ฒ„ ์‚ฌ์šฉ์ž ์ค‘ 1%๋งŒ์ด ๊ฒฝํ—˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฅผ ์œ„ํ•ด ์—ฌ๋Ÿฌ Click Entropy, User Entropy, Potential curve for personalization ๋“ฑ ๋‹ค์–‘ํ•œ ์—ฐ๊ตฌ๊ฐ€ ์ง„ํ–‰๋˜์—ˆ์œผ๋‚˜ ๋ชจ๋‘ ์˜ˆ์ธก ๊ฒฐ๊ณผ๊ฐ€ 80%๋ฅผ ๋„˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐœ์ธํ™”๊ฐ€ ํ•„์š”ํ•œ ๋ถ€๋ถ„์„ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•ด ์•„๋ž˜์™€ ๊ฐ™์ด 3-Level Query Ambiguity ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

personalize_3

๊ฐœ์ธ์˜ ๊ฒ€์ƒ‰ ์˜๋„

๋‚จ์€ ๋ฌธ์ œ๋Š” ์‚ฌ์šฉ์ž์˜ ๊ฒ€์ƒ‰ ์˜๋„๋ฅผ ํŒŒ์•…ํ•˜์—ฌ ์ ์šฉํ•˜๋Š” ์ผ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์•„๋ž˜์™€ ๊ฐ™์ด ์‚ฌ๋žŒ์˜ ๊ธฐ์–ต์€ ์žฅ๊ธฐ ๊ธฐ์–ต, ๋‹จ๊ธฐ ๊ธฐ์–ต์œผ๋กœ ๋‚˜๋‰œ๋‹ค๋Š” ์ ์— ์ฐฉ์•ˆํ•˜์—ฌ ๋ชจ๋ธ์„ ์ •์˜ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ฆ‰ 3-Level Query Ambiguity๋Š” ์–ธ์ œ ๊ฐœ์ธํ™” ํ•ด์ค„๊ฒƒ์ธ๊ฐ€์— ๋Œ€ํ•œ ๊ฒƒ์ด๋ฉฐ Humm์€ ๋ˆ„๊ตฌ์—๊ฒŒ ์ •๋ณด๋ฅผ ์ค„ ๊ฒƒ์ธ๊ฐ€์— ๊ด€๋ จ๋˜์–ด์žˆ์Šต๋‹ˆ๋‹ค.

personalize_4

personalize_5

์—ฌ๊ธฐ์„œ ๊ฐ ๋ฉ”๋ชจ๋ฆฌ์˜ ์˜๋ฏธ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

- Immediate ๋ฉ”๋ชจ๋ฆฌ - ๊ฐ๊ด€์ , ๋‹จ๋ฐœ์  ๊ฒ€์ƒ‰, ์‹ค์‹œ๊ฐ„ ๊ฒ€์ƒ‰ ์ˆœ์œ„์— ์˜ํ–ฅ๋ฐ›์Œ 
โ€“ Working memory โ€“ ์‚ฌ์šฉ์ž์˜ ๊ฒ€์ƒ‰ ์„ธ์…˜์•ˆ์—์„œ ์˜๋ฏธ์žˆ๊ฒŒ ์—ฐ์†๋˜๋Š” ๊ฒ€์ƒ‰๋“ค 
- Long term memory - ๋ฉฐ์น ๋™์•ˆ working memory์˜ ๊ฒ€์ƒ‰ ๋‚ด์šฉ์ด ์œ ์ง€๋  ๋•Œ 

Working Memory๋Š” ์‚ฌ์šฉ์ž์˜ ๊ฒ€์ƒ‰ ์„ธ์…˜์ด ๊ธธ๊ฒŒ ์œ ์ง€๋˜์ง€ ์•Š์•„ ๋ฐ์ดํ„ฐ๊ฐ€ ์ถฉ๋ถ„ํžˆ ๋ชจ์ด์ง€ ๋ชปํ•ด ์•„์ง ๊ฐœ๋ฐœ์ค‘์ž…๋‹ˆ๋‹ค.

๊ฐœ์ธํ™” ๊ฒ€์ƒ‰ ํ™•์žฅ

ํ™•์žฅ ๋ฐฉ์•ˆ์—๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด 2๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

-User Group์œผ๋กœ์˜ ํ™•์žฅ : ๊ทธ ์‚ฌ๋žŒ์—๊ฒŒ ๋””์˜ค์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์–ด๋„ ๋‚จ์˜ ๋ฐ์ดํ„ฐ๋กœ ์ด์šฉ๊ฐ€๋Šฅํ•œ ๋ฐฉ๋ฒ•์„ ๋งํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Long Term Memory๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

-Query Group์œผ๋กœ์˜ ํ™•์žฅ : ์˜ˆ๋ฅผ ๋“ค์–ด โ€˜์ง€๋ฏผโ€™์ด๋ผ๋Š” ์ฟผ๋ฆฌ๊ฐ€ ๋“ค์–ด์™”์„ ๋•Œ ํ‰์†Œ์—๋Š” ๋ฐฉํƒ„์†Œ๋…„๋‹จ์˜ โ€˜์ง€๋ฏผโ€™์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ์ง€๋งŒ Long Term Memory์— โ€˜์„คํ˜„โ€™์ด ์žˆ๋‹ค๋ฉด AOA์˜ โ€˜์ง€๋ฏผโ€™์„ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment