Ver3.0 ๐ ๋ถ์ฐ ์์คํ ์์ CAP ์ ๋ฆฌ์ ๋ฐ์ดํฐ ์ผ๊ด์ฑ ์ ๋ต: ์๋ฒฝ ๊ฐ์ด๋

๐ ๋ถ์ฐ ์์คํ ์์ CAP ์ ๋ฆฌ์ ๋ฐ์ดํฐ ์ผ๊ด์ฑ ์ ๋ต: ์๋ฒฝ ๊ฐ์ด๋
ํ๋ ์๋ฒ ์ํคํ ์ฒ์ ํต์ฌ, CAP ์ด๋ก ๋ถํฐ ์ค์ ์ ๋ต๊น์ง ์น๊ตฌ์ฒ๋ผ ์ฝ๊ฒ ํ์ด๋๋ฆฝ๋๋ค! ๐
๐ฏ ์ CAP ์ ๋ฆฌ๋ฅผ ์์์ผ ํ ๊น?
์๋
! ์ค๋์ ๋ถ์ฐ ์์คํ
์ ๋ค๋ฃจ๋ ๊ฐ๋ฐ์๋ผ๋ฉด ๋ฐ๋์ ์์์ผ ํ CAP ์ ๋ฆฌ์ ๋ํด ์ด์ผ๊ธฐํด๋ณผ๊ฒ. ํน์ ์๋น์ค๋ฅผ ์ด์ํ๋ค๊ฐ "๋ฐ์ดํฐ๋ฒ ์ด์ค ์๋ฒ ํ๋๊ฐ ์ฃฝ์๋๋ฐ ์ ์ฒด ์๋น์ค๊ฐ ๋ฉ์ถฐ๋ฒ๋ ธ์ด!" ๊ฐ์ ์ํฉ์ ๊ฒช์ด๋ณธ ์ ์์ด? ์๋๋ฉด "์ฌ์ฉ์๊ฐ ๋ฐฉ๊ธ ์ ์ฅํ ๋ฐ์ดํฐ๊ฐ ๋ค๋ฅธ ์๋ฒ์์๋ ์ ๋ณด์ฌ์!"๋ผ๋ ๋ฒ๊ทธ ๋ฆฌํฌํธ๋ฅผ ๋ฐ์๋ณธ ์ ์? ๐ฑ
์ด๋ฐ ๋ฌธ์ ๋ค์ด ๋ฐ๋ก ๋ถ์ฐ ์์คํ
์ ๋ณธ์ง์ ์ธ ๋๋ ๋ง์์ ๋์ค๋ ๊ฑฐ์ผ. ๊ทธ๋ฆฌ๊ณ ์ด ๋๋ ๋ง๋ฅผ ๋ช
ํํ๊ฒ ์ ๋ฆฌํ ๊ฒ ๋ฐ๋ก CAP ์ ๋ฆฌ๋ผ๋ ๊ฑฐ์ง. 2000๋
์ ์๋ฆญ ๋ธ๋ฃจ์ด(Eric Brewer) ๊ต์๊ฐ ์ ์ํ๊ณ , 2002๋
์ ์ธ์ค ๊ธธ๋ฒํธ(Seth Gilbert)์ ๋ธ์ ๋ฆฐ์น(Nancy Lynch)๊ฐ ์ํ์ ์ผ๋ก ์ฆ๋ช
ํ ์ด ์ด๋ก ์ ์ง๊ธ๋ ๋ถ์ฐ ์์คํ
์ค๊ณ์ ๊ธฐ๋ณธ ์์น์ผ๋ก ์๋ฆฌ์ก๊ณ ์์ด.
์ฌ๋ฅ๋ท ๊ฐ์ ํ๋ซํผ์์๋ ์๋ง์ ์ฌ์ฉ์๊ฐ ๋์์ ์ฌ๋ฅ์ ๋ฑ๋กํ๊ณ , ๊ฑฐ๋ํ๊ณ , ๋ฆฌ๋ทฐ๋ฅผ ๋จ๊ธฐ์์? ์ด๋ฐ ์๋น์ค๋ฅผ ์์ ์ ์ผ๋ก ์ด์ํ๋ ค๋ฉด CAP ์ ๋ฆฌ๋ฅผ ์ดํดํ๊ณ ์ ์ ํ ์ ๋ต์ ์ ํํ๋ ๊ฒ ์ ๋ง ์ค์ํด! ๐ช
๐ CAP ์ ๋ฆฌ์ ์ธ ๊ฐ์ง ์์ ์์ ์ ๋ณต
1๏ธโฃ Consistency (์ผ๊ด์ฑ) - ๋ชจ๋ ๋ ธ๋๊ฐ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ณธ๋ค
์ผ๊ด์ฑ์ ๋ชจ๋ ํด๋ผ์ด์ธํธ๊ฐ ๋์์ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ ๊ฒ์ ์๋ฏธํด. ์ฝ๊ฒ ๋งํ๋ฉด, ์์ธ์ ์๋ ์๋ฒ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ์ ๋ ๋ถ์ฐ์ ์๋ ์๋ฒ์์๋ ์ฆ์ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ณผ ์ ์์ด์ผ ํ๋ค๋ ๊ฑฐ์ง.
์๋ฅผ ๋ค์ด๋ณผ๊ฒ. ๋ค๊ฐ ์ํ ์ฑ์์ ๊ณ์ข ์์ก์ ํ์ธํ๋ค๊ณ ์๊ฐํด๋ด. ์์ธ ๋ฐ์ดํฐ์ผํฐ์์ 10๋ง์์ ์ถ๊ธํ๋๋ฐ, ๋ถ์ฐ ๋ฐ์ดํฐ์ผํฐ์์๋ ์์ง๋ ์ถ๊ธ ์ ์์ก์ด ๋ณด์ธ๋ค๋ฉด? ์ด๊ฑด ํฐ ๋ฌธ์ ์ผ! ๐จ ์ด๋ฐ ์ํฉ์ ๋ฐฉ์งํ๋ ๊ฒ ๋ฐ๋ก ์ผ๊ด์ฑ์ด์ผ.
์ผ๊ด์ฑ์ ํต์ฌ ํน์ง:
โข ๋ชจ๋ ์ฝ๊ธฐ ์์ฒญ์ ๊ฐ์ฅ ์ต๊ทผ์ ์ฐ์ฌ์ง ๋ฐ์ดํฐ๋ฅผ ๋ฐํํด์ผ ํจ
โข ๋ฐ์ดํฐ ์
๋ฐ์ดํธ๊ฐ ๋ชจ๋ ๋
ธ๋์ ์ ํ๋ ๋๊น์ง ์ฝ๊ธฐ ์์ฒญ์ ์ฐจ๋จํ ์ ์์
โข ํธ๋์ญ์
์ ACID ์์ฑ๊ณผ ๋ฐ์ ํ ๊ด๋ จ์ด ์์
โข ๋ถ์ฐ ํ๊ฒฝ์์ ๊ตฌํํ๊ธฐ ๊ฐ์ฅ ์ด๋ ค์ด ์์ฑ ์ค ํ๋
MySQL์ด๋ PostgreSQL ๊ฐ์ ์ ํต์ ์ธ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ๊ฐํ ์ผ๊ด์ฑ์ ๋ณด์ฅํด. ๋ง์คํฐ-์ฌ๋ ์ด๋ธ ๋ณต์ ๊ตฌ์กฐ์์ ๋ง์คํฐ์ ์ฐ๊ธฐ๊ฐ ๋ฐ์ํ๋ฉด, ๋ชจ๋ ์ฌ๋ ์ด๋ธ์ ๋ณต์ ๊ฐ ์๋ฃ๋ ๋๊น์ง ์ฝ๊ธฐ ์์ฒญ์ ๋ง์คํฐ๋ก ๋ผ์ฐํ ํ๊ฑฐ๋ ๋๊ธฐ์ํค๋ ๋ฐฉ์์ด์ง. ์ด๋ ๊ฒ ํ๋ฉด ์ฌ์ฉ์๋ ํญ์ ์ต์ ๋ฐ์ดํฐ๋ฅผ ๋ณด๊ฒ ๋ผ!
2๏ธโฃ Availability (๊ฐ์ฉ์ฑ) - ์ธ์ ๋ ์๋ตํ๋ค
๊ฐ์ฉ์ฑ์ ๋ชจ๋ ์์ฒญ์ด ํญ์ ์๋ต์ ๋ฐ๋ ๊ฒ์ ์๋ฏธํด. ์ผ๋ถ ๋
ธ๋๊ฐ ์ฃฝ์ด๋, ๋คํธ์ํฌ๊ฐ ๋ถ์์ ํด๋, ์์คํ
์ ๊ณ์ ์๋ํด์ผ ํ๋ค๋ ๊ฑฐ์ผ. ๋ฌผ๋ก ์๋ต์ด ์ต์ ๋ฐ์ดํฐ๊ฐ ์๋ ์๋ ์์ง๋ง, ์ ์ด๋ ์๋ต์ ๋ฐ์ ์ ์์ด์ผ ํด! ๐ฏ
์๊ฐํด๋ด. ๋ทํ๋ฆญ์ค์์ ์ํ๋ฅผ ๋ณด๋ค๊ฐ ๊ฐ์๊ธฐ "์๋ฒ ์ ๊ฒ ์ค์
๋๋ค"๋ผ๋ ๋ฉ์์ง๊ฐ ๋จ๋ฉด ์ผ๋ง๋ ์ง์ฆ๋ ๊น? ๊ฐ์ฉ์ฑ์ด ๋์ ์์คํ
์ ์ด๋ฐ ์ํฉ์ ์ต์ํํ๋ ค๊ณ ๋
ธ๋ ฅํด. ์ผ๋ถ ์๋ฒ์ ๋ฌธ์ ๊ฐ ์๊ฒจ๋ ๋ค๋ฅธ ์๋ฒ๊ฐ ๋์ ์๋ตํ๋ ๊ฑฐ์ง.
๊ฐ์ฉ์ฑ์ ํต์ฌ ํน์ง:
โข ๋ชจ๋ ์์ฒญ์ ์คํจํ์ง ์์ ๋
ธ๋๋ก๋ถํฐ ์๋ต์ ๋ฐ์์ผ ํจ
โข ์๋ต ์๊ฐ์ ๋ํ ๋ณด์ฅ์ ์์ง๋ง, ๊ฒฐ๊ตญ ์๋ต์ ๋ฐ์
โข ๋ถ๋ถ์ ์ธ ์ฅ์ ๊ฐ ์ ์ฒด ์์คํ
๋ค์ด์ผ๋ก ์ด์ด์ง์ง ์์
โข ์ฌ์ฉ์ ๊ฒฝํ(UX) ์ธก๋ฉด์์ ๋งค์ฐ ์ค์ํ ์์
๋๊ท๋ชจ ์จ๋ผ์ธ ๊ฒ์๋ค์ ๊ฐ์ฉ์ฑ์ ๊ทน๋ํํ๊ธฐ ์ํด ์ฌ๋ฌ ๋ฆฌ์ ์ ์๋ฒ๋ฅผ ๋ถ์ฐ์์ผ. ํ๊ตญ ์๋ฒ์ ๋ฌธ์ ๊ฐ ์๊ธฐ๋ฉด ์๋์ผ๋ก ์ผ๋ณธ ์๋ฒ๋ก ์ฐ๊ฒฐ๋๋ ์์ด์ง. ์ฝ๊ฐ์ ๋ (lag)์ด ๋ฐ์ํ ์ ์์ง๋ง, ๊ฒ์์ ๊ณ์ํ ์ ์๋ค๋ ๊ฒ ์ค์ํด! ์ด๊ฒ ๋ฐ๋ก ๊ฐ์ฉ์ฑ์ ์ฐ์ ์ํ๋ ์ค๊ณ์ผ.
3๏ธโฃ Partition Tolerance (๋ถํ ๋ด์ฑ) - ๋คํธ์ํฌ ์ฅ์ ๋ฅผ ๊ฒฌ๋๋ค
๋ถํ ๋ด์ฑ์ ๋คํธ์ํฌ๊ฐ ๋ถํ ๋์ด๋ ์์คํ
์ด ๊ณ์ ์๋ํ๋ ๊ฒ์ ์๋ฏธํด. ์ฌ๊ธฐ์ '๋ถํ '์ด๋ ๋คํธ์ํฌ ์ฅ์ ๋ก ์ธํด ๋
ธ๋๋ค ๊ฐ์ ํต์ ์ด ๋์ด์ง๋ ์ํฉ์ ๋งํด. ๐
ํ์ค์ ์ผ๋ก ๋ถ์ฐ ์์คํ
์์ ๋คํธ์ํฌ ๋ถํ ์ ์ธ์ ๋ ๋ฐ์ํ ์ ์์ด. ๊ด์ผ์ด๋ธ์ด ๋์ด์ง๊ฑฐ๋, ๋ผ์ฐํฐ๊ฐ ๊ณ ์ฅ๋๊ฑฐ๋, ์ฌ์ง์ด ๋๊ตฐ๊ฐ ์ค์๋ก ๋คํธ์ํฌ ์ผ์ด๋ธ์ ๋ฝ์ ์๋ ์์ง! ์ด๋ฐ ์ํฉ์์๋ ์์คํ
์ด ๋ฉ์ถ์ง ์๊ณ ์๋ํด์ผ ํ๋ค๋ ๊ฒ ๋ถํ ๋ด์ฑ์ด์ผ.
๋ถํ ๋ด์ฑ์ ํต์ฌ ํน์ง:
โข ๋
ธ๋ ๊ฐ ํต์ ์คํจ๊ฐ ๋ฐ์ํด๋ ์์คํ
์ ๊ณ์ ์๋
โข ๋คํธ์ํฌ ํํฐ์
์ํฉ์์ ๊ฐ ํํฐ์
์ ๋
๋ฆฝ์ ์ผ๋ก ๋์ ๊ฐ๋ฅ
โข ๋ถ์ฐ ์์คํ
์์๋ ์ฌ์ค์ ํ์์ ์ธ ์์
โข ํํฐ์
์ด ๋ณต๊ตฌ๋๋ฉด ๋ฐ์ดํฐ ๋๊ธฐํ ๋ฉ์ปค๋์ฆ์ด ํ์
๋ง์ ์ ๋ฌธ๊ฐ๋ค์ด ์ง์ ํ๋ฏ์ด, ํ๋ ๋ถ์ฐ ์์คํ ์์ ๋คํธ์ํฌ ๋ถํ ์ '๋ฐ์ํ ์ ์๋' ๊ฒ ์๋๋ผ '๋ฐ๋์ ๋ฐ์ํ๋' ๋ฌธ์ ์ผ. ๋ฐ๋ผ์ ์ค์ ๋ก๋ CAP ์ค์์ P๋ฅผ ํฌ๊ธฐํ ์ ์์ด. ๊ฒฐ๊ตญ ์ฐ๋ฆฌ๋ C์ A ์ค์์ ์ ํํด์ผ ํ๋ ๊ฑฐ์ง!
โ๏ธ CAP ์ ๋ฆฌ์ ํธ๋ ์ด๋์คํ: ๋ฌด์์ ์ ํํ ๊ฒ์ธ๊ฐ?
์, ์ด์ ํต์ฌ์ผ๋ก ๋ค์ด๊ฐ๋ณด์. CAP ์ ๋ฆฌ๊ฐ ๋งํ๋ ๊ฑด ๊ฐ๋จํด: ์ธ ๊ฐ์ง ์์ฑ ์ค ๋์์ ๋ ๊ฐ์ง๋ง ๋ง์กฑ์ํฌ ์ ์๋ค๋ ๊ฑฐ์ผ. ์๋ฒฝํ ์์คํ
์ ์์ด. ํญ์ ํธ๋ ์ด๋์คํ๊ฐ ์กด์ฌํ์ง! ๐ค
๊ทธ๋ฐ๋ฐ ์ฌ๊ธฐ์ ์ค์ํ ํฌ์ธํธ๊ฐ ์์ด. ์์ ๋งํ๋ฏ์ด ๋ถ์ฐ ์์คํ
์์ ๋คํธ์ํฌ ๋ถํ (P)์ ํผํ ์ ์๋ ํ์ค์ด์ผ. ๊ทธ๋์ ์ค์ ๋ก๋ CP ์์คํ
๊ณผ AP ์์คํ
์ค์์ ์ ํํ๊ฒ ๋ผ. CA ์์คํ
์ ์ด๋ก ์ ์ผ๋ก๋ง ์กด์ฌํ๊ณ , ์ค์ ๋ถ์ฐ ํ๊ฒฝ์์๋ ๊ตฌํ์ด ๋ถ๊ฐ๋ฅํด.
๐ CP ์์คํ : ์ผ๊ด์ฑ์ ์ ํํ๋ค
CP ์์คํ
์ ์ผ๊ด์ฑ๊ณผ ๋ถํ ๋ด์ฑ์ ๋ณด์ฅํ๋, ๊ฐ์ฉ์ฑ์ ํฌ์ํ๋ ์ ํ์ด์ผ. ๋คํธ์ํฌ ๋ถํ ์ด ๋ฐ์ํ๋ฉด ์ผ๋ถ ๋
ธ๋๋ ์๋ต์ ๊ฑฐ๋ถํ๊ฑฐ๋ ํ์์์๋ ์ ์์ด. ํ์ง๋ง ์๋ต์ ๋ฐ๋๋ค๋ฉด, ๊ทธ ๋ฐ์ดํฐ๋ 100% ์ ํํด! ๐ฏ
CP ์์คํ
์ด ์ ํฉํ ๊ฒฝ์ฐ:
โข ๊ธ์ต ๊ฑฐ๋ ์์คํ
(์๋ชป๋ ์์ก ์ ๋ณด๋ ์น๋ช
์ !)
โข ์ฌ๊ณ ๊ด๋ฆฌ ์์คํ
(์ค๋ณต ํ๋งค ๋ฐฉ์ง๊ฐ ์ค์)
โข ์๋ฃ ๊ธฐ๋ก ์์คํ
(ํ์ ์ ๋ณด์ ์ ํ์ฑ์ด ์๋ช
๊ณผ ์ง๊ฒฐ)
โข ์์ฝ ์์คํ
(๋๋ธ ๋ถํน์ ์ ๋ ํ์ฉํ ์ ์์)
๋ํ์ ์ธ CP ์์คํ
:
โข MongoDB (๊ฐํ ์ผ๊ด์ฑ ๋ชจ๋)
โข HBase
โข Redis (ํด๋ฌ์คํฐ ๋ชจ๋)
โข Zookeeper
โข Consul
์ํ ์์คํ ์ ์๊ฐํด๋ด. ๋ค๊ฐ ATM์์ ๋์ ์ธ์ถํ๋ ค๋๋ฐ, ๋คํธ์ํฌ ๋ฌธ์ ๋ก ์ค์ ์๋ฒ์ ํต์ ์ด ์ ๋๋ค๋ฉด? CP ์์คํ ์ "์ฃ์กํฉ๋๋ค. ํ์ฌ ์๋น์ค๋ฅผ ์ด์ฉํ ์ ์์ต๋๋ค"๋ผ๊ณ ์๋ตํด. ๋ถํธํ์ง๋ง, ์์ก์ด ๋ถ์กฑํ๋ฐ ๋์ด ๋๊ฐ๊ฑฐ๋, ์ด์ค ์ถ๊ธ๋๋ ๊ฒ๋ณด๋ค๋ ํจ์ฌ ์์ ํ์ง!
์ด๊ฒ ๋ฐ๋ก ๊ฐ์ฉ์ฑ์ ํฌ์ํ๊ณ ์ผ๊ด์ฑ์ ์ ํํ ๊ฑฐ์ผ. ์ฌ์ฉ์๋ ์ ์ ๊ธฐ๋ค๋ ค์ผ ํ์ง๋ง, ๋ฐ์ดํฐ์ ์ ํ์ฑ์ ๋ณด์ฅ๋๋ ๊ฑฐ์ง.
๐ AP ์์คํ : ๊ฐ์ฉ์ฑ์ ์ ํํ๋ค
AP ์์คํ
์ ๊ฐ์ฉ์ฑ๊ณผ ๋ถํ ๋ด์ฑ์ ๋ณด์ฅํ๋, ์ผ๊ด์ฑ์ ํฌ์ํ๋ ์ ํ์ด์ผ. ๋คํธ์ํฌ ๋ถํ ์ด ๋ฐ์ํด๋ ๋ชจ๋ ๋
ธ๋๋ ๊ณ์ ์๋ตํด. ๋ค๋ง, ๊ฐ ๋
ธ๋๊ฐ ๊ฐ์ง ๋ฐ์ดํฐ๊ฐ ์ผ์์ ์ผ๋ก ๋ค๋ฅผ ์ ์์ด. ์ด๋ฅผ '์ต์ข
์ผ๊ด์ฑ(Eventual Consistency)'์ด๋ผ๊ณ ๋ถ๋ฅด์ง! ๐
AP ์์คํ
์ด ์ ํฉํ ๊ฒฝ์ฐ:
โข ์์
๋ฏธ๋์ด (์ข์์ ์๊ฐ ์ฝ๊ฐ ๋ค๋ฅด๊ฒ ๋ณด์ฌ๋ ๊ด์ฐฎ์)
โข ์ฝํ
์ธ ์ ์ก ๋คํธ์ํฌ(CDN)
โข ์ผํ๋ชฐ์ ์ํ ์กฐํ (์ค์๊ฐ ์ฌ๊ณ ๊ฐ ์๋์ด๋ ๋จ)
โข ๋ก๊ทธ ์์ง ์์คํ
โข ์บ์ฑ ์์คํ
๋ํ์ ์ธ AP ์์คํ
:
โข Cassandra
โข DynamoDB
โข Riak
โข CouchDB
โข Voldemort
์ธ์คํ๊ทธ๋จ์์ ์น๊ตฌ๊ฐ ์ฌ์ง์ ์ฌ๋ ธ๋ค๊ณ ์๊ฐํด๋ด. ๋๋ ์ข์์๋ฅผ ๋๋ ๋๋ฐ, ์น๊ตฌ๊ฐ ์๊ธฐ ํ๋ฉด์์ ๋ณด๋ ์์ง ์ข์์๊ฐ ์ ๋ณด์ผ ์ ์์ด. ๋ช ์ด ํ์ ์๋ก๊ณ ์นจํ๋ฉด ๋ณด์ด๊ฒ ์ง? ์ด๊ฒ ๋ฐ๋ก AP ์์คํ ์ด์ผ!
์๋น์ค๋ ํญ์ ๋น ๋ฅด๊ฒ ์๋ตํ์ง๋ง(๊ฐ์ฉ์ฑ), ๋ฐ์ดํฐ๊ฐ ๋ชจ๋ ์๋ฒ์ ์ฆ์ ๋๊ธฐํ๋์ง๋ ์์(์ผ๊ด์ฑ ํฌ์). ํ์ง๋ง ์์ ๋ฏธ๋์ด์์๋ ์ด ์ ๋ ์ง์ฐ์ ํฐ ๋ฌธ์ ๊ฐ ์๋์ง. ์ฌ์ฉ์ ๊ฒฝํ์ด ๋ ์ค์ํ๋๊น!
๐๏ธ CA ์์คํ : ์ด๋ก ์์ผ๋ก๋ง ์กด์ฌ
CA ์์คํ
์ ์ผ๊ด์ฑ๊ณผ ๊ฐ์ฉ์ฑ์ ๋ชจ๋ ๋ณด์ฅํ์ง๋ง, ๋ถํ ๋ด์ฑ์ ํฌ๊ธฐํ ์์คํ
์ด์ผ. ํ์ง๋ง ์์ ๋งํ๋ฏ์ด, ๋ถ์ฐ ์์คํ
์์ ๋คํธ์ํฌ ๋ถํ ์ ํผํ ์ ์๋ ํ์ค์ด์ผ. ๋ฐ๋ผ์ CA ์์คํ
์ ๋จ์ผ ๋
ธ๋ ์์คํ
์ด๊ฑฐ๋, ์๋ฒฝํ ๋คํธ์ํฌ๋ฅผ ๊ฐ์ ํ ์ด๋ก ์ ์์คํ
์์๋ง ๊ฐ๋ฅํด.
์ ํต์ ์ธ ๋จ์ผ ์๋ฒ RDBMS๊ฐ ์ฌ๊ธฐ์ ํด๋นํด. ๋คํธ์ํฌ ๋ถํ ์ด ์์ผ๋๊น ์ผ๊ด์ฑ๊ณผ ๊ฐ์ฉ์ฑ์ ๋ชจ๋ ์ ๊ณตํ ์ ์์ง. ํ์ง๋ง ์๋ฒ๊ฐ ์ฃฝ์ผ๋ฉด? ์ ์ฒด ์์คํ
์ด ๋ค์ด๋๋ ๊ฑฐ์ผ. ๊ทธ๋์ ํ๋์ ๋๊ท๋ชจ ์๋น์ค์์๋ CA ์์คํ
์ ์ ํํ๊ธฐ ์ด๋ ค์. ๐ซ
๐จ ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ์คํํธ๋ผ
์, ์ฌ๊ธฐ์ ์ค์ํ ๊ฑธ ํ๋ ๋ ์๋ ค์ค๊ฒ. ์ผ๊ด์ฑ์ด๋ผ๋ ๊ฒ ์ฌ์ค 0 ์๋๋ฉด 1์ ์ด๋ถ๋ฒ์ ๊ฐ๋ ์ด ์๋์ผ. ์์ ํ ์ผ๊ด์ฑ๊ณผ ์์ ํ ๋น์ผ๊ด์ฑ ์ฌ์ด์๋ ๋ค์ํ ๋ ๋ฒจ์ด ์กด์ฌํด! ์ด๊ฑธ ์ดํดํ๋ฉด ํจ์ฌ ์ ์ฐํ ์์คํ ์ค๊ณ๊ฐ ๊ฐ๋ฅํ์ง. ๐ฏ
๐ช ๊ฐํ ์ผ๊ด์ฑ (Strong Consistency)
๊ฐํ ์ผ๊ด์ฑ์ CAP์ C์ ํด๋นํ๋ ๊ฐ๋
์ด์ผ. ๋ชจ๋ ์ฝ๊ธฐ ์์ฒญ์ด ๊ฐ์ฅ ์ต๊ทผ์ ์ฐ๊ธฐ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ ๊ฑฐ์ง. ๋ฐ์ดํฐ๋ฅผ ์ด ์ฆ์, ๋ชจ๋ ํด๋ผ์ด์ธํธ๊ฐ ๊ทธ ๋ฐ์ดํฐ๋ฅผ ๋ณผ ์ ์์ด.
๊ตฌํ ๋ฐฉ๋ฒ:
โข 2๋จ๊ณ ์ปค๋ฐ(Two-Phase Commit, 2PC)
โข Paxos ์๊ณ ๋ฆฌ์ฆ
โข Raft ์๊ณ ๋ฆฌ์ฆ
โข ๋๊ธฐ์ ๋ณต์ (Synchronous Replication)
์ฅ์ :
โข ๋ฐ์ดํฐ ์ ํ์ฑ ๋ณด์ฅ
โข ํ๋ก๊ทธ๋๋ฐ ๋ชจ๋ธ์ด ๋จ์ํจ
โข ๋ฒ๊ทธ ๋ฐ์ ๊ฐ๋ฅ์ฑ ๋ฎ์
๋จ์ :
โข ์ฑ๋ฅ ์ค๋ฒํค๋๊ฐ ํผ
โข ๋คํธ์ํฌ ์ง์ฐ์ ๋ฏผ๊ฐ
โข ๊ฐ์ฉ์ฑ์ด ๋ฎ์์ง ์ ์์
2๋จ๊ณ ์ปค๋ฐ์ ๋ถ์ฐ ํธ๋์ญ์ ์์ ๊ฐํ ์ผ๊ด์ฑ์ ๋ณด์ฅํ๋ ๋ํ์ ์ธ ๋ฐฉ๋ฒ์ด์ผ:
1๋จ๊ณ (Prepare):
์ฝ๋๋ค์ดํฐ๊ฐ ๋ชจ๋ ์ฐธ์ฌ์์๊ฒ "์ปค๋ฐ ์ค๋น๋์ด?"๋ผ๊ณ ๋ฌผ์ด๋ด. ๊ฐ ์ฐธ์ฌ์๋ ํธ๋์ญ์ ์ ์คํํ๊ณ ๋ก๊ทธ์ ๊ธฐ๋กํ ๋ค "์ค๋น ์๋ฃ!" ๋๋ "์คํจ!"๋ผ๊ณ ์๋ตํด.
2๋จ๊ณ (Commit):
๋ชจ๋ ์ฐธ์ฌ์๊ฐ "์ค๋น ์๋ฃ!"๋ผ๊ณ ํ๋ฉด ์ฝ๋๋ค์ดํฐ๋ "์ปค๋ฐํด!"๋ผ๊ณ ๋ช ๋ นํด. ํ๋๋ผ๋ ์คํจํ๋ฉด "๋กค๋ฐฑํด!"๋ผ๊ณ ๋ช ๋ นํ์ง.
์ด ๋ฐฉ์์ ํ์คํ์ง๋ง, ์ฝ๋๋ค์ดํฐ๊ฐ ์ฃฝ์ผ๋ฉด ๋ชจ๋ ์ฐธ์ฌ์๊ฐ ๋ธ๋กํน๋๋ ๋ฌธ์ ๊ฐ ์์ด. ๊ทธ๋์ 3๋จ๊ณ ์ปค๋ฐ์ด๋ Paxos ๊ฐ์ ๊ฐ์ ๋ ์๊ณ ๋ฆฌ์ฆ๋ค์ด ๋์จ ๊ฑฐ์ผ!
๐ ์ต์ข ์ผ๊ด์ฑ (Eventual Consistency)
์ต์ข
์ผ๊ด์ฑ์ ์ผ์ ์๊ฐ์ด ์ง๋๋ฉด ๋ชจ๋ ๋
ธ๋๊ฐ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ฒ ๋๋ ๊ฒ์ ๋ณด์ฅํด. ์ฆ์๋ ์๋์ง๋ง, ๊ฒฐ๊ตญ์๋ ์ผ๊ด์ฑ์ด ๋ฌ์ฑ๋๋ ๊ฑฐ์ง! ์ด๊ฒ ๋ฐ๋ก AP ์์คํ
์ ํต์ฌ ๊ฐ๋
์ด์ผ. โฐ
ํน์ง:
โข ์ฐ๊ธฐ ์์
์ด ์ฆ์ ๋ชจ๋ ๋
ธ๋์ ๋ฐ์๋์ง ์์
โข ์ฝ๊ธฐ ์์ฒญ์ ํญ์ ์๋ต์ ๋ฐ์ง๋ง, ์ต์ ๋ฐ์ดํฐ๊ฐ ์๋ ์ ์์
โข ์ถฉ๋ ํด๊ฒฐ ๋ฉ์ปค๋์ฆ์ด ํ์
โข ๋์ ๊ฐ์ฉ์ฑ๊ณผ ์ฑ๋ฅ์ ์ ๊ณต
๊ตฌํ ์ ๋ต:
โข ๋น๋๊ธฐ ๋ณต์ (Asynchronous Replication)
โข Gossip ํ๋กํ ์ฝ
โข Vector Clock
โข CRDT (Conflict-free Replicated Data Types)
์ด๋ฉ์ผ์ ์๊ฐํด๋ด. ๋ค๊ฐ ์ด๋ฉ์ผ์ ๋ณด๋ด๋ฉด ์๋๋ฐฉ์ด ์ฆ์ ๋ฐ์ง ๋ชปํ ์๋ ์์ด. ๋คํธ์ํฌ ์ํฉ์ ๋ฐ๋ผ ๋ช ์ด์์ ๋ช ๋ถ์ด ๊ฑธ๋ฆด ์ ์์ง. ํ์ง๋ง ๊ฒฐ๊ตญ์๋ ๋์ฐฉํด! ์ด๊ฒ ๋ฐ๋ก ์ต์ข ์ผ๊ด์ฑ์ด์ผ.
๋ง์ฝ ์ด๋ฉ์ผ ์์คํ ์ด ๊ฐํ ์ผ๊ด์ฑ์ ์๊ตฌํ๋ค๋ฉด? ์๋๋ฐฉ์ ๋ฉ์ผ ์๋ฒ๊ฐ ๋ค์ด๋์ด ์์ผ๋ฉด ๋ค ์ด๋ฉ์ผ ์ ์ก์ด ์คํจํ๊ฑฐ๋ ๋ฌดํ์ ๋๊ธฐํด์ผ ํ ๊ฑฐ์ผ. ํ์ง๋ง ์ต์ข ์ผ๊ด์ฑ ๋๋ถ์ ์ผ๋จ ์ ์ก์ ์ฑ๊ณตํ๊ณ , ๋์ค์ ๋ฐฐ๋ฌ๋๋ ๊ฑฐ์ง!
๐๏ธ ์ธ๊ณผ์ ์ผ๊ด์ฑ (Causal Consistency)
์ธ๊ณผ์ ์ผ๊ด์ฑ์ ๊ฐํ ์ผ๊ด์ฑ๊ณผ ์ต์ข
์ผ๊ด์ฑ์ ์ค๊ฐ ์ง์ ์ด์ผ. ์ธ๊ณผ ๊ด๊ณ๊ฐ ์๋ ์์
๋ค์ ์์๊ฐ ๋ณด์ฅ๋์ง๋ง, ์ธ๊ณผ ๊ด๊ณ๊ฐ ์๋ ์์
๋ค์ ์์๊ฐ ๋ณด์ฅ๋์ง ์์.
์๋ฅผ ๋ค์ด๋ณผ๊ฒ:
โข A๊ฐ ๊ฒ์๊ธ์ ์์ฑํจ โ B๊ฐ ๊ทธ ๊ฒ์๊ธ์ ๋๊ธ์ ๋ฌ์
์ด ๊ฒฝ์ฐ ๋๊ธ์ ๋ฐ๋์ ๊ฒ์๊ธ ์ดํ์ ๋ณด์ฌ์ผ ํด. ์ด๊ฒ ์ธ๊ณผ ๊ด๊ณ์ผ!
ํ์ง๋ง:
โข A๊ฐ ๊ฒ์๊ธ์ ์์ฑํจ + C๊ฐ ๋ค๋ฅธ ๊ฒ์๊ธ์ ์์ฑํจ
์ด ๋ ์์
์ ์ธ๊ณผ ๊ด๊ณ๊ฐ ์์ผ๋๊น ์์๊ฐ ๋ฐ๋์ด๋ ์๊ด์์ด.
์ฅ์ :
โข ๊ฐํ ์ผ๊ด์ฑ๋ณด๋ค ์ฑ๋ฅ์ด ์ข์
โข ์ต์ข
์ผ๊ด์ฑ๋ณด๋ค ์ง๊ด์
โข ๋ง์ ์ค์ ์ ํ๋ฆฌ์ผ์ด์
์ ์๊ตฌ์ฌํญ์ ๋ง์กฑ
๊ตฌํ ๊ธฐ์ :
โข Lamport Timestamp
โข Vector Clock
โข Causal Broadcast
๐ ์ฝ๊ธฐ ์ผ๊ด์ฑ ๋ ๋ฒจ
๋ง์ ๋ถ์ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์ฝ๊ธฐ ์์ฒญ๋ง๋ค ์ผ๊ด์ฑ ๋ ๋ฒจ์ ์ ํํ ์ ์๊ฒ ํด์ค. ์ด๊ฒ ์ ๋ง ์ ์ฉํ ๊ธฐ๋ฅ์ด์ผ! ๐๏ธ
| ์ผ๊ด์ฑ ๋ ๋ฒจ | ์ค๋ช | ์ฑ๋ฅ | ์ฌ์ฉ ์ฌ๋ก |
|---|---|---|---|
| ONE | ํ๋์ ๋ ธ๋์์๋ง ์๋ต ๋ฐ์ | โก ๋งค์ฐ ๋น ๋ฆ | ๋ก๊ทธ ์กฐํ, ์บ์ |
| QUORUM | ๊ณผ๋ฐ์ ๋ ธ๋์์ ์๋ต ๋ฐ์ | โก ๋ณดํต | ์ผ๋ฐ์ ์ธ ์ฝ๊ธฐ ์์ |
| ALL | ๋ชจ๋ ๋ ธ๋์์ ์๋ต ๋ฐ์ | ๐ ๋๋ฆผ | ์ค์ํ ๊ธ์ต ๋ฐ์ดํฐ |
| LOCAL_QUORUM | ๊ฐ์ ๋ฐ์ดํฐ์ผํฐ ๋ด ๊ณผ๋ฐ์ | โก ๋น ๋ฆ | ์ง์ญ๋ณ ์๋น์ค |
Cassandra๋ ์ฝ๊ธฐ์ ์ฐ๊ธฐ ์์ ๋ง๋ค ์ผ๊ด์ฑ ๋ ๋ฒจ์ ์ง์ ํ ์ ์์ด. ์๋ฅผ ๋ค์ด:
// ๋น ๋ฅธ ์ฝ๊ธฐ๊ฐ ํ์ํ ๊ฒฝ์ฐ
SELECT * FROM users WHERE id = 123
USING CONSISTENCY ONE;
// ์ค์ํ ๋ฐ์ดํฐ ์ฝ๊ธฐ
SELECT * FROM transactions WHERE id = 456
USING CONSISTENCY QUORUM;์ด๋ ๊ฒ ํ๋ฉด ๊ฐ์ ์์คํ ์์๋ ์ํฉ์ ๋ฐ๋ผ ์ฑ๋ฅ๊ณผ ์ผ๊ด์ฑ์ ๊ท ํ์ ์กฐ์ ํ ์ ์์ด! ์ฌ๋ฅ๋ท ๊ฐ์ ํ๋ซํผ์์๋ ์ฌ์ฉ์ ํ๋กํ ์กฐํ๋ ONE์ผ๋ก, ๊ฒฐ์ ์ ๋ณด ์กฐํ๋ QUORUM์ผ๋ก ์ค์ ํ๋ ์์ผ๋ก ์ต์ ํํ ์ ์์ง.
๐ ๏ธ ์ค์ ๋ฐ์ดํฐ ์ผ๊ด์ฑ ์ ๋ต
์ด๋ก ์ ์ถฉ๋ถํ ๋ฐฐ์ ์ผ๋, ์ด์ ์ค์ ๋ก ์ด๋ป๊ฒ ๊ตฌํํ๋์ง ์์๋ณด์! ์ฌ๊ธฐ์๋ถํฐ๊ฐ ์ง์ง ์ฌ๋ฏธ์๋ ๋ถ๋ถ์ด์ผ. ๐
1๏ธโฃ ๋ณต์ ์ ๋ต (Replication Strategies)
๐ ๋๊ธฐ์ ๋ณต์ (Synchronous Replication)
๋๊ธฐ์ ๋ณต์ ๋ ๋ง์คํฐ ๋
ธ๋๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ธ ๋, ๋ชจ๋ ๋ณต์ ๋ณธ์๋ ๋์์ ์ฐ๊ณ ํ์ธ์ ๋ฐ๋ ๋ฐฉ์์ด์ผ. ๋ชจ๋ ๋ณต์ ๋ณธ์ด "์ฐ๊ธฐ ์๋ฃ!"๋ผ๊ณ ์๋ตํด์ผ ํด๋ผ์ด์ธํธ์๊ฒ ์ฑ๊ณต์ ์๋ ค์ค.
์ฅ์ :
โข ๊ฐํ ์ผ๊ด์ฑ ๋ณด์ฅ
โข ๋ฐ์ดํฐ ์์ค ์ํ ์ต์ํ
โข ํ์ผ์ค๋ฒ ์ ๋ฐ์ดํฐ ์ ํฉ์ฑ ๋ณด์ฅ
๋จ์ :
โข ์ฐ๊ธฐ ์ฑ๋ฅ์ด ๋๋ฆผ (๊ฐ์ฅ ๋๋ฆฐ ๋
ธ๋์ ์์กด)
โข ๋คํธ์ํฌ ์ง์ฐ์ ๋ฏผ๊ฐ
โข ํ๋์ ๋ณต์ ๋ณธ์ด๋ผ๋ ์คํจํ๋ฉด ์ ์ฒด ์ฐ๊ธฐ ์คํจ
์ ์ฉ ์ฌ๋ก:
MySQL์ Semi-Synchronous Replication, PostgreSQL์ Synchronous Standby
โก ๋น๋๊ธฐ์ ๋ณต์ (Asynchronous Replication)
๋น๋๊ธฐ์ ๋ณต์ ๋ ๋ง์คํฐ ๋
ธ๋๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ฐ๊ณ ์ฆ์ ํด๋ผ์ด์ธํธ์๊ฒ ์ฑ๊ณต์ ์๋ ค์ฃผ๋ ๋ฐฉ์์ด์ผ. ๋ณต์ ๋ณธ์ผ๋ก์ ์ ํ๋ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๋์ค์ ์ผ์ด๋์ง.
์ฅ์ :
โข ๋น ๋ฅธ ์ฐ๊ธฐ ์ฑ๋ฅ
โข ๋คํธ์ํฌ ์ง์ฐ์ ๋ ๋ฏผ๊ฐ
โข ๋ณต์ ๋ณธ ์ฅ์ ๊ฐ ๋ง์คํฐ์ ์ํฅ ์์
๋จ์ :
โข ๋ณต์ ์ง์ฐ(Replication Lag) ๋ฐ์
โข ๋ง์คํฐ ์ฅ์ ์ ๋ฐ์ดํฐ ์์ค ๊ฐ๋ฅ
โข ์ฝ๊ธฐ ์ผ๊ด์ฑ ๋ณด์ฅ ์ด๋ ค์
์ ์ฉ ์ฌ๋ก:
MySQL์ ๊ธฐ๋ณธ ๋ณต์ ๋ฐฉ์, MongoDB์ Secondary ๋ณต์
๋น๋๊ธฐ์ ๋ณต์ ์์ ๊ฐ์ฅ ๊ณจ์น ์ํ ๊ฒ ๋ณต์ ์ง์ฐ์ด์ผ. ์ฌ์ฉ์๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ฐ๊ณ ๋ฐ๋ก ์ฝ์ผ๋ ค ํ ๋, ์์ง ๋ณต์ ๊ฐ ์ ๋์ด์ ์ด์ ๋ฐ์ดํฐ๊ฐ ๋ณด์ด๋ ๊ฑฐ์ง.
ํด๊ฒฐ ๋ฐฉ๋ฒ:
โข Read-Your-Writes ์ผ๊ด์ฑ: ์์ ์ด ์ด ๋ฐ์ดํฐ๋ ํญ์ ๋ง์คํฐ์์ ์ฝ๊ธฐ
โข Session Consistency: ๊ฐ์ ์ธ์ ๋ด์์๋ ์ผ๊ด์ฑ ๋ณด์ฅ
โข Monotonic Reads: ํ ๋ฒ ์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ผ๋ฉด, ์ดํ๋ก๋ ์ ๋ ์ค๋๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฝ์
โข Sticky Session: ํน์ ์ฌ์ฉ์๋ ํญ์ ๊ฐ์ ๋ณต์ ๋ณธ์์ ์ฝ๊ธฐ
2๏ธโฃ ์ค๋ฉ ์ ๋ต (Sharding Strategies)
์ค๋ฉ์ ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฌ ๋ ธ๋์ ๋ถ์ฐ์ํค๋ ๊ธฐ๋ฒ์ด์ผ. ํ๋์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ๊ฐ๋นํ๊ธฐ ์ด๋ ค์ธ ์ ๋๋ก ๋ฐ์ดํฐ๊ฐ ๋ง์ ๋ ์ฌ์ฉํ์ง. ๊ฐ ์ค๋๋ ์ ์ฒด ๋ฐ์ดํฐ์ ์ผ๋ถ๋ง ๋ด๋นํด! ๐๏ธ
๐ ํด์ ๊ธฐ๋ฐ ์ค๋ฉ
ํค ๊ฐ์ ํด์ ํจ์์ ๋ฃ์ด์ ์ด๋ ์ค๋์ ์ ์ฅํ ์ง ๊ฒฐ์ ํ๋ ๋ฐฉ์์ด์ผ.
shard_id = hash(user_id) % number_of_shards์ฅ์ :
โข ๋ฐ์ดํฐ๊ฐ ๊ท ๋ฑํ๊ฒ ๋ถ์ฐ๋จ
โข ๊ตฌํ์ด ๊ฐ๋จํจ
โข ํซ์คํ ๋ฌธ์ ๊ฐ ์ ์
๋จ์ :
โข ์ค๋ ์ถ๊ฐ/์ ๊ฑฐ ์ ๋๊ท๋ชจ ๋ฐ์ดํฐ ์ด๋ ํ์
โข ๋ฒ์ ์ฟผ๋ฆฌ๊ฐ ์ด๋ ค์
โข ๊ด๋ จ ๋ฐ์ดํฐ๊ฐ ํฉ์ด์ง ์ ์์
๐ ๋ฒ์ ๊ธฐ๋ฐ ์ค๋ฉ
ํค ๊ฐ์ ๋ฒ์์ ๋ฐ๋ผ ์ค๋๋ฅผ ๋๋๋ ๋ฐฉ์์ด์ผ.
์์:
โข Shard 1: user_id 1 ~ 1,000,000
โข Shard 2: user_id 1,000,001 ~ 2,000,000
โข Shard 3: user_id 2,000,001 ~ 3,000,000
์ฅ์ :
โข ๋ฒ์ ์ฟผ๋ฆฌ๊ฐ ํจ์จ์
โข ์ค๋ ์ถ๊ฐ๊ฐ ๋น๊ต์ ์ฌ์
โข ๊ด๋ จ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ์ค๋์ ๋ฐฐ์น ๊ฐ๋ฅ
๋จ์ :
โข ํซ์คํ ๋ฌธ์ ๋ฐ์ ๊ฐ๋ฅ
โข ๋ฐ์ดํฐ ๋ถํฌ๊ฐ ๋ถ๊ท ๋ฑํ ์ ์์
โข ๋ฒ์ ์ค์ ์ด ์ด๋ ค์
๐๏ธ ๋๋ ํ ๋ฆฌ ๊ธฐ๋ฐ ์ค๋ฉ
๋ณ๋์ ๋ฃฉ์
ํ
์ด๋ธ์ ๋๊ณ , ๊ฐ ํค๊ฐ ์ด๋ ์ค๋์ ์๋์ง ๊ธฐ๋กํ๋ ๋ฐฉ์์ด์ผ.
์ฅ์ :
โข ์ ์ฐํ ๋ฐ์ดํฐ ๋ฐฐ์น
โข ์ค๋ ์ถ๊ฐ/์ ๊ฑฐ๊ฐ ์ฌ์
โข ๋ณต์กํ ์ค๋ฉ ๋ก์ง ๊ตฌํ ๊ฐ๋ฅ
๋จ์ :
โข ๋ฃฉ์
ํ
์ด๋ธ์ด ๋จ์ผ ์ฅ์ ์ (SPOF)์ด ๋ ์ ์์
โข ์ถ๊ฐ์ ์ธ ์กฐํ ์ค๋ฒํค๋
โข ๋ฃฉ์
ํ
์ด๋ธ ๊ด๋ฆฌ ๋ณต์ก๋
์ผ๋ฐ ํด์ ์ค๋ฉ์ ๋ฌธ์ ์ ์ ํด๊ฒฐํ ๊ฒ ์ผ๊ด๋ ํด์ฑ์ด์ผ! ์ค๋๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์ ๊ฑฐํ ๋ ์ ์ฒด ๋ฐ์ดํฐ์ ์ฝ 1/N๋ง ์ด๋ํ๋ฉด ๋ผ. (N์ ์ค๋ ๊ฐ์)
์๋ฆฌ๋ ๊ฐ๋จํด. ํด์ ๊ณต๊ฐ์ ์ํ์ผ๋ก ๋ง๋ค๊ณ , ์ค๋์ ํค๋ฅผ ๋ชจ๋ ์ด ์ ์์ ๋ฐฐ์นํ๋ ๊ฑฐ์ผ. ๊ฐ ํค๋ ์๊ณ๋ฐฉํฅ์ผ๋ก ๊ฐ์ฅ ๊ฐ๊น์ด ์ค๋์ ์ ์ฅ๋์ง.
Amazon DynamoDB, Cassandra, Memcached ๋ฑ์ด ์ด ๋ฐฉ์์ ์ฌ์ฉํด! ๋๊ท๋ชจ ๋ถ์ฐ ์์คํ ์์๋ ๊ฑฐ์ ํ์์ ์ธ ๊ธฐ์ ์ด์ผ.
3๏ธโฃ ์ถฉ๋ ํด๊ฒฐ ์ ๋ต (Conflict Resolution)
์ต์ข ์ผ๊ด์ฑ ์์คํ ์์๋ ๊ฐ์ ๋ฐ์ดํฐ์ ๋ํ ๋์ ์์ ์ด ๋ฐ์ํ ์ ์์ด. ์ด๋ ์ถฉ๋์ ์ด๋ป๊ฒ ํด๊ฒฐํ ์ง ์ ํด์ผ ํด! ๐ฅ
โฐ ํ์์คํฌํ ๊ธฐ๋ฐ (Last-Write-Wins)
๊ฐ์ฅ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ด์ผ. ๊ฐ์ฅ ์ต๊ทผ ํ์์คํฌํ๋ฅผ ๊ฐ์ง ์ฐ๊ธฐ๊ฐ ์ด๊ธด๋ค๋ ๊ฑฐ์ง!
์ฅ์ :
โข ๊ตฌํ์ด ๋งค์ฐ ๊ฐ๋จ
โข ๊ฒฐ์ ๋ก ์ (ํญ์ ๊ฐ์ ๊ฒฐ๊ณผ)
โข ์ถ๊ฐ ๋ฉํ๋ฐ์ดํฐ๊ฐ ์ ์
๋จ์ :
โข ๋ฐ์ดํฐ ์์ค ๊ฐ๋ฅ (๋จผ์ ์ด ๋ฐ์ดํฐ๊ฐ ์ฌ๋ผ์ง)
โข ์๊ณ ๋๊ธฐํ ๋ฌธ์
โข ๋์ ์ฐ๊ธฐ ์ค ํ๋๋ ๋ฌด์๋จ
์ ์ฉ ์ฌ๋ก:
Cassandra์ ๊ธฐ๋ณธ ์ถฉ๋ ํด๊ฒฐ ๋ฐฉ์
๐ข ๋ฒ์ ๋ฒกํฐ (Version Vectors)
๊ฐ ๋
ธ๋๊ฐ ์์ ์ ๋ฒ์ ์นด์ดํฐ๋ฅผ ์ ์งํ๋ ๋ฐฉ์์ด์ผ. ์ถฉ๋์ด ๋ฐ์ํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์
์ด ์ง์ ํด๊ฒฐํ๊ฒ ํด.
๋์ ๋ฐฉ์:
โข ๊ฐ ๋ฐ์ดํฐ๋ [Node1: v1, Node2: v2, Node3: v3] ๊ฐ์ ๋ฒ์ ๋ฒกํฐ๋ฅผ ๊ฐ์ง
โข ์ฐ๊ธฐ ์์
์ ํด๋น ๋
ธ๋์ ๋ฒ์ ์ ์ฆ๊ฐ
โข ๋ ๋ฒ์ ์ ๋น๊ตํด์ ์ธ๊ณผ ๊ด๊ณ ํ์
โข ์ธ๊ณผ ๊ด๊ณ๊ฐ ์์ผ๋ฉด ์ถฉ๋๋ก ํ๋จ
์ฅ์ :
โข ๋ฐ์ดํฐ ์์ค ์์
โข ์ ํํ ์ธ๊ณผ ๊ด๊ณ ์ถ์
โข ์๊ณ ๋๊ธฐํ ๋ถํ์
๋จ์ :
โข ๋ฉํ๋ฐ์ดํฐ ์ค๋ฒํค๋
โข ์ ํ๋ฆฌ์ผ์ด์
์ด ์ถฉ๋ ํด๊ฒฐ ๋ก์ง ๊ตฌํํด์ผ ํจ
โข ๋ณต์ก๋ ์ฆ๊ฐ
์ ์ฉ ์ฌ๋ก:
Amazon DynamoDB, Riak
๐ CRDT (Conflict-free Replicated Data Types)
CRDT๋ ์ํ์ ์ผ๋ก ์ถฉ๋์ด ๋ฐ์ํ์ง ์๋๋ก ์ค๊ณ๋ ๋ฐ์ดํฐ ํ์
์ด์ผ. ์ ๋ง ๋ฉ์ง ๊ฐ๋
์ด์ง! ๐
CRDT์ ์ข
๋ฅ:
G-Counter (Grow-only Counter):
์ฆ๊ฐ๋ง ๊ฐ๋ฅํ ์นด์ดํฐ. ๊ฐ ๋
ธ๋๊ฐ ์์ ์ ์นด์ดํฐ๋ฅผ ์ ์งํ๊ณ , ์ ์ฒด ๊ฐ์ ๋ชจ๋ ๋
ธ๋์ ํฉ.
PN-Counter (Positive-Negative Counter):
์ฆ๊ฐ์ ๊ฐ์๊ฐ ๋ชจ๋ ๊ฐ๋ฅํ ์นด์ดํฐ. ์ฆ๊ฐ ์นด์ดํฐ์ ๊ฐ์ ์นด์ดํฐ๋ฅผ ๋ฐ๋ก ์ ์ง.
LWW-Element-Set:
Last-Write-Wins ๋ฐฉ์์ ์งํฉ. ๊ฐ ์์์ ํ์์คํฌํ๋ฅผ ๋ถ์ฌ์ ๊ด๋ฆฌ.
OR-Set (Observed-Remove Set):
์ถ๊ฐ์ ์ ๊ฑฐ๊ฐ ๋ชจ๋ ๊ฐ๋ฅํ ์งํฉ. ๊ฐ ์์์ ๊ณ ์ ID๋ฅผ ๋ถ์ฌํด์ ์ถฉ๋ ๋ฐฉ์ง.
์ฅ์ :
โข ์๋์ผ๋ก ์ถฉ๋ ํด๊ฒฐ
โข ์ ํ๋ฆฌ์ผ์ด์
๋ก์ง์ด ๋จ์
โข ์ํ์ ์ผ๋ก ์ฆ๋ช
๋ ์ ํ์ฑ
๋จ์ :
โข ๋ฉํ๋ฐ์ดํฐ ์ค๋ฒํค๋๊ฐ ํด ์ ์์
โข ๋ชจ๋ ๋ฐ์ดํฐ ํ์
์ ์ ์ฉ ๋ถ๊ฐ
โข ํ์ต ๊ณก์ ์ด ๊ฐํ๋ฆ
์ ์ฉ ์ฌ๋ก:
Redis Enterprise, Riak, Akka Distributed Data
Google Docs ๊ฐ์ ํ์ ๋๊ตฌ๋ฅผ ์๊ฐํด๋ด. ์ฌ๋ฌ ์ฌ๋์ด ๋์์ ๊ฐ์ ๋ฌธ์๋ฅผ ํธ์งํ๋๋ฐ, ์ถฉ๋์ด ๊ฑฐ์ ์ ์๊ธฐ์ง? ์ด๊ฒ ๋ฐ๋ก CRDT ๋๋ถ์ด์ผ!
๋ฌธ์๋ฅผ ๋ฌธ์ ๋จ์๋ก ์ชผ๊ฐ๊ณ , ๊ฐ ๋ฌธ์์ ๊ณ ์ ID๋ฅผ ๋ถ์ฌํด. ๋๊ตฐ๊ฐ ๋ฌธ์๋ฅผ ์ถ๊ฐํ๋ฉด ๊ทธ ์์น์ ์ ID๋ฅผ ์์ฑํ๊ณ , ์ญ์ ํ๋ฉด ํด๋น ID๋ฅผ ์ ๊ฑฐ ๋ชฉ๋ก์ ์ถ๊ฐํ๋ ๊ฑฐ์ผ. ์ด๋ ๊ฒ ํ๋ฉด ์ฌ๋ฌ ์ฌ๋์ ํธ์ง์ด ์๋์ผ๋ก ๋ณํฉ๋ผ!
4๏ธโฃ ์ฟผ๋ผ ๊ธฐ๋ฐ ์ฝ๊ธฐ/์ฐ๊ธฐ
์ฟผ๋ผ(Quorum)์ ๊ณผ๋ฐ์ ๋
ธ๋์ ๋์๋ฅผ ์ป์ด์ ์์
์ ์ํํ๋ ๋ฐฉ์์ด์ผ. ์ผ๊ด์ฑ๊ณผ ๊ฐ์ฉ์ฑ์ ๊ท ํ์ ๋ง์ถ๋ ํ๋ฅญํ ์ ๋ต์ด์ง! โ๏ธ
๊ธฐ๋ณธ ๊ฐ๋
:
โข N: ์ ์ฒด ๋ณต์ ๋ณธ ์
โข W: ์ฐ๊ธฐ ์ฑ๊ณต์ ํ์ํ ๋
ธ๋ ์
โข R: ์ฝ๊ธฐ ์ฑ๊ณต์ ํ์ํ ๋
ธ๋ ์
์ผ๊ด์ฑ ๋ณด์ฅ ์กฐ๊ฑด:
W + R > N ์ด๋ฉด ๊ฐํ ์ผ๊ด์ฑ ๋ณด์ฅ!
์๋ฅผ ๋ค์ด N=3์ผ ๋:
โข W=2, R=2 โ ๊ฐํ ์ผ๊ด์ฑ (2+2 > 3)
โข W=1, R=3 โ ๊ฐํ ์ผ๊ด์ฑ (1+3 > 3)
โข W=1, R=1 โ ์ต์ข
์ผ๊ด์ฑ (1+1 < 3)
์ค์ ์ค์ ์์:
| ์ค์ | W | R | ํน์ง | ์ฌ์ฉ ์ฌ๋ก |
|---|---|---|---|---|
| ์ฝ๊ธฐ ์ต์ ํ | N | 1 | ๋น ๋ฅธ ์ฝ๊ธฐ, ๋๋ฆฐ ์ฐ๊ธฐ | ๋ก๊ทธ ์์คํ |
| ์ฐ๊ธฐ ์ต์ ํ | 1 | N | ๋น ๋ฅธ ์ฐ๊ธฐ, ๋๋ฆฐ ์ฝ๊ธฐ | ์ผ์ ๋ฐ์ดํฐ ์์ง |
| ๊ท ํ | Q | Q | ์ค๊ฐ ์ฑ๋ฅ, ๊ฐํ ์ผ๊ด์ฑ | ์ผ๋ฐ ์ ํ๋ฆฌ์ผ์ด์ |
| ์ต์ข ์ผ๊ด์ฑ | 1 | 1 | ์ต๊ณ ์ฑ๋ฅ, ์ฝํ ์ผ๊ด์ฑ | ์บ์, ์ธ์ ์ ์ฅ์ |
Amazon DynamoDB, Cassandra ๊ฐ์ ์์คํ ์ ์ฟผ๋ผ ๊ธฐ๋ฐ ์ ๊ทผ์ ์ฌ์ฉํด. ์๋ฅผ ๋ค์ด N=3, W=2, R=2๋ก ์ค์ ํ๋ฉด:
์ฐ๊ธฐ ๊ณผ์ :
1. ํด๋ผ์ด์ธํธ๊ฐ ์ฐ๊ธฐ ์์ฒญ
2. ์ฝ๋๋ค์ดํฐ๊ฐ 3๊ฐ ๋ ธ๋์ ์ฐ๊ธฐ ์๋
3. 2๊ฐ ๋ ธ๋์์ ์ฑ๊ณต ์๋ต ๋ฐ์ผ๋ฉด ํด๋ผ์ด์ธํธ์๊ฒ ์ฑ๊ณต ๋ฐํ
4. ๋๋จธ์ง 1๊ฐ๋ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์ฒ๋ฆฌ
์ฝ๊ธฐ ๊ณผ์ :
1. ํด๋ผ์ด์ธํธ๊ฐ ์ฝ๊ธฐ ์์ฒญ
2. ์ฝ๋๋ค์ดํฐ๊ฐ 3๊ฐ ๋ ธ๋์์ ๋ฐ์ดํฐ ์กฐํ
3. 2๊ฐ ๋ ธ๋์์ ์๋ต ๋ฐ์ผ๋ฉด ๋ฒ์ ๋น๊ต
4. ์ต์ ๋ฒ์ ์ ํด๋ผ์ด์ธํธ์๊ฒ ๋ฐํ
5. ์ค๋๋ ๋ฒ์ ์ ๊ฐ์ง ๋ ธ๋๋ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์๋ฆฌ(Read Repair)
5๏ธโฃ ๋ถ์ฐ ํธ๋์ญ์ ํจํด
๐ญ Saga ํจํด
Saga๋ ๊ธด ํธ๋์ญ์
์ ์ฌ๋ฌ ๊ฐ์ ์์ ๋ก์ปฌ ํธ๋์ญ์
์ผ๋ก ๋๋๋ ํจํด์ด์ผ. ๊ฐ ๋ก์ปฌ ํธ๋์ญ์
์ ๋
๋ฆฝ์ ์ผ๋ก ์ปค๋ฐ๋๊ณ , ์คํจ ์ ๋ณด์ ํธ๋์ญ์
์ผ๋ก ๋กค๋ฐฑํด! ๐
์์: ์จ๋ผ์ธ ์ฃผ๋ฌธ ์ฒ๋ฆฌ
1. ์ฃผ๋ฌธ ์์ฑ (Order Service)
2. ๊ฒฐ์ ์ฒ๋ฆฌ (Payment Service)
3. ์ฌ๊ณ ์ฐจ๊ฐ (Inventory Service)
4. ๋ฐฐ์ก ์ค๋น (Shipping Service)
๋ง์ฝ 3๋จ๊ณ์์ ์ฌ๊ณ ๊ฐ ๋ถ์กฑํ๋ฉด?
โข ๋ณด์ ํธ๋์ญ์
: ๊ฒฐ์ ์ทจ์ โ ์ฃผ๋ฌธ ์ทจ์
๊ตฌํ ๋ฐฉ์:
Choreography (์๋ฌด ๋ฐฉ์):
๊ฐ ์๋น์ค๊ฐ ์ด๋ฒคํธ๋ฅผ ๋ฐํํ๊ณ ๊ตฌ๋
ํ๋ ๋ฐฉ์. ์ค์ ์กฐ์ ์ ์์ด ์๋น์ค๋ค์ด ํ๋ ฅ.
Orchestration (์ค์ผ์คํธ๋ผ ๋ฐฉ์):
์ค์ ์กฐ์ ์(Orchestrator)๊ฐ ๊ฐ ๋จ๊ณ๋ฅผ ๋ช
๋ นํ๊ณ ๊ด๋ฆฌํ๋ ๋ฐฉ์.
์ฅ์ :
โข ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ
์ฒ์ ์ ํฉ
โข ๊ฐ ์๋น์ค์ ๋
๋ฆฝ์ฑ ์ ์ง
โข 2PC๋ณด๋ค ์ฑ๋ฅ์ด ์ข์
๋จ์ :
โข ๊ตฌํ ๋ณต์ก๋๊ฐ ๋์
โข ๋ณด์ ํธ๋์ญ์
์ค๊ณ๊ฐ ์ด๋ ค์
โข ์ผ์์ ๋ถ์ผ์น ์ํ ์กด์ฌ
๐ฆ Event Sourcing
Event Sourcing์ ์ํ ๋ณ๊ฒฝ์ ์ด๋ฒคํธ๋ก ์ ์ฅํ๋ ํจํด์ด์ผ. ํ์ฌ ์ํ๋ฅผ ์ง์ ์ ์ฅํ๋ ๊ฒ ์๋๋ผ, ์ํ๋ฅผ ๋ง๋ ๋ชจ๋ ์ด๋ฒคํธ๋ฅผ ์ ์ฅํ๋ ๊ฑฐ์ง!
์์: ์ํ ๊ณ์ข
์ ํต์ ๋ฐฉ์: ์์ก = 100,000์ (ํ์ฌ ์ํ๋ง ์ ์ฅ)
Event Sourcing ๋ฐฉ์:
โข ๊ณ์ข ๊ฐ์ค: +100,000์
โข ์
๊ธ: +50,000์
โข ์ถ๊ธ: -30,000์
โข ์ถ๊ธ: -20,000์
โ ํ์ฌ ์์ก = 100,000์ (์ด๋ฒคํธ๋ฅผ ์ฌ์ํด์ ๊ณ์ฐ)
์ฅ์ :
โข ์๋ฒฝํ ๊ฐ์ฌ ๋ก๊ทธ
โข ์๊ฐ ์ฌํ ๊ฐ๋ฅ (๊ณผ๊ฑฐ ์ํ ์ฌ๊ตฌ์ฑ)
โข ์ด๋ฒคํธ ์ฌ์์ผ๋ก ๋ฒ๊ทธ ๋๋ฒ๊น
โข ์ฌ๋ฌ ์ฝ๊ธฐ ๋ชจ๋ธ ์์ฑ ๊ฐ๋ฅ
๋จ์ :
โข ์ด๋ฒคํธ ์คํค๋ง ๋ณ๊ฒฝ ์ด๋ ค์
โข ์ฟผ๋ฆฌ ์ฑ๋ฅ ๋ฌธ์ (์ด๋ฒคํธ ์ฌ์ ํ์)
โข ์ ์ฅ ๊ณต๊ฐ ์ฆ๊ฐ
โข ํ์ต ๊ณก์ ์ด ๊ฐํ๋ฆ
Event Sourcing์ ๋ณดํต CQRS(Command Query Responsibility Segregation)์ ํจ๊ป ์ฌ์ฉํด. ์ฐ๊ธฐ๋ ์ด๋ฒคํธ๋ก ์ ์ฅํ๊ณ , ์ฝ๊ธฐ๋ ๋ณ๋์ ์ต์ ํ๋ ๋ทฐ๋ฅผ ๋ง๋๋ ๊ฑฐ์ผ!
์๋ฅผ ๋ค์ด:
โข Write Model: ์ด๋ฒคํธ ์คํ ์ด์ ์ด๋ฒคํธ ์ ์ฅ
โข Read Model: ์ด๋ฒคํธ๋ฅผ ๊ตฌ๋ ํด์ MongoDB์ ์ต์ ํ๋ ๋ฌธ์ ์์ฑ
์ด๋ ๊ฒ ํ๋ฉด ์ฐ๊ธฐ์ ์ฝ๊ธฐ๋ฅผ ๋ ๋ฆฝ์ ์ผ๋ก ํ์ฅํ ์ ์์ด!
๐๏ธ ์ค์ ์์คํ ์ฌ๋ก ์ฐ๊ตฌ
์ด๋ก ๋ง ๋ฐฐ์ฐ๋ฉด ์ฌ๋ฏธ์์ง! ์ค์ ์ ๋ช ํ ์์คํ ๋ค์ด ์ด๋ป๊ฒ CAP ์ ๋ฆฌ๋ฅผ ์ ์ฉํ๋์ง ์ดํด๋ณด์. ๐
๐ Amazon DynamoDB - AP ์์คํ ์ ๋ํ์ฃผ์
DynamoDB๋ Amazon์ด ๋ง๋ ์์ ๊ด๋ฆฌํ NoSQL ๋ฐ์ดํฐ๋ฒ ์ด์ค์ผ. 2007๋
๋
ผ๋ฌธ์ผ๋ก ๋ฐํ๋ Dynamo์ ์๋ฆฌ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ์ง.
ํต์ฌ ์ค๊ณ ์์น:
โข ๊ฐ์ฉ์ฑ ์ต์ฐ์ : "ํญ์ ์ธ ์ ์์ด์ผ ํ๋ค"
โข ์ต์ข
์ผ๊ด์ฑ: ๋ฐ์ดํฐ๋ ๊ฒฐ๊ตญ ์ผ์นํ๋ค
โข ์ผ๊ด๋ ํด์ฑ: ๋
ธ๋ ์ถ๊ฐ/์ ๊ฑฐ๊ฐ ์ฌ์
โข Vector Clock: ์ถฉ๋ ๊ฐ์ง ๋ฐ ํด๊ฒฐ
โข Gossip ํ๋กํ ์ฝ: ๋
ธ๋ ๊ฐ ์ ๋ณด ๊ณต์
์ AP๋ฅผ ์ ํํ์๊น?
Amazon์ ์ผํ ์นดํธ๋ฅผ ์๊ฐํด๋ด. ์ฌ์ฉ์๊ฐ ์ฅ๋ฐ๊ตฌ๋์ ์ํ์ ์ถ๊ฐํ๋ ค๋๋ฐ "์๋ฒ ์ ๊ฒ ์ค"์ด๋ผ๊ณ ๋จ๋ฉด? ๊ทธ๊ฑด ๊ณง ๋งค์ถ ์์ค์ด์ผ! ๐ธ
์ฐจ๋ผ๋ฆฌ ์ผ์์ ์ผ๋ก ์ฅ๋ฐ๊ตฌ๋ ๋ด์ฉ์ด ์ฝ๊ฐ ๋ค๋ฅด๊ฒ ๋ณด์ด๋๋ผ๋, ํญ์ ์๋น์ค๊ฐ ์๋ํ๋ ๊ฒ ๋ ์ค์ํด. ๋์ค์ ๋๊ธฐํํ๋ฉด ๋๋๊น!
์ฌ๋ฏธ์๋ ์ฌ์ค:
์ด๊ธฐ Dynamo๋ ์ถฉ๋ ํด๊ฒฐ์ ์ ํ๋ฆฌ์ผ์ด์
์๊ฒ ๋งก๊ฒผ์ด. ํ์ง๋ง DynamoDB๋ Last-Write-Wins๋ฅผ ๊ธฐ๋ณธ์ผ๋ก ์ ๊ณตํด์ ์ฌ์ฉํ๊ธฐ ๋ ์ฌ์์ก์ง!
DynamoDB๋ ์ฝ๊ธฐ ์์ฒญ๋ง๋ค ์ผ๊ด์ฑ ๋ ๋ฒจ์ ์ ํํ ์ ์์ด:
Eventually Consistent Read (๊ธฐ๋ณธ):
โข ๊ฐ์ฅ ๋น ๋ฆ
โข ์ต์ ๋ฐ์ดํฐ๊ฐ ์๋ ์ ์์
โข ๋น์ฉ์ด ์ ๋ ด (์ฝ๊ธฐ ์ฉ๋ ๋จ์ 0.5 ์๋น)
Strongly Consistent Read:
โข ํญ์ ์ต์ ๋ฐ์ดํฐ
โข ์ฝ๊ฐ ๋๋ฆผ
โข ๋น์ฉ์ด ๋น์ (์ฝ๊ธฐ ์ฉ๋ ๋จ์ 1 ์๋น)
์ํฉ์ ๋ฐ๋ผ ์ ํํ ์ ์๋ค๋ ๊ฒ ์ ๋ง ์ ์ฐํ์ง!
๐พ Google Spanner - CA๋ฅผ ํฅํ ๋์
Spanner๋ Google์ด ๋ง๋ ๊ธ๋ก๋ฒ ๋ถ์ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ผ. ๋๋๊ฒ๋ ์ ์ธ๊ณ์ ๋ถ์ฐ๋์ด ์์ผ๋ฉด์๋ ๊ฐํ ์ผ๊ด์ฑ์ ์ ๊ณตํด! ๐
ํต์ฌ ๊ธฐ์ :
โข TrueTime API: GPS์ ์์์๊ณ๋ฅผ ์ฌ์ฉํ ์ ํํ ์๊ฐ ๋๊ธฐํ
โข 2๋จ๊ณ ์ปค๋ฐ: ๋ถ์ฐ ํธ๋์ญ์
์ง์
โข Paxos: ํฉ์ ์๊ณ ๋ฆฌ์ฆ
โข ์ธ๋ถ ์ผ๊ด์ฑ: ํธ๋์ญ์
์์๊ฐ ์ค์ ์๊ฐ ์์์ ์ผ์น
TrueTime์ ๋ง๋ฒ:
TrueTime์ ํ์ฌ ์๊ฐ์ [earliest, latest] ๊ตฌ๊ฐ์ผ๋ก ๋ฐํํด. ์๋ฅผ ๋ค์ด [10:00:00.000, 10:00:00.007] ์ด๋ฐ ์์ด์ง. ์ด ๋ถํ์ค์ฑ ๊ตฌ๊ฐ์ด 7ms๋ผ๋ ๊ฑฐ์ผ.
Spanner๋ ํธ๋์ญ์
์ ์ปค๋ฐํ ๋ ์ด ๋ถํ์ค์ฑ ๊ตฌ๊ฐ๋งํผ ๊ธฐ๋ค๋ ค. ๊ทธ๋ฌ๋ฉด ๋ชจ๋ ๋
ธ๋์์ ํธ๋์ญ์
์์๊ฐ ์ผ์นํ๊ฒ ๋ผ! ๐ฏ
ํธ๋ ์ด๋์คํ:
โข ๊ฐํ ์ผ๊ด์ฑ์ ์ป์์ง๋ง, ์ฐ๊ธฐ ์ง์ฐ์ด ์ฆ๊ฐํด (๋ถํ์ค์ฑ ๊ตฌ๊ฐ๋งํผ ๋๊ธฐ)
โข ํน์ํ ํ๋์จ์ด ํ์ (GPS, ์์์๊ณ)
โข ์ด์ ๋ณต์ก๋๊ฐ ๋งค์ฐ ๋์
์ฌ์ฉ ์ฌ๋ก:
Google์ AdWords, Play Store, Gmail ๋ฑ์ด Spanner๋ฅผ ์ฌ์ฉํด. ๊ธ๋ก๋ฒ ์๋น์ค์ธ๋ฐ๋ ๊ฐํ ์ผ๊ด์ฑ์ด ํ์ํ ๊ฒฝ์ฐ์ง!
๐ Apache Cassandra - ํ๋ ๊ฐ๋ฅํ ์ผ๊ด์ฑ
Cassandra๋ Facebook์ด ๊ฐ๋ฐํ๊ณ Apache ์ฌ๋จ์ด ๊ด๋ฆฌํ๋ NoSQL ๋ฐ์ดํฐ๋ฒ ์ด์ค์ผ. DynamoDB์ Google BigTable์ ์ฅ์ ์ ๊ฒฐํฉํ์ง!
ํต์ฌ ํน์ง:
โข ๋ง์คํฐ ์๋ ์ํคํ
์ฒ: ๋ชจ๋ ๋
ธ๋๊ฐ ๋๋ฑ
โข ํ๋ ๊ฐ๋ฅํ ์ผ๊ด์ฑ: ์์ฒญ๋ง๋ค ๋ ๋ฒจ ์ ํ ๊ฐ๋ฅ
โข ์ ํ ํ์ฅ์ฑ: ๋
ธ๋๋ฅผ ์ถ๊ฐํ๋ฉด ์ฑ๋ฅ์ด ์ ํ์ ์ผ๋ก ์ฆ๊ฐ
โข ๋ฉํฐ ๋ฐ์ดํฐ์ผํฐ ์ง์
์ผ๊ด์ฑ ๋ ๋ฒจ ์์:
| ๋ ๋ฒจ | ์ค๋ช | ์ผ๊ด์ฑ | ์ฑ๋ฅ |
|---|---|---|---|
| ANY | ํํธ ํธ๋์คํ๋ ํ์ฉ | โญ | โญโญโญโญโญ |
| ONE | 1๊ฐ ๋ ธ๋ ์๋ต | โญโญ | โญโญโญโญ |
| QUORUM | ๊ณผ๋ฐ์ ๋ ธ๋ ์๋ต | โญโญโญโญ | โญโญโญ |
| ALL | ๋ชจ๋ ๋ ธ๋ ์๋ต | โญโญโญโญโญ | โญ |
Netflix๋ Cassandra๋ฅผ ๋๊ท๋ชจ๋ก ์ฌ์ฉํ๋ ๋ํ์ ์ธ ํ์ฌ์ผ. ์๋ฐฑ ๊ฐ์ ๋ ธ๋๋ก ๊ตฌ์ฑ๋ ํด๋ฌ์คํฐ๋ฅผ ์ด์ํ์ง!
โข ์ฌ์ฉ์ ์์ฒญ ๊ธฐ๋ก: QUORUM ์ผ๊ด์ฑ
โข ์ถ์ฒ ์๊ณ ๋ฆฌ์ฆ ๋ฐ์ดํฐ: ONE ์ผ๊ด์ฑ
โข ๊ฒฐ์ ์ ๋ณด: ALL ์ผ๊ด์ฑ
์ด๋ ๊ฒ ๋ฐ์ดํฐ ์ค์๋์ ๋ฐ๋ผ ์ผ๊ด์ฑ ๋ ๋ฒจ์ ๋ค๋ฅด๊ฒ ์ค์ ํด์ ์ฑ๋ฅ๊ณผ ์ ํ์ฑ์ ๊ท ํ์ ๋ง์ถฐ!
๐ MongoDB - CP ์์คํ ์ ์งํ
MongoDB๋ ๋ฌธ์ ์งํฅ NoSQL ๋ฐ์ดํฐ๋ฒ ์ด์ค์ผ. ์ด๊ธฐ์๋ ์ผ๊ด์ฑ์ด ์ฝํ์ง๋ง, ๋ฒ์ ์ด ์ฌ๋ผ๊ฐ๋ฉด์ ์ ์ ๊ฐํด์ก์ด!
๋ณต์ ์ธํธ ์ํคํ
์ฒ:
โข Primary: ๋ชจ๋ ์ฐ๊ธฐ๋ฅผ ์ฒ๋ฆฌ
โข Secondary: Primary๋ก๋ถํฐ ๋ณต์
โข Arbiter: ์ ๊ฑฐ์๋ง ์ฐธ์ฌ (๋ฐ์ดํฐ ์์)
์ผ๊ด์ฑ ๋ณด์ฅ:
โข Write Concern: ์ฐ๊ธฐ ํ์ธ ๋ ๋ฒจ ์ค์
โข Read Concern: ์ฝ๊ธฐ ์ผ๊ด์ฑ ๋ ๋ฒจ ์ค์
โข Read Preference: ์ฝ๊ธฐ ๋์ ๋
ธ๋ ์ ํ
Write Concern ์์:
// ๊ธฐ๋ณธ (Primary๋ง ํ์ธ)
db.users.insertOne({name: "Alice"})
// ๊ณผ๋ฐ์ ํ์ธ
db.users.insertOne(
{name: "Bob"},
{writeConcern: {w: "majority"}}
)
// ๋ชจ๋ ๋
ธ๋ ํ์ธ
db.users.insertOne(
{name: "Charlie"},
{writeConcern: {w: 3}}
)ํธ๋์ญ์ ์ง์:
MongoDB 4.0๋ถํฐ๋ ๋ฉํฐ ๋ํ๋จผํธ ACID ํธ๋์ญ์ ์ ์ง์ํด! ์ด์ ์ง์ง CP ์์คํ ์ด๋ผ๊ณ ํ ์ ์์ง. ๐ช
๐ Redis - ๋ค์ํ ๋ชจ๋ ์ง์
Redis๋ ์ธ๋ฉ๋ชจ๋ฆฌ ๋ฐ์ดํฐ ๊ตฌ์กฐ ์ ์ฅ์์ผ. ์บ์๋ก ๋ง์ด ์ฐ์ด์ง๋ง, ์์์ฑ ์ต์
๋ ์ ๊ณตํด!
๋ณต์ ๋ชจ๋:
โข ๋ง์คํฐ-์ฌ๋ ์ด๋ธ ๋ณต์ : ๋น๋๊ธฐ์ (AP)
โข Sentinel: ์๋ ํ์ผ์ค๋ฒ
โข Cluster: ์ค๋ฉ + ๋ณต์
์์์ฑ ์ต์
:
โข RDB: ์ค๋
์ท ๋ฐฉ์
โข AOF: Append-Only File (๋ก๊ทธ ๋ฐฉ์)
โข ๋ ๋ค ์ฌ์ฉ ๊ฐ๋ฅ
์ผ๊ด์ฑ ํธ๋ ์ด๋์คํ:
Redis๋ ๊ธฐ๋ณธ์ ์ผ๋ก AP ์์คํ
์ด์ผ. ๋น๋๊ธฐ ๋ณต์ ๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋ง์คํฐ๊ฐ ์ฃฝ์ผ๋ฉด ์ต๊ทผ ๋ฐ์ดํฐ๊ฐ ์์ค๋ ์ ์์ด.
ํ์ง๋ง WAIT ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ๋ฉด ๋๊ธฐ์ ๋ณต์ ๋ฅผ ๊ฐ์ ํ ์ ์์ด:
SET key value
WAIT 2 1000 // 2๊ฐ ์ฌ๋ ์ด๋ธ๊ฐ ๋ณต์ ํ ๋๊น์ง ์ต๋ 1์ด ๋๊ธฐ
๐ ์ค์ ์ค๊ณ ๊ฐ์ด๋๋ผ์ธ
์, ์ด์ ์ค์ ๋ก ์์คํ ์ ์ค๊ณํ ๋ ์ด๋ป๊ฒ ์ ๊ทผํด์ผ ํ ์ง ์ ๋ฆฌํด๋ณด์! ๐
1๏ธโฃ ์๊ตฌ์ฌํญ ๋ถ์ํ๊ธฐ
๋น์ฆ๋์ค ์๊ตฌ์ฌํญ:
โก ๋ฐ์ดํฐ ์ ํ์ฑ์ด ์ผ๋ง๋ ์ค์ํ๊ฐ?
โก ์ผ์์ ์ธ ๋ถ์ผ์น๊ฐ ํ์ฉ๋๋๊ฐ?
โก ์๋น์ค ๋ค์ดํ์์ ๋น์ฆ๋์ค ์ํฅ์?
โก ๊ท์ ์ค์ ์๊ตฌ์ฌํญ์ด ์๋๊ฐ?
๊ธฐ์ ์ ์๊ตฌ์ฌํญ:
โก ์์ ํธ๋ํฝ ๊ท๋ชจ๋?
โก ๋ฐ์ดํฐ ํฌ๊ธฐ๋ ์ผ๋ง๋ ๋๋๊ฐ?
โก ์ง๋ฆฌ์ ๋ถ์ฐ์ด ํ์ํ๊ฐ?
โก ์ฝ๊ธฐ/์ฐ๊ธฐ ๋น์จ์?
์ด์ ์๊ตฌ์ฌํญ:
โก ํ์ ๊ธฐ์ ์ญ๋์?
โก ์ด์ ๋ณต์ก๋ ํ์ฉ ๋ฒ์๋?
โก ์์ฐ ์ ์ฝ์?
โก ๋ชจ๋ํฐ๋ง ์ธํ๋ผ๋?
2๏ธโฃ ๋ฐ์ดํฐ ๋ถ๋ฅํ๊ธฐ
๋ชจ๋ ๋ฐ์ดํฐ๊ฐ ๊ฐ์ ์ผ๊ด์ฑ ๋ ๋ฒจ์ ํ์๋ก ํ๋ ๊ฑด ์๋์ผ! ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฅํด์ ๊ฐ๊ฐ์ ๋ง๋ ์ ๋ต์ ์ ์ฉํ์. ๐๏ธ
| ๋ฐ์ดํฐ ์ ํ | ์ผ๊ด์ฑ ์๊ตฌ | ๊ถ์ฅ ์ ๋ต | ์์ |
|---|---|---|---|
| Critical | ๊ฐํ ์ผ๊ด์ฑ | CP ์์คํ , ๋๊ธฐ ๋ณต์ | ๊ฒฐ์ , ์ฌ๊ณ , ์์ฝ |
| Important | ์ธ๊ณผ์ ์ผ๊ด์ฑ | QUORUM, ๋ฒ์ ๋ฒกํฐ | ์ฌ์ฉ์ ํ๋กํ, ๋๊ธ |
| Normal | ์ต์ข ์ผ๊ด์ฑ | AP ์์คํ , ๋น๋๊ธฐ ๋ณต์ | ์กฐํ์, ์ข์์ |
| Cacheable | ์ผ๊ด์ฑ ๋ถํ์ | ์บ์, TTL ์ค์ | ์ถ์ฒ ๋ชฉ๋ก, ์ธ๊ธฐ ๊ฒ์๋ฌผ |
3๏ธโฃ ์ํคํ ์ฒ ํจํด ์ ํํ๊ธฐ
๐๏ธ ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ ์ฒ
๊ฐ ์๋น์ค๊ฐ ์์ ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๊ฐ์ง๋ ํจํด์ด์ผ. ์๋น์ค ๊ฐ ์ผ๊ด์ฑ์ ์ด๋ฒคํธ๋ API๋ก ๊ด๋ฆฌํ์ง.
์ฅ์ :
โข ์๋น์ค ๋
๋ฆฝ์ฑ
โข ๊ธฐ์ ์คํ ์์ ๋
โข ํ์ฅ์ฑ
๋จ์ :
โข ๋ถ์ฐ ํธ๋์ญ์
๋ณต์ก
โข ๋ฐ์ดํฐ ์ค๋ณต
โข ์ด์ ๋ณต์ก๋
์ผ๊ด์ฑ ์ ๋ต:
โข Saga ํจํด์ผ๋ก ๋ถ์ฐ ํธ๋์ญ์
์ฒ๋ฆฌ
โข Event Sourcing์ผ๋ก ๊ฐ์ฌ ๋ก๊ทธ
โข CQRS๋ก ์ฝ๊ธฐ/์ฐ๊ธฐ ๋ถ๋ฆฌ
๐ฏ ํด๋ฆฌ๊ธ๋ ํผ์์คํด์ค
๊ฐ ๋ฐ์ดํฐ ํน์ฑ์ ๋ง๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ํจํด์ด์ผ.
์์ ์กฐํฉ:
โข ์ฌ์ฉ์ ์ธ์ฆ: PostgreSQL (ACID ํธ๋์ญ์
)
โข ์ธ์
์ ์ฅ: Redis (๋น ๋ฅธ ์ฝ๊ธฐ/์ฐ๊ธฐ)
โข ๋ก๊ทธ ์ ์ฅ: Elasticsearch (๊ฒ์ ์ต์ ํ)
โข ํ์ผ ์ ์ฅ: S3 (๊ฐ์ฒด ์คํ ๋ฆฌ์ง)
โข ์ค์๊ฐ ๋ฐ์ดํฐ: Kafka (์คํธ๋ฆฌ๋ฐ)
์ฌ๋ฅ๋ท ๊ฐ์ ํ๋ซํผ๋ ์ด๋ฐ ๋ฐฉ์์ ์ฌ์ฉํ ์ ์์ด:
โข ํ์ ์ ๋ณด: MySQL (๊ฐํ ์ผ๊ด์ฑ)
โข ์ฌ๋ฅ ๊ฒ์: Elasticsearch (๊ฒ์ ์ฑ๋ฅ)
โข ์ฑํ
: Redis (์ค์๊ฐ ์ฒ๋ฆฌ)
โข ๋ฆฌ๋ทฐ: MongoDB (์ ์ฐํ ์คํค๋ง)
4๏ธโฃ ๋ชจ๋ํฐ๋ง๊ณผ ์๋ฆผ ์ค์ ํ๊ธฐ
๋ถ์ฐ ์์คํ ์์๋ ๋ชจ๋ํฐ๋ง์ด ์ ๋ง ์ค์ํด! ๋ฌธ์ ๋ฅผ ๋นจ๋ฆฌ ๋ฐ๊ฒฌํด์ผ ๋์ํ ์ ์์ผ๋๊น. ๐
์ผ๊ด์ฑ ๊ด๋ จ:
โข ๋ณต์ ์ง์ฐ(Replication Lag): ๋ง์คํฐ์ ์ฌ๋ ์ด๋ธ ๊ฐ ์๊ฐ ์ฐจ์ด
โข ์ถฉ๋ ๋ฐ์ ๋น๋: ๋์ ์ฐ๊ธฐ๋ก ์ธํ ์ถฉ๋ ํ์
โข ์ฝ๊ธฐ ์๋ฆฌ(Read Repair) ๋น๋: ์ค๋๋ ๋ฐ์ดํฐ ๋ฐ๊ฒฌ ํ์
๊ฐ์ฉ์ฑ ๊ด๋ จ:
โข ์ ํ์(Uptime): ์๋น์ค ๊ฐ๋ ์๊ฐ
โข ์๋ฌ์จ: ์คํจํ ์์ฒญ ๋น์จ
โข ์๋ต ์๊ฐ: P50, P95, P99 ๋ ์ดํด์
ํํฐ์ ๊ด๋ จ:
โข ๋คํธ์ํฌ ๋ถํ ๊ฐ์ง: ๋ ธ๋ ๊ฐ ํต์ ์คํจ
โข ํด๋ฌ์คํฐ ์ํ: ์ ์/๋น์ ์ ๋ ธ๋ ์
โข ํ์ผ์ค๋ฒ ํ์: ์๋ ๋ณต๊ตฌ ๋ฐ์ ๋น๋
์๋ฆผ ์ค์ ์์:
โข ๋ณต์ ์ง์ฐ > 10์ด: Warning
โข ๋ณต์ ์ง์ฐ > 60์ด: Critical
โข ์๋ฌ์จ > 1%: Warning
โข ์๋ฌ์จ > 5%: Critical
โข ๋ ธ๋ ๋ค์ด: Immediate Alert
5๏ธโฃ ํ ์คํธ ์ ๋ต
๋ถ์ฐ ์์คํ ์ ํ ์คํธํ๊ธฐ ์ด๋ ค์. ํ์ง๋ง ์ ๋๋ก ํ ์คํธํ์ง ์์ผ๋ฉด ํ๋ก๋์ ์์ ํฐ ๋ฌธ์ ๊ฐ ์๊ธธ ์ ์์ด! ๐งช
๐ฌ ์นด์ค์ค ์์ง๋์ด๋ง
์๋์ ์ผ๋ก ์ฅ์ ๋ฅผ ์ผ์ผ์ผ์ ์์คํ
์ ๋ณต์๋ ฅ์ ํ
์คํธํ๋ ๋ฐฉ๋ฒ์ด์ผ. Netflix๊ฐ ์ ๋ช
ํ์ง!
ํ
์คํธ ์๋๋ฆฌ์ค:
โข ๋
ธ๋ ๋๋ค ์ข
๋ฃ
โข ๋คํธ์ํฌ ์ง์ฐ ์ฃผ์
โข ๋คํธ์ํฌ ๋ถํ ์๋ฎฌ๋ ์ด์
โข ๋์คํฌ ๊ฐ๋ ์ฐธ ์๋ฎฌ๋ ์ด์
โข CPU/๋ฉ๋ชจ๋ฆฌ ๋ถํ ์์ฑ
๋๊ตฌ:
โข Chaos Monkey: ๋๋คํ๊ฒ ์ธ์คํด์ค ์ข
๋ฃ
โข Chaos Kong: ์ ์ฒด ๋ฆฌ์ ๋ค์ด
โข Latency Monkey: ๋คํธ์ํฌ ์ง์ฐ ์ฃผ์
โข Jepsen: ๋ถ์ฐ ์์คํ
์ผ๊ด์ฑ ํ
์คํธ
๐ญ ์๋๋ฆฌ์ค ํ ์คํธ
์ค์ ๋ฐ์ ๊ฐ๋ฅํ ์ํฉ์ ์๋ฎฌ๋ ์ด์
ํด๋ณด์:
Split-Brain ํ
์คํธ:
๋คํธ์ํฌ ๋ถํ ๋ก ํด๋ฌ์คํฐ๊ฐ ๋ ๊ฐ๋ก ๋๋์์ ๋, ๊ฐ ํํฐ์
์ด ์ด๋ป๊ฒ ๋์ํ๋์ง ํ์ธ.
Thundering Herd ํ
์คํธ:
์บ์๊ฐ ๋ง๋ฃ๋์์ ๋ ๋์์ ์์ฒ ๊ฐ์ ์์ฒญ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ๋ชฐ๋ฆฌ๋ ์ํฉ.
Cascading Failure ํ
์คํธ:
ํ๋์ ๋
ธ๋ ์ฅ์ ๊ฐ ๋ค๋ฅธ ๋
ธ๋๋ค์๊ฒ ์ฐ์์ ์ผ๋ก ์ํฅ์ ๋ฏธ์น๋ ์ํฉ.
Data Corruption ํ
์คํธ:
๋ฐ์ดํฐ๊ฐ ์์๋์์ ๋ ๊ฐ์งํ๊ณ ๋ณต๊ตฌํ๋ ๋ฉ์ปค๋์ฆ ํ์ธ.
์นด์ค์ค ์์ง๋์ด๋ง์ ํ๋ก๋์ ํ๊ฒฝ์์ ํด์ผ ์ง์ง ํจ๊ณผ๊ฐ ์์ด! ํ์ง๋ง ์กฐ์ฌํด์ผ ํด:
โข ์์ ๊ท๋ชจ๋ก ์์ (ํ ๋ฒ์ ํ๋์ ๋ ธ๋๋ง)
โข ์ ๋ฌด ์๊ฐ ์ธ์ ์คํ
โข ๋กค๋ฐฑ ๊ณํ ์ค๋น
โข ๋ชจ๋ํฐ๋ง ๊ฐํ
โข ํ์๋ค์๊ฒ ์ฌ์ ๊ณต์ง
Netflix๋ ๋งค์ผ ํ๋ก๋์ ์์ ์นด์ค์ค ํ ์คํธ๋ฅผ ์คํํด. ๊ทธ๋์ ์ค์ ์ฅ์ ๊ฐ ๋ฐ์ํด๋ ์นจ์ฐฉํ๊ฒ ๋์ํ ์ ์๋ ๊ฑฐ์ผ!
๐ ์ฑ๋ฅ ์ต์ ํ ํ
์ผ๊ด์ฑ์ ์ ์งํ๋ฉด์๋ ์ฑ๋ฅ์ ๋์ด์ฌ๋ฆฌ๋ ๋ฐฉ๋ฒ๋ค์ ์์๋ณด์! โก
1๏ธโฃ ์บ์ฑ ์ ๋ต
๐ฆ Cache-Aside ํจํด
์ ํ๋ฆฌ์ผ์ด์
์ด ์บ์๋ฅผ ์ง์ ๊ด๋ฆฌํ๋ ๋ฐฉ์์ด์ผ.
์ฝ๊ธฐ ํ๋ฆ:
1. ์บ์์์ ๋ฐ์ดํฐ ์กฐํ
2. ์บ์ ํํธ: ๋ฐ์ดํฐ ๋ฐํ
3. ์บ์ ๋ฏธ์ค: DB์์ ์กฐํ โ ์บ์์ ์ ์ฅ โ ๋ฐ์ดํฐ ๋ฐํ
์ฐ๊ธฐ ํ๋ฆ:
1. DB์ ๋ฐ์ดํฐ ์ ์ฅ
2. ์บ์ ๋ฌดํจํ (๋๋ ์
๋ฐ์ดํธ)
์ฅ์ :
โข ๊ตฌํ์ด ๊ฐ๋จ
โข ์บ์ ์ฅ์ ๊ฐ ์๋น์ค์ ์ํฅ ์์
โข ํ์ํ ๋ฐ์ดํฐ๋ง ์บ์ฑ
๋จ์ :
โข ์บ์ ๋ฏธ์ค ์ ์ง์ฐ
โข ์บ์์ DB ๋ถ์ผ์น ๊ฐ๋ฅ
๐ Write-Through ํจํด
์ฐ๊ธฐ ์์
์ ์บ์์ DB๋ฅผ ๋์์ ์
๋ฐ์ดํธํ๋ ๋ฐฉ์์ด์ผ.
์ฅ์ :
โข ์บ์์ DB๊ฐ ํญ์ ์ผ์น
โข ์ฝ๊ธฐ ์ฑ๋ฅ ์ฐ์
๋จ์ :
โข ์ฐ๊ธฐ ์ฑ๋ฅ ์ ํ
โข ์ฌ์ฉํ์ง ์๋ ๋ฐ์ดํฐ๋ ์บ์ฑ๋ ์ ์์
โก Write-Behind ํจํด
์บ์์๋ง ๋จผ์ ์ฐ๊ณ , ๋์ค์ ๋ฐฐ์น๋ก DB์ ์ฐ๋ ๋ฐฉ์์ด์ผ.
์ฅ์ :
โข ์ฐ๊ธฐ ์ฑ๋ฅ ์ต๊ณ
โข DB ๋ถํ ๊ฐ์
๋จ์ :
โข ๋ฐ์ดํฐ ์์ค ์ํ
โข ๊ตฌํ ๋ณต์ก๋ ๋์
์บ์ ๋ฌดํจํ๋ ์ ๋ง ์ด๋ ค์ด ๋ฌธ์ ์ผ. Phil Karlton์ด ๋งํ๋ฏ์ด "์ปดํจํฐ ๊ณผํ์์ ์ด๋ ค์ด ๊ฒ์ ๋ ๊ฐ์ง๋ฟ์ด๋ค: ์บ์ ๋ฌดํจํ์ ์ด๋ฆ ์ง๊ธฐ"
์ ๋ต๋ค:
โข TTL (Time To Live): ์ผ์ ์๊ฐ ํ ์๋ ๋ง๋ฃ
โข ์ด๋ฒคํธ ๊ธฐ๋ฐ: ๋ฐ์ดํฐ ๋ณ๊ฒฝ ์ ์บ์ ๋ฌดํจํ
โข ๋ฒ์ ๊ด๋ฆฌ: ํค์ ๋ฒ์ ๋ฒํธ ํฌํจ
โข ํ๊ทธ ๊ธฐ๋ฐ: ๊ด๋ จ ์บ์๋ฅผ ๊ทธ๋ฃน์ผ๋ก ๋ฌดํจํ
์ํฉ์ ๋ง๊ฒ ์กฐํฉํด์ ์ฌ์ฉํ๋ ๊ฒ ์ข์!
2๏ธโฃ ์ฐ๊ฒฐ ํ๋ง
๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ ์ฌ์ฌ์ฉํ๋ ๊ธฐ๋ฒ์ด์ผ. ๋งค๋ฒ ์ ์ฐ๊ฒฐ์ ๋ง๋๋ ๊ฑด ๋น์ฉ์ด ํฌ๊ฑฐ๋ ! ๐
์ค์ ์์ (HikariCP):
// ์ต์ ์ ํด ์ฐ๊ฒฐ ์
minimumIdle: 10
// ์ต๋ ์ฐ๊ฒฐ ์
maximumPoolSize: 50
// ์ฐ๊ฒฐ ํ์์์
connectionTimeout: 30000
// ์ ํด ์ฐ๊ฒฐ ํ์์์
idleTimeout: 600000
// ์ต๋ ์์กด ์๊ฐ
maxLifetime: 1800000ํ๋ ํ:
โข CPU ์ฝ์ด ์์ 2~3๋ฐฐ๋ก ์์
โข ๋ชจ๋ํฐ๋งํ๋ฉด์ ์กฐ์
โข ๋๋ฌด ๋ง์ผ๋ฉด ์คํ๋ ค ์ฑ๋ฅ ์ ํ
โข DB ์๋ฒ์ max_connections ๊ณ ๋ ค
3๏ธโฃ ๋ฐฐ์น ์ฒ๋ฆฌ
์ฌ๋ฌ ์์
์ ๋ชจ์์ ํ ๋ฒ์ ์ฒ๋ฆฌํ๋ฉด ํจ์จ์ ์ด์ผ!
๋ฐฐ์น ์ฐ๊ธฐ:
// ๋นํจ์จ์
for (User user : users) {
db.insert(user); // 1000๋ฒ์ ๋คํธ์ํฌ ์๋ณต
}
// ํจ์จ์
db.batchInsert(users); // 1๋ฒ์ ๋คํธ์ํฌ ์๋ณต๋ฐฐ์น ์ฝ๊ธฐ:
// ๋นํจ์จ์
for (String id : ids) {
User user = db.get(id); // N๋ฒ์ ์ฟผ๋ฆฌ
}
// ํจ์จ์
List<User> users = db.multiGet(ids); // 1๋ฒ์ ์ฟผ๋ฆฌ์ฃผ์์ฌํญ:
โข ๋ฐฐ์น ํฌ๊ธฐ๋ฅผ ๋๋ฌด ํฌ๊ฒ ํ์ง ๋ง ๊ฒ (๋ฉ๋ชจ๋ฆฌ ๋ฌธ์ )
โข ํ์์์ ์ค์ ์ ์ ํ
โข ๋ถ๋ถ ์คํจ ์ฒ๋ฆฌ ๋ก์ง ํ์
4๏ธโฃ ์ฝ๊ธฐ ๋ณต์ ๋ณธ ํ์ฉ
์ฝ๊ธฐ ์ ์ฉ ๋ณต์ ๋ณธ์ ๋ง๋ค์ด์ ์ฝ๊ธฐ ๋ถํ๋ฅผ ๋ถ์ฐ์ํค์!
์ ๋ต:
โข ๋ง์คํฐ: ๋ชจ๋ ์ฐ๊ธฐ + ์ค์ํ ์ฝ๊ธฐ
โข ์ฌ๋ ์ด๋ธ: ์ผ๋ฐ์ ์ธ ์ฝ๊ธฐ
โข ๋ก๋ ๋ฐธ๋ฐ์๋ก ์ฝ๊ธฐ ์์ฒญ ๋ถ์ฐ
์ฃผ์์ฌํญ:
โข ๋ณต์ ์ง์ฐ ๊ณ ๋ ค
โข Read-Your-Writes ์ผ๊ด์ฑ ํ์ ์ ๋ง์คํฐ์์ ์ฝ๊ธฐ
โข ์ฌ๋ ์ด๋ธ ์ฅ์ ์ ์๋ ์ ์ธ
// Spring Boot ์์
@Transactional(readOnly = true)
public User getUser(String id) {
// ์๋์ผ๋ก ์ฝ๊ธฐ ์ ์ฉ ์ฌ๋ ์ด๋ธ๋ก ๋ผ์ฐํ
return userRepository.findById(id);
}
@Transactional
public void updateUser(User user) {
// ๋ง์คํฐ๋ก ๋ผ์ฐํ
userRepository.save(user);
}์ด๋ ๊ฒ ์ด๋ ธํ ์ด์ ๋ง์ผ๋ก๋ ์ฝ๊ธฐ/์ฐ๊ธฐ๋ฅผ ๋ถ๋ฆฌํ ์ ์์ด!
5๏ธโฃ ์ธ๋ฑ์ฑ ์ ๋ต
์ ์ ํ ์ธ๋ฑ์ค๋ ์ฟผ๋ฆฌ ์ฑ๋ฅ์ ์๋ฐฑ ๋ฐฐ ํฅ์์ํฌ ์ ์์ด! ๐
์ธ๋ฑ์ค ์ข
๋ฅ:
โข B-Tree: ๋ฒ์ ์ฟผ๋ฆฌ์ ์ ํฉ
โข Hash: ์ ํํ ๋งค์นญ์ ์ ํฉ
โข Full-Text: ํ
์คํธ ๊ฒ์
โข Geospatial: ์์น ๊ธฐ๋ฐ ์ฟผ๋ฆฌ
๋ณตํฉ ์ธ๋ฑ์ค ์ค๊ณ:
โข ์นด๋๋๋ฆฌํฐ๊ฐ ๋์ ์ปฌ๋ผ์ ์์
โข WHERE ์ ์ ์์ฃผ ์ฌ์ฉ๋๋ ์ปฌ๋ผ
โข ์ ๋ ฌ์ ์ฌ์ฉ๋๋ ์ปฌ๋ผ ๊ณ ๋ ค
์ฃผ์์ฌํญ:
โข ์ธ๋ฑ์ค๊ฐ ๋ง์ผ๋ฉด ์ฐ๊ธฐ ์ฑ๋ฅ ์ ํ
โข ์ฌ์ฉํ์ง ์๋ ์ธ๋ฑ์ค๋ ์ ๊ฑฐ
โข ์ ๊ธฐ์ ์ผ๋ก ์ธ๋ฑ์ค ์ฌ๊ตฌ์ฑ
๐ฎ ๋ฏธ๋ ํธ๋ ๋์ ์๋ก์ด ์ ๊ทผ๋ฒ
๋ถ์ฐ ์์คํ ๊ณผ ๋ฐ์ดํฐ ์ผ๊ด์ฑ ๋ถ์ผ๋ ๊ณ์ ์งํํ๊ณ ์์ด. ์ต์ ํธ๋ ๋๋ฅผ ์ดํด๋ณด์! ๐
๐ง ๋จธ์ ๋ฌ๋ ๊ธฐ๋ฐ ์ต์ ํ
์ต๊ทผ์๋ ML์ ํ์ฉํด์ ์ผ๊ด์ฑ ๋ ๋ฒจ์ ๋์ ์ผ๋ก ์กฐ์ ํ๋ ์ฐ๊ตฌ๊ฐ ์งํ๋๊ณ ์์ด.
์์ด๋์ด:
โข ํธ๋ํฝ ํจํด ํ์ต
โข ๋ฐ์ดํฐ ์ ๊ทผ ํจํด ๋ถ์
โข ์๋์ผ๋ก ์ต์ ์ ์ผ๊ด์ฑ ๋ ๋ฒจ ์ ํ
โข ์์ธก ๊ธฐ๋ฐ ํ๋ฆฌํ์นญ
์๋ฅผ ๋ค์ด, ํ์์๋ ์ต์ข
์ผ๊ด์ฑ์ ์ฌ์ฉํ๋ค๊ฐ ์ค์ํ ์ด๋ฒคํธ ์๊ฐ์๋ ์๋์ผ๋ก ๊ฐํ ์ผ๊ด์ฑ์ผ๋ก ์ ํํ๋ ์์ด์ง!
๐ ์ฃ์ง ์ปดํจํ ๊ณผ ์ผ๊ด์ฑ
5G์ IoT์ ๋ฐ์ ์ผ๋ก ์ฃ์ง ์ปดํจํ
์ด ์ค์ํด์ง๊ณ ์์ด. ๋ฐ์ดํฐ๊ฐ ์ฌ์ฉ์์ ๊ฐ๊น์ด ๊ณณ์์ ์ฒ๋ฆฌ๋๋ ๊ฑฐ์ง.
๋์ ๊ณผ์ :
โข ์์ฒ ๊ฐ์ ์ฃ์ง ๋
ธ๋ ๊ฐ ์ผ๊ด์ฑ
โข ์ ํ๋ ๋คํธ์ํฌ ๋์ญํญ
โข ๊ฐํ์ ์ธ ์ฐ๊ฒฐ
ํด๊ฒฐ ๋ฐฉ๋ฒ:
โข ๊ณ์ธต์ ์ผ๊ด์ฑ ๋ชจ๋ธ
โข ์ง์ญ ์ฐ์ ์ฒ๋ฆฌ
โข ์คํ๋ผ์ธ ์ฐ์ ์ค๊ณ
๐ ๋ธ๋ก์ฒด์ธ๊ณผ ๋ถ์ฐ ํฉ์
๋ธ๋ก์ฒด์ธ์ ์ ๋ขฐํ ์ ์๋ ํ๊ฒฝ์์ ํฉ์๋ฅผ ์ด๋ฃจ๋ ์๋ก์ด ๋ฐฉ๋ฒ์ ์ ์ํ์ด.
ํต์ฌ ๊ฐ๋
:
โข ์์
์ฆ๋ช
(Proof of Work)
โข ์ง๋ถ ์ฆ๋ช
(Proof of Stake)
โข ๋น์ํด ์ฅ์ ํ์ฉ(Byzantine Fault Tolerance)
์ ํต์ ์ธ ๋ถ์ฐ ์์คํ
๊ณผ๋ ๋ค๋ฅธ ํธ๋ ์ด๋์คํ๋ฅผ ๊ฐ์ง์ง. ๋์ ์ผ๊ด์ฑ๊ณผ ๋ณด์์ ์ป์ง๋ง, ์ฑ๋ฅ๊ณผ ํ์ฅ์ฑ์ ํฌ์ํ๋ ๊ฑฐ์ผ.
๐ฎ ๊ฒ์ ์๋ฒ์ ์ผ๊ด์ฑ
์จ๋ผ์ธ ๊ฒ์์ ๋
ํนํ ์ผ๊ด์ฑ ์๊ตฌ์ฌํญ์ ๊ฐ์ ธ. ์ค์๊ฐ์ฑ์ด ์ค์ํ์ง๋ง, ์๋ฒฝํ ์ผ๊ด์ฑ์ ๋ถ๊ฐ๋ฅํด!
์ ๋ต:
โข ํด๋ผ์ด์ธํธ ์์ธก(Client-side Prediction)
โข ์๋ฒ ์กฐ์ (Server Reconciliation)
โข ์ง์ฐ ๋ณด์(Lag Compensation)
โข ์ด๋ฒคํธ ์์ ๋ณด์ฅ
๊ฒ์์์๋ "๋๋"์ด ์ค์ํด. ์ฝ๊ฐ์ ๋ถ์ผ์น๋ ํ์ฉํ๋, ์ฌ์ฉ์๊ฐ ๋๋ผ์ง ๋ชปํ๊ฒ ํ๋ ๊ฒ ํต์ฌ์ด์ผ! ๐ฏ
LOL์ ์ ์ธ๊ณ ์๋ฐฑ๋ง ๋ช ์ด ๋์์ ํ๋ ์ดํ๋ ๊ฒ์์ด์ผ. ๊ฐ ์ง์ญ๋ง๋ค ์๋ฒ๊ฐ ์๊ณ , ๊ฒ์ ๋ด์์๋ ๊ฐํ ์ผ๊ด์ฑ์ ๋ณด์ฅํด์ผ ํด.
ํ์ง๋ง ์ง์ญ ๊ฐ ๋ฐ์ดํฐ(๋ญํน, ํต๊ณ ๋ฑ)๋ ์ต์ข ์ผ๊ด์ฑ์ ์ฌ์ฉํด. ํ๊ตญ ์๋ฒ์ ๋ญํน์ด ๋ถ๋ฏธ ์๋ฒ์ ์ฆ์ ๋ฐ์๋ ํ์๋ ์์ผ๋๊น!
์ด๋ ๊ฒ ๋ฐ์ดํฐ ํน์ฑ์ ๋ฐ๋ผ ๋ค๋ฅธ ์ผ๊ด์ฑ ์ ๋ต์ ์ฌ์ฉํ๋ ๊ฒ ํ๋ช ํ ์ ๊ทผ์ด์ผ.
๐ ์คํธ๋ฆฌ๋ฐ ๋ฐ์ดํฐ ์ฒ๋ฆฌ
์ค์๊ฐ ๋ฐ์ดํฐ ์คํธ๋ฆผ ์ฒ๋ฆฌ์์๋ ์ ํต์ ์ธ ์ผ๊ด์ฑ ๊ฐ๋
์ด ์ ๋ง์ง ์์.
์๋ก์ด ๊ฐ๋
:
โข ์ฒ๋ฆฌ ์๊ฐ vs ์ด๋ฒคํธ ์๊ฐ
โข ์ํฐ๋งํฌ(Watermark)
โข ์๋์ฐ ์ฐ์ฐ
โข ์ ํํ ํ ๋ฒ ์ฒ๋ฆฌ(Exactly-Once Semantics)
๋๊ตฌ:
โข Apache Kafka
โข Apache Flink
โข Apache Spark Streaming
โข AWS Kinesis
๐ ํ์ต ๋ฆฌ์์ค์ ๋ค์ ๋จ๊ณ
์ฌ๊ธฐ๊น์ง ์ฝ์๋ค๋ฉด ์ ๋ง ๋๋จํด! ๐ ์ด์ ๋ ๊น์ด ๊ณต๋ถํ๊ณ ์ถ๋ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น?
๐ ์ถ์ฒ ๋์
๋ถ์ฐ ์์คํ ์ ๋ฐ์ด๋ธ์ด๋ผ๊ณ ํ ์ ์์ด. CAP ์ ๋ฆฌ๋ถํฐ ์ค์ ์ํคํ ์ฒ๊น์ง ๋ชจ๋ ๋ค๋ค.
2. "Database Internals" - Alex Petrov
๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ด๋ถ ๋์์ ๊น์ด ์๊ฒ ์ค๋ช ํด. ๋ณต์ , ํํฐ์ ๋, ํธ๋์ญ์ ๋ฑ์ ๋ค๋ค.
3. "Building Microservices" - Sam Newman
๋ง์ดํฌ๋ก์๋น์ค ์ํคํ ์ฒ์์์ ๋ฐ์ดํฐ ์ผ๊ด์ฑ ๋ฌธ์ ๋ฅผ ๋ค๋ค.
4. "Release It!" - Michael Nygard
ํ๋ก๋์ ํ๊ฒฝ์์์ ์์ ์ฑ๊ณผ ๋ณต์๋ ฅ์ ๋ํด ๋ค๋ค. ์ค์ ๊ฒฝํ์ด ๊ฐ๋ํด!
๐ ์จ๋ผ์ธ ๊ฐ์
โข MIT 6.824: Distributed Systems (๋ฌด๋ฃ, ์ต๊ณ ์์ค)
โข Coursera: Cloud Computing Specialization
โข Udemy: Microservices Architecture
โข YouTube: Martin Kleppmann์ ๊ฐ์ฐ๋ค
๐ฌ ์ค์ต ํ๋ก์ ํธ ์์ด๋์ด
์ด๋ก ๋ง ๋ฐฐ์ฐ๋ฉด ๊ธ๋ฐฉ ์์ด๋ฒ๋ ค. ์ง์ ๋ง๋ค์ด๋ณด์! ๐ช
์ด๊ธ:
โข ๊ฐ๋จํ ํค-๊ฐ ์ ์ฅ์ ๊ตฌํ
โข ๋ง์คํฐ-์ฌ๋ ์ด๋ธ ๋ณต์ ๊ตฌํ
โข ์บ์ ์์คํ
๋ง๋ค๊ธฐ
์ค๊ธ:
โข Raft ์๊ณ ๋ฆฌ์ฆ ๊ตฌํ
โข ๋ถ์ฐ ๋ฝ ์์คํ
โข ์ด๋ฒคํธ ์์ฑ ํ๋ ์์ํฌ
๊ณ ๊ธ:
โข ๋ฏธ๋ Cassandra ๋ง๋ค๊ธฐ
โข ๋ถ์ฐ ํธ๋์ญ์
์ฝ๋๋ค์ดํฐ
โข CRDT ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ตฌํ
๐ ์ปค๋ฎค๋ํฐ์ ์ปจํผ๋ฐ์ค
โข Papers We Love: ๋
ผ๋ฌธ ์ฝ๊ธฐ ๋ชจ์
โข QCon: ์ํํธ์จ์ด ๊ฐ๋ฐ ์ปจํผ๋ฐ์ค
โข Strange Loop: ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ๋ถ์ฐ ์์คํ
โข VLDB: ๋ฐ์ดํฐ๋ฒ ์ด์ค ํํ
โข Reddit r/distributed: ๋ถ์ฐ ์์คํ
์ปค๋ฎค๋ํฐ
1. ๋ ผ๋ฌธ ์ฝ๊ธฐ: ์ ๋ช ํ ์์คํ ์ ์๋ณธ ๋ ผ๋ฌธ์ ์ฝ์ด๋ด. Google์ Bigtable, Amazon์ Dynamo, Facebook์ Cassandra ๋ ผ๋ฌธ ๋ฑ.
2. ์คํ์์ค ๊ธฐ์ฌ: Redis, MongoDB, Cassandra ๊ฐ์ ํ๋ก์ ํธ์ ๊ธฐ์ฌํ๋ฉด์ ๋ฐฐ์.
3. ๋ธ๋ก๊ทธ ์์ฑ: ๋ฐฐ์ด ๋ด์ฉ์ ์ ๋ฆฌํด์ ๋ธ๋ก๊ทธ์ ์ฌ๋ ค. ๊ฐ๋ฅด์น๋ ๊ฒ ์ต๊ณ ์ ํ์ต์ด์ผ!
4. ์คํจ ์ฌ๋ก ์ฐ๊ตฌ: AWS ์ฅ์ ๋ณด๊ณ ์, ๊ตฌ๊ธ ํฌ์คํธ๋ชจํ ๋ฑ์ ์ฝ์ด๋ด. ์คํจ์์ ๋ฐฐ์ฐ๋ ๊ฒ ๋ง์.
5. ์ฌ๋ฅ๋ท ํ์ฉ: ๋ถ์ฐ ์์คํ ์ ๋ฌธ๊ฐ๋ฅผ ์ฐพ์์ ๋ฉํ ๋ง์ ๋ฐ๊ฑฐ๋, ๋ค๊ฐ ๋ฐฐ์ด ๊ฑธ ๋ค๋ฅธ ์ฌ๋์๊ฒ ๊ฐ๋ฅด์ณ์ค ์๋ ์์ด!
๐ฏ ๋ง๋ฌด๋ฆฌํ๋ฉฐ
์, ์ ๋ง ๊ธด ์ฌ์ ์ด์์ง? ๐
CAP ์ ๋ฆฌ๋ถํฐ ์์ํด์ ์ค์ ์ ๋ต, ์ต์ ํธ๋ ๋๊น์ง ์ ๋ง ๋ง์ ๋ด์ฉ์ ๋ค๋ค์ด!
ํต์ฌ์ ๋ค์ ์ ๋ฆฌํ๋ฉด:
1. CAP ์ ๋ฆฌ์ ๋ณธ์ง:
๋ถ์ฐ ์์คํ
์์๋ ์ผ๊ด์ฑ(C), ๊ฐ์ฉ์ฑ(A), ๋ถํ ๋ด์ฑ(P) ์ค ๋ ๊ฐ์ง๋ง ์ ํํ ์ ์์ด. ๊ทธ๋ฆฌ๊ณ ์ค์ ๋ก๋ P๊ฐ ํ์์ด๊ธฐ ๋๋ฌธ์ C์ A ์ค์์ ์ ํํ๊ฒ ๋ผ.
2. ์ผ๊ด์ฑ์ ์คํํธ๋ผ:
๊ฐํ ์ผ๊ด์ฑ๋ถํฐ ์ต์ข
์ผ๊ด์ฑ๊น์ง ๋ค์ํ ๋ ๋ฒจ์ด ์์ด. ์ํฉ์ ๋ง๊ฒ ์ ํํ๋ ๊ฒ ์ค์ํด!
3. ์ค์ ์ ๋ต:
๋ณต์ , ์ค๋ฉ, ์ฟผ๋ผ, ์ถฉ๋ ํด๊ฒฐ ๋ฑ ๋ค์ํ ๊ธฐ๋ฒ์ ์กฐํฉํด์ ์ฌ์ฉํด์ผ ํด. ์ํํ์ ์์ด!
4. ํธ๋ ์ด๋์คํ ์ดํด:
๋ชจ๋ ์ ํ์๋ ์ฅ๋จ์ ์ด ์์ด. ๋น์ฆ๋์ค ์๊ตฌ์ฌํญ์ ์ ํํ ์ดํดํ๊ณ , ์ ์ ํ ๊ท ํ์ ์ ์ฐพ๋ ๊ฒ ํต์ฌ์ด์ผ.
5. ์ง์์ ์ธ ํ์ต:
๋ถ์ฐ ์์คํ
๋ถ์ผ๋ ๊ณ์ ์งํํ๊ณ ์์ด. ์๋ก์ด ๊ธฐ์ ๊ณผ ํจํด์ ๊พธ์คํ ํ์ตํด์ผ ํด!
๊ธฐ์ตํด! ์๋ฒฝํ ์์คํ
์ ์์ด. ์ค์ํ ๊ฑด ํธ๋ ์ด๋์คํ๋ฅผ ์ดํดํ๊ณ , ์ํฉ์ ๋ง๋ ์ต์ ์ ์ ํ์ ํ๋ ๊ฒ์ด์ผ. ๐ฏ
๋ถ์ฐ ์์คํ
์ค๊ณ๋ ์ด๋ ต์ง๋ง, ๊ทธ๋งํผ ์ฌ๋ฏธ์๊ณ ๋ณด๋์ฐฌ ์ผ์ด์ผ. ๋ค๊ฐ ๋ง๋ ์์คํ
์ด ์๋ฐฑ๋ง ๋ช
์ ์ฌ์ฉ์๋ฅผ ์์ ์ ์ผ๋ก ์๋น์คํ๋ค๊ณ ์๊ฐํด๋ด. ์ ๋ง ๋ฉ์ง์ง ์์? ๐
์ด ๊ธ์ด ๋ค ๋ถ์ฐ ์์คํ
์ฌ์ ์ ๋์์ด ๋์์ผ๋ฉด ์ข๊ฒ ์ด. ๊ถ๊ธํ ์ ์ด ์๊ฑฐ๋ ๋ ๊น์ด ๋ฐฐ์ฐ๊ณ ์ถ๋ค๋ฉด, ์ฌ๋ฅ๋ท์์ ์ ๋ฌธ๊ฐ๋ค๊ณผ ์ํตํด๋ณด๋ ๊ฒ๋ ์ข์ ๋ฐฉ๋ฒ์ด์ผ!
์, ์ด์ ๋๊ฐ์ ๋ฉ์ง ๋ถ์ฐ ์์คํ
์ ๋ง๋ค์ด๋ณด์! ํ์ดํ
! ๐๐ช
๐ ๋ถ์ฐ ์์คํ
์ ์ธ๊ณ๋ ๋ฌด๊ถ๋ฌด์งํด์!
๊ณ์ ํํํ๊ณ , ์คํํ๊ณ , ๋ฐฐ์๋๊ฐ์ธ์! ๐
๊ด๋ จ ํค์๋
๋๊ธ ์์ฑ
์ด ๊ธ์ ๋ํ ์ฌ๋ฌ๋ถ์ ์๊ฐ์ ๋ค๋ ค์ฃผ์ธ์
๋ก๊ทธ์ธ์ด ํ์ํฉ๋๋ค
๋๊ธ์ ์์ฑํ๋ ค๋ฉด ๋จผ์ ๋ก๊ทธ์ธํด์ฃผ์ธ์.
๋๊ธ 0
์ง์์ธ์ ์ฒ - ์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
- ์ ์๊ถ ๋ฐ ์์ ๊ถ: ๋ณธ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ๋ ์ AI ๊ธฐ์ ๋ก ์์ฑ๋์์ผ๋ฉฐ, ๋ํ๋ฏผ๊ตญ ์ ์๊ถ๋ฒ ๋ฐ ๊ตญ์ ์ ์๊ถ ํ์ฝ์ ์ํด ๋ณดํธ๋ฉ๋๋ค.
- AI ์์ฑ ์ปจํ ์ธ ์ ๋ฒ์ ์ง์: ๋ณธ AI ์์ฑ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ์ง์ ์ฐฝ์๋ฌผ๋ก ์ธ์ ๋๋ฉฐ, ๊ด๋ จ ๋ฒ๊ท์ ๋ฐ๋ผ ์ ์๊ถ ๋ณดํธ๋ฅผ ๋ฐ์ต๋๋ค.
- ์ฌ์ฉ ์ ํ: ์ฌ๋ฅ๋ท์ ๋ช ์์ ์๋ฉด ๋์ ์์ด ๋ณธ ์ปจํ ์ธ ๋ฅผ ๋ณต์ , ์์ , ๋ฐฐํฌ, ๋๋ ์์ ์ ์ผ๋ก ํ์ฉํ๋ ํ์๋ ์๊ฒฉํ ๊ธ์ง๋ฉ๋๋ค.
- ๋ฐ์ดํฐ ์์ง ๊ธ์ง: ๋ณธ ์ปจํ ์ธ ์ ๋ํ ๋ฌด๋จ ์คํฌ๋ํ, ํฌ๋กค๋ง, ๋ฐ ์๋ํ๋ ๋ฐ์ดํฐ ์์ง์ ๋ฒ์ ์ ์ฌ์ ๋์์ด ๋ฉ๋๋ค.
- AI ํ์ต ์ ํ: ์ฌ๋ฅ๋ท์ AI ์์ฑ ์ปจํ ์ธ ๋ฅผ ํ AI ๋ชจ๋ธ ํ์ต์ ๋ฌด๋จ ์ฌ์ฉํ๋ ํ์๋ ๊ธ์ง๋๋ฉฐ, ์ด๋ ์ง์ ์ฌ์ฐ๊ถ ์นจํด๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
์์ง ๋๊ธ์ด ์์ต๋๋ค.