๐ข 12. System design & Scalability
๊ท๋ชจ ํ์ฅ์ฑ (scalability) ์ ๊ฐ์ฅ ์ฌ์ด ์ข ๋ฅ์ ๋ฌธ์
โญ ๋ฌธ์ ๋ฅผ ๋ค๋ฃจ๋ ๋ฐฉ๋ฒ
- ์ํตํ๋ผ ์์ฌ์ํต ๋ฅ๋ ฅ์ ํ๊ฐํ๊ธฐ ์ํจ
- ์ฒ์์๋ ํฌ๊ด์ ์ผ๋ก ์ ๊ทผํ๋ผ ํน์ ๋ถ๋ถ์ ๊ณผ๋ํ๊ฒ ํ๊ณ ๋ค์ง ๋ง๋ผ
- ํ์ดํธ๋ณด๋๋ฅผ ์ฌ์ฉํ๋ผ ํ์ดํธ๋ณด๋์ ์ ์ํ๋ ๊ทธ๋ฆผ์ ๊ทธ๋ฆฌ๋ฉด์ ์ค๋ช ํด๋ผ
- ๋ฉด์ ๊ด์ด ์ฐ๋ คํ๋ ๋ถ๋ถ์ ์ธ์ ํ๋ผ ๋ฉด์ ๊ด์ด ์ง์ ๋ฌธ์ ์ ์ ์ธ์ ํ๊ณ ์ ์ ํ๊ฒ ์์ ํด๋ผ
- ๊ฐ์ ์ ํ ๋ ์ฃผ์ํ๋ผ ์๋ชป๋ ๊ฐ์ ์ ๋ฌธ์ ๋ฅผ ์์ ํ ๋ค๋ฅด๊ฒ ๋ฐ๊ฟ ๋ฒ๋ฆด ์ ์๋ค
- ์ฌ๋ฌ๋ถ์ด ์๊ฐํ๋ ๊ฐ์ ์ ๋ช ํํ ์ธ๊ธํ๋ผ ๋ฉด์ ๊ดํํ ๊ฐ์ ํ ๊ฒ์ ์๋ฆฌ๋ผ
- ํ์ํ๋ค๋ฉด ์ด๋ฆผ์ก์ ๋ณด๋ผ ํ์ํ ๊ณต๊ฐ์ด ์ผ๋ง๋ ๋๋์ง ์ด๋ฆผ์ก์ ๋ด๋ผ
- ๋ฐ์ด๋ค๋ผ ์ฅ๋จ์ ์ ์ด๋ฆฐ ๋ง์์ผ๋ก ๋ฐ์๋ค๋ผ
์ต๊ณ ์ ์ค๊ณ๋ฅผ ํด๋ด๋ ๊ฒ๋ณด๋ค ๋๊ฒ ๊ทธ ๊ณผ์ ์ ์ค์ํ๊ฒ ๋ณธ๋ค
โญ ์์คํ ์ค๊ณ: ๋จ๊ณ์ ์ ๊ทผ๋ฒ
1๋จ๊ณ: ๋ฌธ์ ์ ๋ฒ์๋ฅผ ์ค์ ํ๋ผ
๋ง๋ค๊ณ ์ ํ๋ ์์คํ ๊ณผ ๋ฉด์ ๊ด์ด ์ํ๋ ๊ฒ์ด ๊ฐ์์ง ํ์คํ ํ๊ธฐ ์ํด ๋ฌธ์ ์ ๋ฒ์๋ฅผ ํ์ ํด๋ผ
- URL์ TinyURL๋ก ์ถ์ฝ
- URL์ ๋ถ์
- TinyURL๊ณผ ์ฐ๊ฒฐ๋ URL์ ๊ฒ์
- ์ฌ์ฉ์ ๊ณ์ ๋ฐ ๋งํฌ ๊ด๋ฆฌ
2๋จ๊ณ: ํฉ๋ฆฌ์ ์ธ ๊ฐ์ ์ ๋ง๋ค์ด๋ผ
๊ฐ์ ์ ์ธ์ฐ๋ ๊ฒ๋ ๊ด์ฐฎ์ง๋ง, ํฉ๋นํด์ผ ํ๋ค
์ด๋ค ๊ฐ์ ์ ์ธ์ฐ๋ ค๋ฉด โ์ ํ์ ๋ํ ๊ฐโ์ด ์์ด์ผ ํ ์๋ ์๋ค
3๋จ๊ณ: ์ค์ํ ๋ถ๋ถ์ ๋จผ์ ๊ทธ๋ ค๋ผ
์์คํ ์ ์ฃผ์ํ ๋ถ๋ถ์ ๋ค์ด์ด๊ทธ๋จ์ผ๋ก ๊ทธ๋ ค๋ผ
์์คํ ์ ์ฒ์๋ถํฐ ๋ง์ง๋ง๊น์ง ์ด๋ป๊ฒ ๋์ํ๋์ง ๊ทธ ํ๋ฆ์ ๋ณด์ด์๋ผ
ํ์ฌ ๋จ๊ณ์์ ๊ท๋ชจ ํ์ฅ์ฑ ๋ฌธ์ ๋ฅผ ๋ฌด์ํด๋ ๋๋ค
4๋จ๊ณ: ํต์ฌ ๋ฌธ์ ์ ์ ์ฐพ์ผ๋ผ
๋ง์์์์ ๊ธฐ๋ณธ์ ์ธ ์ค๊ณ๋ฅผ ๋ง์น ๋ค์๋ ๋ฐ์ํ ์ ์๋ ํต์ฌ ๋ฌธ์ ์ ์ง์คํด์ผ ํ๋ค
์ด๋ ๋ถ๋ถ์ด ๋ณ๋ชฉ์ง์ ์ผ๊น? ์ด ์์คํ ์ด ํ์ด์ผ ํ ์ฃผ๋ ๋ฌธ์ ๋ ๋ฌด์์ธ๊ฐ?
5๋จ๊ณ: ํต์ฌ ๋ฌธ์ ์ ์ ํด๊ฒฐํ ์ ์๋๋ก ๋ค์ ์ค๊ณํ๋ผ
ํต์ฌ ๋ฌธ์ ๊ฐ ๋ฌด์์ธ์ง ์์๋๋ค๋ฉด ์ด์ ๋ ๊ทธ์ ๋ง๊ฒ ์ฌ๋ฌ๋ถ์ ์ค๊ณ๋ฅผ ์์ ํด์ผ ํ๋ค
๋ค์ด์ด๊ทธ๋จ์ ๋ฐ๋ ์ค๊ณ์ ๋ง๊ฒ ์์ ํ๋ผ
๋ณธ์ธ์ ์์คํ ์ ์กด์ฌํ๋ ์ด๋ค ์ ์ฝ์ฌํญ๋ ์ด๋ฆฐ ๋ง์์ผ๋ก ๋ฐ์๋ค์ผ ์ ์์ด์ผ ํ๋ค
โญ ๊ท๋ชจ ํ์ฅ์ ์ํ ์๊ณ ๋ฆฌ์ฆ: ๋จ๊ณ๋ณ ์ ๊ทผ๋ฒ
๋จ์ํ ์์คํ ์ ์ฒด๊ฐ ์๋ ์์คํ ์ ํ ๋ถ๋ถ ํน์ ์๊ณ ๋ฆฌ์ฆ์ ์ค๊ณํด ๋ณด๋ผ๋ ์์ฒญ์ ๋ฐ์ ์๋ ์๋๋ฐ, ๋ฐ๋์ ๊ท๋ชจ ํ์ฅ์ฑ์ ์ ๊ฒฝ์จ๋ผ
1๋จ๊ณ: ์ง๋ฌธํ๋ผ
์ด๋ฐ์๋ ๋ฌธ์ ๋ฅผ ์ ๋๋ก ์ดํดํ๋์ง ํ์ธํ๊ธฐ ์ํ ์ง๋ฌธ ์๊ฐ์ด ํ์ํ๋ค
2๋จ๊ณ: ํ์ค์ ์ ์ฝ์ ๋ฌด์ํ๋ผ
๋ฉ๋ชจ๋ฆฌ ์ ์ฝ์ด ์๊ณ , ์ปดํจํฐ ํ ๋์์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๋ค ์ฒ๋ฆฌํ ์ ์๋ค๊ณ ๊ฐ์ ํด๋ณด๋ผ
3๋จ๊ณ: ํ์ค๋ก ๋์์ค๋ผ
์ด๋ค ๋ ผ๋ฆฌ๋ก ๋ฐ์ดํฐ๋ฅผ ๋๋ ๊ฒ์ธ๊ฐ, ํน์ ์ปดํจํฐ๊ฐ ์ด๋ ๋ฐ์ดํฐ ์กฐ๊ฐ์ ์ฌ์ฉํ๋์ง ๋ฑ ์๊ฐํด๋ด๋ผ
4๋จ๊ณ: ๋ฌธ์ ๋ฅผ ํ์ด๋ผ
์ํฉ์ ๋ฐ๋ผ ๋ฌธ์ ์ ์์ฒด๋ฅผ ์์ ํ ํด๊ฒฐํ ์๋ ์๊ณ , ๊ทธ ์์ค์ ์ํ์ํค๋ ๋ฐ ๊ทธ์น ์๋ ์๋ค
์ํ์ ์ ๊ทผ๋ฒ์ด ์ผ๋ฐ์ ์ผ๋ก ์ ์ฉํ๋ค! ์ด๋ค ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ฉด, ๋ ๋ค๋ฅธ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ณ , ๊ทธ ๋ฌธ์ ๋ฅผ ๋ค์ ํด๊ฒฐํด ๋๊ฐ๊ณ ๋ฅผ ๋ฐ๋ณตํ๋ ์์ ์ด๋ค
๋ฌธ์ ๋ฅผ ๋ถ์ํ๊ณ ํ ์ ์๋ ๋ฅ๋ ฅ์ ์ ์ฆํ๋ผ
โญ ์์คํ ์ค๊ณ์ ํต์ฌ ๊ฐ๋
์์คํ ์ค๊ณ ๋ฌธ์ ๊ฐ ๋ฌด์์ ์๊ณ ์๋์ง ํ์ธํ๋ ๋ฌธ์ ๋ ์๋์ง๋ง, ํน์ ๊ฐ๋ ์ ์๊ณ ์์ผ๋ฉด ๋ฌธ์ ๋ฅผ ๋ ์ฝ๊ฒ ํ ์ ์๋ค
์ํ์ (horizontal) vs. ์์ง์ (vertical) ๊ท๋ชจ ํ์ฅ
- ์์ง์ ๊ท๋ชจ ํ์ฅ: ํน์ ๋ ธ๋์ ์์์ ์์ ๋๋ฆฌ๋ ๋ฐฉ๋ฒ
- ์ํ์ ๊ท๋ชจ ํ์ฅ: ๋ ธ๋์ ๊ฐ์๋ฅผ ๋๋ฆฌ๋ ๋ฐฉ๋ฒ
์๋ฒ ๋ถํ ๋ถ์ฐ ์ฅ์น(load balancer)
- ์๋ฒ์ ๊ฑธ๋ฆฌ๋ ๋ถํ๋ฅผ ์ฌ๋ฌ ๋์ ์๋ฒ์ ๊ท ์ผํ๊ฒ ๋ถ์ฐ์ํฌ ์ ์๊ณ ์๋ฒ ํ ๋ ๋๋ฌธ์ ์ ์ฒด ์์คํ ์ด ์ฃฝ๊ฑฐ๋ ๋ค์ด๋๋ ์ํฉ์ ๋ฐฉ์งํ ์ ์๋ค
- ์๋ฒ ์ฌ๋ฌ ๋๊ฐ ๊ทผ๋ณธ์ ์ผ๋ก ๋๊ฐ์ ์ฝ๋์ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๋๋ก ํ๋ ๋คํธ์ํฌ๋ฅผ ๊ตฌํํด๋์ผ ํ๋ค
๋ฐ์ดํฐ๋ฒ ์ด์ค ์ญ์ ๊ทํ(denormalization)์ NoSQL
- SQL ๊ฐ์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์กฐ์ธ ์ฐ์ฐ์ ์์คํ ์ด ์ปค์ง์๋ก ๊ต์ฅํ ๋๋ ค์ง๋ค
- ์ญ์ ๊ทํ๊ฐ ์ด๋ฐ๊ฒ๋ค ์ค ํ๋๋ค
- ์ญ์ ๊ทํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฌ๋ถ์ ์ ๋ณด๋ฅผ ์ถ๊ฐํด์ ์ฝ๊ธฐ ์ฐ์ฐ ์๋๋ฅผ ํฅ์์ํจ ๊ฒ์ ์๋ฏธํ๋ค
- ๋ ํ ์ด๋ธ์ ์กฐ์ธํ๊ธฐ๋ณด๋จ ์ ๋ณด๋ฅผ ์ถ๊ฐ๋ก ์ ์ฅํด ๋ ๋น ๋ฅด๊ฒ ์์ ์ ์ํํ ์ ์๋ค
- NoSQL์ join ์ฐ์ฐ ์์ฒด๊ฐ ์์ด ๊ท๋ชจ ํ์ฅ์ฑ์ด ์ข๋๋ก ์ค๊ณ๋์ด ์๋ค
โญ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ถํ (์ค๋ฉ)
์ค๋ฉ(sharding)์ ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฌ ์ปดํจํฐ์ ๋๋ ์ ์ ์ฅํ๋ ๋์์ ์ด๋ค ๋ฐ์ดํฐ๊ฐ ์ด๋ค ์ปดํจํฐ์ ์ ์ฅ๋์ด ์๋์ง ์ ์ ์๋ ๋ฐฉ์
- ์์ง์ ๋ถํ (vertical partitioning)
- ์๋ฃ์ ํน์ฑ๋ณ๋ก ๋ถํ ํ๋ ๋ฐฉ์
- ํ ๊ฐ์ง ๋จ์ ์ ํน์ ํ ์ด๋ธ์ ํฌ๊ธฐ๊ฐ ์ผ์ ์์ค ์ด์์ด ๋๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ์ฌ๋ถํ ํด์ผ ํ ์๋ ์๋ค
- ํค & ํด์ ๊ธฐ๋ฐ ๋ถํ
- mod(key, n) ์ ๊ฐ์ N๊ฐ์ ์๋ฒ์ ๋ถํ ์ ์ฅํ๋ฉด ๋๋ค
- ํ ๊ฐ์ง ๋ฌธ์ ์ ์ ์๋ฒ์ ๊ฐ์๊ฐ ์ฌ์ค์ ๊ณ ์ ๋์ด ์์ด์ผ ํ๋ค
- ์๋ฒ๋ฅผ ์๋ก ์ถ๊ฐํ ๋ ๋ง๋ค ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๋ค์ ์ฌ๋ถ๋ฐฐํด์ผ ํ๋ค
- ๋๋ ํฐ๋ฆฌ ๊ธฐ๋ฐ ๋ถํ
- ๋ฐ์ดํฐ๋ฅผ ์ฐพ์ ๋ ์ฌ์ฉ๋๋ ์กฐํ ํ ์ด๋ธ(lookup table)์ ์ ์งํ๋ ๋ฐฉ๋ฒ
- ์๋์ ์ผ๋ก ์๋ฒ๋ฅผ ์ถ๊ฐํ๊ธฐ ์ฝ์ง๋ง, ๋๊ฐ์ง ์ฌ๊ฐํ ๋จ์ ์ด ์๋ฐ
- ์กฐํ ํ ์ด๋ธ์ด ๋จ์ผ ์ฅ์ ์ง์ ์ด ๋ ์ ์๋ค
- ์ง์์ ์ผ๋ก ํ ์ด๋ธ์ ์ฝ๋ ํ์๊ฐ ์ ์ฒด ์ฑ๋ฅ์ ์ํฅ์ ๋ฏธ์น ์ ์๋ค
โญ ์บ์ฑ(caching)
- ์ธ๋ฉ๋ชจ๋ฆฌ ์บ์๋ฅผ ์ด์ฉํด ๊ฒฐ๊ณผ๋ฅผ ๋น ๋ฅด๊ฒ ๊ฐ์ ธ์ฌ ์ ์๋ค
- ๋ฉ๋ชจ๋ฆฌ ์บ์๋ key-value ์์ผ๋ก ๊ฐ๋ ๊ฐ๋จํ ๊ตฌ์กฐ์ด๋ค
- ์ผ๋ฐ์ ์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์ , ๋ฐ์ดํฐ ์ ์ฅ์ ์ฌ์ด์ ์๋ฆฌ์ก๊ณ ์๋ค
- ์ ํ๋ฆฌ์ผ์ด์
์ด ์ด๋ค ์๋ฃ๋ฅผ ์์ฒญํ๋ฉด ์บ์๋ฅผ ๋จผ์ ํ์ธํ๋ค
- ์บ์๊ฐ ํด๋น ํค๊ฐ์ ๊ฐ๊ณ ์์ง ์์ผ๋ฉด ๊ทธ๋ ๋ฐ์ดํฐ ์ ์ฅ์๋ฅผ ํ์ธํ๋ค
โญ ๋น๋๊ธฐ์ ์ฒ๋ฆฌ & ํ
- ์ด์์ ์ด๋ผ๋ฉด, ์๋๊ฐ ๋๋ฆฐ ์ฐ์ฐ์ ๋น๋๊ธฐ์(asynchronous)์ผ๋ก ์ฒ๋ฆฌํด์ผ ํ๋ค
- ๊ทธ๋ ์ง ์์ผ๋ฉด ํด๋น ์ฐ์ฐ์ด ๋๋๊ธฐ๊น์ง ํ์ผ์์ด ๊ธฐ๋ค๋ ค์ผ ํ๋ค
- ์ด๋ค ๊ฒฝ์ฐ๋ ์ด ์ฐ์ฐ์ ๋ฏธ๋ฆฌ ํด ๋์ ์๋ ์๋ค
- ์์ ์ด ๋๋๋ฉด ์ฌ์ฉ์์๊ฒ ์์ ์ด ๋๋ฌ๋ค๊ณ ์ง์ ์๋ ค ์ฃผ๊ธฐ๋ ํ๋ค
โญ ๋คํธ์ํฌ ์ฑ๋ฅ ์ฒ๋
- ๋์ญํญ(handwidth)
- ๋จ์ ์๊ฐ์ ์ ์กํ ์ ์๋ ๋ฐ์ดํฐ์ ์ต๋์น
- ์ฒ๋ฆฌ๋(throughput)
- ๋จ์ ์๊ฐ์ ์ค์ ๋ก ์ ์ก๋ ๋ฐ์ดํฐ์ ์
- ์ง์ฐ ์๋(latency)
- ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ
โญ MapReduce
- ๊ต์ฅํ ์ปค๋ค๋ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋๋ฐ ์ฌ์ฉ๋๋ค
- Map์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฅ์ผ๋ก ๋ฐ์ ๋ค <key, value> ์์ ๋ฐํํ๋ค
- Reduce ๋ key์ ๊ด๋ จ value ๋ฅผ ์ ๋ ฅ์ผ๋ก ๋ฐ์ ์ฒ๋ฆฌ ๊ณผ์ ์ ๊ฑฐ์ณ ์๋ก์ด ํค๊ฐ์ ๋ฐํํ๋ค
- ๊ท๋ชจ ํ์ฅ์ด ์์์ง๋ค
โญ ์์คํ ์ค๊ณ ์ ๊ณ ๋ คํ ์
- ์คํจ: ์คํจ์ ๋ํ ๋๋น์ฑ ์ด ํ์ํ๋ค
- ๊ฐ์ฉ์ฑ: ์ฌ์ฉ ๊ฐ๋ฅํ ์์คํ ์ ์๊ฐ์ ๋ฐฑ๋ถ์จ๋ก ๋ํ๋ธ ๊ฒ
- ์ ๋ขฐ์ฑ: ํน์ ๋จ์ ์๊ฐ์ ์์คํ ์ด ์ฌ์ฉ ๊ฐ๋ฅํ ํ๋ฅ ๋ก ๋ํ๋ธ ๊ฒ
- ์ฝ๊ธฐ ์ค์ฌ vs ์ฐ๊ธฐ ์ค์ฌ: ์ฐ๋ ์ฐ์ฐ์ด ๋ง๋ค๋ฉด ํ, ์ฝ๋ ์ฐ์ฐ์ด ๋ง๋ค๋ฉด ์บ์
- ๋ณด์: ๋ณด์ ์ํ์ ์์คํ ์ ์์ฒญ๋ ํด๋ฅผ ๊ฐํ๋ค (์ค๊ณํด๋ผ)
โญ ์๋ฒฝํ ์์คํ ์ ์๋ค
- ์๋ฒฝํ๊ฒ ๋์ํ๋ ์์คํ ์ค๊ณ๋ ์กด์ฌํ์ง ์๋๋ค
- ๋์ฐํ ์์คํ ์ ๋งค์ฐ ๋ง๋ค
- ์ฌ๋ก๋ฅผ ์ ์ดํดํ๊ณ , ๋ฌธ์ ์ ๋ฒ์๋ฅผ ์ค์ ํ๊ณ , ํฉ๋ฆฌ์ ์ธ ๊ฐ์ ์ ์ธ์ด ๋ค, ๋ช ํํ๊ฒ ์ค๊ณํ ์์คํ ์ ๋ง๋ค๋ผ