๋๊ท๋ชจ ๋ถ์ฐ ํ๊ฒฝ key-value ์ ์ฅ์ ์ค๊ณ
by JiwonDev
https://bytebytego.com/courses/system-design-interview/design-a-key-value-store
์ ํต์ ์ธ ๊ด๊ณํ DB์ ๋ค๋ฅด๊ฒ ์ํฉ์ ๋ฐ๋ผ key-value ํํ๋ก ์ ์ฅ์ด ํ์ํ ๊ฒฝ์ฐ๊ฐ ์๋ค. ๋ํ์ ์ธ ์๋น์ค๋ก๋ AWS DynamoDB, Memcached, Redis ๊ฐ์ ๊ฒ๋ค์ด ์์ผ๋ฉฐ ํฐ ํ์์๋ ์๋์ ๊ฐ์ ํน์ง์ ๊ฐ์ง๋ค.
- key: ์ ์ผํ ๊ฐ์ด์ด์ผํ๋ค. ๊ฐ์ ์ข ๋ฅ๋ ์๊ด์๋ค. ์ซ์ํ, ํด์ฌ๊ฐ, ์๋ฏธ์๋ ํ ์คํธ๋ฑ.
- value: ๊ด๊ณํ DB์๋ ๋ค๋ฅด๊ฒ ๋ฌธ์์ด, ๋ฆฌ์คํธ, ๊ฐ์ฒด ๋ฌด์์ด๋ ๋ ์ ์๋ค.
์ธ์์ ์๋ฒฝํ ์ค๊ณ๋ ์๋ค. ์ฐ๋ฆฐ ์ธ์ ๋ ๋ฐ์ดํฐ์ ์ผ๊ด์ฑ๊ณผ ๊ฐ์ฉ์ฑ ์ฌ์ด์ ์ ์ ํ๊ฒ ํธ๋ ์ด๋ ์คํ๋ฅผ ๊ณ ๋ คํด์ผํ๋ค. ์ด ๊ธ์์๋ ์๋์ ๊ฐ์ด ์ค์ ๋๊ท๋ชจ ๋น์ฆ๋์ค์์ ์ฌ์ฉ๊ฐ๋ฅํ ์ ๋์ ์ ์ฝ์ ๋๊ณ ์์ํ๊ณ ์ ํ๋ค.
- key-value ์์ ํฌ๊ธฐ๋ 10KB ์ดํ
- ์๋ฐฑ๋ง ์ด์์ ์ฌ์ฉ์๊ฐ ๋ง๋ค์ด๋ด๋ ๋์ฉ๋ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ์ ์์ด์ผ ํ๋ค.
- ๋์ ๊ฐ์ฉ์ฑ (High Availablity): ์์คํ ์ ์๋ต์ ๋นจ๋ผ์ผํ๋ค. ์ค๋ น ์ฅ์ ๊ฐ ๋ฐ์ํ๋๋ผ๋.
- ๋์ ํ์ฅ์ฑ (High Scalabilty): ํธ๋ํฝ ์์ด ๋์์ ๋ ์์ฝ๊ฒ ์๋ฒ๋ฅผ ํ์ฅํ ์ ์์ด์ผ ํ๋ค.
- ์๋ ์ค์ผ์ผ๋ง(Automatic scaling): ํธ๋ํฝ ์์ด ์ฆ๊ฐํจ์ ๋ฐ๋ผ ์๋ฒ์ ์ฆ์ค/์ญ์ ๊ฐ ์๋์ผ๋ก ์ด๋ฃจ์ด์ง ์ ์์ด์ผํ๋ค.
- ๋ฐ์ดํฐ์ ์ผ๊ด์ฑ์ ์กฐ์ ํ ์ ์์ด์ผ ํ๋ค. (Tunable consistency)
- ์๋ต ์ง์ฐ์๊ฐ์ด ์งง์์ผ ํ๋ค. (Low latency)
1๏ธโฃ ๋จ์ผ ์๋ฒ key-value ์ ์ฅ์
์๋ฒ๊ฐ ํ ๋๋ผ๋ฉด ์ค๊ณ๋ ๋งค์ฐ ๊ฐ๋จํ๋ค. ๊ทธ๋ฅ ์ ๋ถ ํด์ ํ ์ด๋ธ๋ก ์ ์ฅํ๋ฉด ๋๋ค. ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ต๋ํ ํ์ฉํ๊ธฐ ์ํด ์๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ค.
- ๋ฐ์ดํฐ๋ฅผ ์์ถํด์ ์ฌ์ฉํ๊ธฐ
- ์์ฃผ ์ฐ์ด๋ ๋ฐ์ดํฐ๋ง ์ฐ์ ์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ์ ๋๊ธฐ
2๏ธโฃ ๋ถ์ฐ ์๋ฒ key-value ์ ์ฅ์
๋จ์ผ ์๋ฒ๋ฅผ ์๋ฌด๋ฆฌ scale-upํด์ ์ฌ์ฉํ๋คํด๋ ์ธ์ ๊ฐ ๋ถ์กฑํ ๋๊ฐ ์ฐพ์์ค๊ธฐ ๋ง๋ จ์ด๋ค. ์ด ๋๋ ์๋ฒ๋ฅผ ๋ถ์ฐ์์ผ ์ฌ์ฉํด์ผํ๋ค.
์ด๋ ๋ถ์ฐ ํด์ํ ์ด๋ธ์ด๋ผ๊ณ ๋ ๋ถ๋ฆฌ๋๋ฐ ์ด๋ฅผ ์ค๊ณํ ๋๋ ํธ๋ ์ด๋ ์คํ์ ๊ธฐ๋ณธ์ธ CAP(Consitency, Availabilty, Partition Tolerance ) ๋ฅผ ๊ณ ๋ คํด์ผํ๋ค.
* P์ ์ ํํ ์ ์๋ ๋ถ์ฐ ๋คํธ์ํฌ๊ฐ ํต์ ๊ณผ์ ์์ ์ผ์ด๋๋ ๋ฉ์์ง ์์ค์ ์ผ๋ง๋ ํ์ฉํ ์ง ๊ท์น์ ์ ํ๋ ๊ฒ์ด๋ค.
- CP ์์คํ : ์ผ๊ด์ฑ, ํํฐ์ ๊ฐ๋ด๋ฅผ ์ง์
- AP ์์คํ : ๊ฐ์ฉ์ฑ๊ณผ ํํฐ์ ๊ฐ๋ด๋ฅผ ์ง์
- CA ์์คํ : ์ผ๊ด์ฑ๊ณผ ๊ฐ์ฉ์ฑ์ ์ง์ํ๋ ์ ์ฅ์. ๋ค๋ง ๋๋ถ๋ถ์ ๋ถ์ฐ ํ๊ฒฝ ๋น์ฆ๋์ค์์ ๋ถ๋จ ๋ด์ฑ์ ํฌ๊ธฐํ๋๊ฑด ๋ถ๊ฐ๋ฅํ๋ค.
์ค์ ์๋น์ค ์ด์์์ ํน์ ํํฐ์ ์ ์ฅ์ ๋ ํผํ ์ ์๋ค. ์ด ๋ ์ผ๊ด์ฑ๊ณผ ๊ฐ์ฉ์ฑ ์ค ์ด๋ค ๊ฒ์ ์ฐ์ ์ ์ผ๋ก ์ฑ๊ฒจ์ผํ ์ง ๊ณ ๋ฏผํด์ผํ๋ค.
- ์ผ๊ด์ฑ(CP)์ด ์ค์ํ๋ค๋ฉด ์ฐ๊ธฐ ์ฐ์ฐ์ ์ค์ง์ํค๋ฉด ํํฐ์
๊ฐ ๋ฐ์ดํฐ ๋ถ์ผ์น๋ฅผ ๋ง์ ์ ์๋ค. ๋จ ์๋น์ค ๊ฐ์ฉ์ฑ์ ๋ง์ด ๋ฎ์์ง๋ค.
์จ๋ผ์ธ ๋ฑ ํน ๊ฐ์ด ๊ณ์ข์ ์ต์ ์ ๋ณด๋ฅผ ์ถ๋ ฅํ์ง ๋ชปํ๋ ๊ฒฝ์ฐ๋ฅผ ์๊ฐํด๋ณด์. ์ด ๋๋ ๊ฐ์ฉ์ฑ๋ณด๋ค ์ผ๊ด์ฑ์ด ํจ์ฌ ์ค์ํ๋ค. - ๊ฐ์ฉ์ฑ(AP)์ด ์ค์ํ๋ค๋ฉด ์๋ ๋ฐ์ดํฐ๋ฅผ ์๋ชป ๋ฐํํ๋๋ผ๋ ์ฐ๊ธฐ ๋ฐ ์ฝ๊ธฐ๋ฅผ ๊ณ์ ํ์ฉํด์ผํ๋ค.
ํ์ด์ค๋ถ ๊ฐ์ ์ปค๋ฎค๋ํฐ ์๋น์ค๋ผ๋ฉด ๋๊ธ์ด ์ ๊น ์๋ชป๋์ค๋๋ผ๋ ์๋น์ค ๊ฐ์ฉ์ฑ๊ณผ ์ฌ์ฉ์ ๊ฒฝํ์ ์ฑ๊ธฐ๋๊ฒ ํจ์ฌ ์ค์ํ๋ค.
์ด๋ฌํ ๋ถ์ฐํ๊ฒฝ key-value ์ ์ฅ์๋ฅผ ๊ตฌํํ ๋์๋ ์ฌ๋ฌ ๊ฐ์ง ์์๋ฅผ ๊ณ ๋ คํด์ผํ๋๋ฐ, ๊ฐ ์์๋ค์ ํ๋์ฉ ์ดํด๋ณด์.
- Data partition (๋ฐ์ดํฐ ํํฐ์ )
- Data replication (๋ฐ์ดํฐ ๋ค์คํ)
- Data consistency (๋ฐ์ดํฐ ์ผ๊ด์ฑ, ์ผ๊ด์ฑ ๋ชจ๋ธ)
- Inconsistency resolution (์ผ๊ด์ฑ ๋ถ์ผ์น ํด์)
- Handling failures (์ฅ์ ์ฒ๋ฆฌ, ์ฅ์ ๊ฐ์ง)
- System architecture diagram (์ํคํ ์ฒ ๋ค์ด์ด๊ทธ๋จ ์ค๊ณ)
# Data partition (๋ฐ์ดํฐ ํํฐ์ )
๋๊ท๋ชจ ์๋น์ค์ ๊ฒฝ์ฐ, ํ ๋์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฃ๋๊ฑด ๋ถ๊ฐ๋ฅํ๋ค. ์ ์ฒด ๋ฐ์ดํฐ๋ฅผ ์์ ํํฐ์ ์ผ๋ก ๋ถํ ํ์ฌ ์ฌ๋ฌ ๋์ ๋๋ ์ ์ฅํด์ผํ๋ค. ์ด ๋ ์๋์ ์์๋ค์ ๊ณ ๋ คํด์ผํ๋ค.
- ๋ฐ์ดํฐ๋ฅผ ๊ฐ ์๋ฒ์ ๊ณ ๋ฅด๊ฒ ๋ถ์ฐํ ์ ์๋๊ฐ
- ์๋ฒ(๋ ธ๋)๊ฐ ์ถ๊ฐ, ์ญ์ ๋๋๋ผ๋ ๋ฐ์ดํฐ๋ฅผ ๋ง์ด ์ด๋ํ์ง ์์๋ ๋๋๊ฐ
์ด๋ ์์์ ๋ฐฐ์ด ์์ ํด์๋ฅผ ํตํด ํด๊ฒฐํ ์ ์๋ค. ์์ ํด์๋ฅผ ์ฌ์ฉํ๋ฉด ์ถ๊ฐ์ ์ผ๋ก ์๋ ํ์ฅ(Auto Scaling)์ด ์ฌ์์ง๊ณ ๊ฐ ์๋ฒ์ ์ฉ๋์ ๋ง๊ฒ ์ค์ ์ ๋ค์ํ(heterogeneity) ํ ์ ์๋ค. 2024.02.18 - [๐๊ธฐ๋ณธ ์ง์/CS ๊ธฐ๋ณธ์ง์] - ์์ ํด์(Consistent Hashing)
# Data replication (๋ฐ์ดํฐ ๋ค์คํ)
ํ๋์ ์๋ฒ๋ฅผ ์๋ฌด๋ฆฌ ์ฒ ์ ํ๊ฒ ๊ด๋ฆฌํ๋ค๊ณ ํด๋ ๋์ ๊ฐ์ฉ์ฑ๊ณผ ์์ ์ฑ์ ์ป๊ธด ์ด๋ ต๋ค. ์ด๋ฅผ ํ๋ณดํ๋ ค๋ฉด ๋น๋๊ธฐ์ ์ธ ๋ค์คํ๊ฐ ํ์ํ๋ค.
์์ ํด์๋ฅผ ์ฌ์ฉํ๋ ์๋ฅผ ๋ค์ด๋ณธ๋ค๋ฉด ์๊ณ ๋ฐฉํฅ์ผ๋ก ์์ ์ํํ๋ฉด์ ์ค๋ณต๋์ง ์๋ ์ฒซ N๊ฐ ์๋ฒ์ ๋ฐ์ดํฐ ์ฌ๋ณธ์ ๋ณด๊ดํ๋ฉด ๋๋ค. ๋ํ ์ ์ , ๋คํธ์ํฌ ์ด์, ์์ฐ์ฌํด๋ฑ์ ๋ฐฉ์งํ๊ธฐ์ํด ๊ฐ ๋ฌผ๋ฆฌ์๋ฒ๋ ๋ค๋ฅธ ๋ฐ์ดํฐ ์ผํฐ์ ๋ณด๊ดํ๋๋ก ๊ตฌ์ฑํ๋ฉด ๋๋ค. (์ด๋ AWS ๊ฐ์ ํด๋ผ์ฐ๋๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ์ฝ๊ฒ ๊ตฌ์ฑ ๊ฐ๋ฅํ๋ค.)
# Data consistency (๋ฐ์ดํฐ ์ผ๊ด์ฑ)
์ฌ๋ฌ ์๋ฒ์ ๋ฐ์ดํฐ๋ฅผ ๋ค์คํํ๊ธฐ ๋๋ฌธ์ ์ ์ ํ ๋ก์ง์ ์ฌ์ฉํด ๋ฐ์ดํฐ๊ฐ ๋๊ธฐํ๊ฐ ๋์ด์ผํ๋ค.
์๋ฅผ ๋ค์ด Quorum Consensus(์ ์กฑ์ ํฉ์) ํ๋กํ ์ฝ์ ์ฌ์ฉํ๋ฉด ์ฝ๊ธฐ/์ฐ๊ธฐ ์ฐ์ฐ์ ์๋์ ๊ฐ์ด ์ผ๊ด์ฑ์ ๋ณด์ฅํ ์ ์๋ค.
- N: ์ฌ๋ณธ๊ฐ์
- W: ์ฐ๊ธฐ ์ฐ์ฐ์ ๋ํ ์๋ฒ ์ ์กฑ์(* ์๋ฃ์ฒ๋ฆฌ๋ฅผ ์ํ ์ต์ ์ฑ๊ณต ์)
- R: ์ฝ๊ธฐ ์ฐ์ฐ์ ๋ํ ์๋ฒ ์ ์กฑ์(* ์๋ฃ์ฒ๋ฆฌ๋ฅผ ์ํ ์ต์ ์ฑ๊ณต ์)
W,R,N ์ ๋ฐ๋ก ์ ์ํ ์ด์ ๋ ์๋ต ๋ ์ดํด์์ ๋ฐ์ดํฐ ์ผ๊ด์ฑ ์ฌ์ด์ ํธ๋ ์ด๋ ์คํ๋ฅผ ๊ณ ๋ คํด์ผํ๊ธฐ ๋๋ฌธ์ด๋ค.
- W,R ์ด ๋ช ๊ฐ ์๋๋ ๊ฒฝ์ฐ ์๋ต ๋ ์ดํด์๋ ๋งค์ฐ ๋น ๋ฅผ ๊ฒ์ด๋ค. ๋์ ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ์ ๊น ์ผ์นํ์ง ์์ ์ ์๋ค.
- W,R ์ด ์ ์ฒด ๊ฐ์์ ๋น์ทํ๋ค๋ฉด ์๋ต ๋ ์ดํด์๋ ๋๋ฆด ๊ฒ์ด๋ค. ํ์ง๋ง ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ์ธ์ ๋ ๊ฐ์ ๊ฒ์ด๋ค.
ํ๋กํ ์ฝ๋ง ๊ณ ๋ คํ๋ค๊ณ ๋์ ์๋๋ค. ์๋น์ค์ ํน์ฑ์ ๋ฐ๋ผ ์ผ๊ด์ฑ ๋ชจ๋ธ์ ์ ํด์ ๊ตฌํํด์ผํ๋ค.
- ๊ฐํ ์ผ๊ด์ฑ(Strong Consistency) : ๋ชจ๋ ์ฝ๊ธฐ๋ ์ต์ ๋ฐ์ดํฐ์ด๋ค. ๋ก์ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ๋ ๊ฒฝ์ฐ๋ ์๋ค.
- ์ฝํ ์ผ๊ด์ฑ(Weak Consistency) : ์ฝ๊ธฐ ์ฐ์ฐ์ ์ต์ ๋ฐ์ดํฐ๊ฐ ์๋ ์ ์๋ค. ์ด๋์ ๋ ์ผ๊ด์ฑ ์์ค์ ๊ฐ์ํ๋ค.
- ์ต์ข ์ผ๊ด์ฑ(Eventual Consistency) : ์ฝ๊ธฐ ์ฐ์ฐ์ ์ต์ ๋ฐ์ดํฐ๊ฐ ์๋ ์ ์์ผ๋ ์๊ฐ์ด ์ง๋๋ฉด ๋ชจ๋ ์ฌ๋ณธ์ ์ผ๊ด์ฑ์ด ๋ง์ถฐ์ง๋ค.
DB ๊ฐ์ ๊ฒฝ์ฐ์ ๊ฐํ ์ผ๊ด์ฑ์, ๋์์ ์คํธ๋ฆฌ๋ฐ์๋น์ค๋ ์ฝํ ์ผ๊ด์ฑ์, key-value ์ธ ๋ค์ด๋๋ชจ, ์นด์ฐ๋๋ผ ๊ฐ์๊ฒฝ์ฐ์๋ ์ต์ข ์ผ๊ด์ฑ ๋ชจ๋ธ์ ์ ํํ๊ณ ์๋ค.
์ต์ข ์ผ๊ด์ฑ๋ฑ์์ ์ผ๊ด์ฑ์ ํด์ํ๋ ๋ฐฉ๋ฒ ์ค ํ๋๋, ๋ฐ์ดํฐ ๋ฒ์ ๋(versioning)๊ณผ ๋ฒกํฐ ์๊ณ(vector clock)์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด ์๋ค.
- ๋ฒ์ ๋์ ๋ฐ์ดํฐ ๋ณ๊ฒฝ ์๋ง๋ค ๋ฐ์ดํฐ์ ์๋ก์ด ๋ฒ์ ์ ๋ง๋๋ ๊ฒ์ด๋ค. ๊ฐ ๋ฒ์ ์ ๋ฐ์ดํฐ๋ ๋ถ๋ณํ๋ค
- ๋ฒกํฐ ์๊ณ๋ [์๋ฒ, ๋ฒ์ ]์ ์์์์ ์๊ฐ ๊ฐ์ฒ๋ผ ๋ฐ์ดํฐ์ ๋ฌ์๋๋ ๊ฒ์ด๋ค. ์ด๋ค ๋ฒ์ ์ด ์ ํ ๋ฒ์ ์ธ์ง, ํํ ๋ฒ์ ์ธ์ง, ์๋๋ฉด ๋ค๋ฅธ ๋ฒ์ ๊ณผ ์ถฉ๋์ด ์๋์ง ํ๋ณํ๋๋ฐ ์ฐ์ธ๋ค.
๋ฌผ๋ก ์ด ๋ฐฉ๋ฒ๋ ๋ง๋ฅ์ ์๋๋ค. ์๋์ ๋จ์ ๋ค์ ๋ณด๊ณ ํธ๋ ์ด๋ ์คํ๋ฅผ ๊ณ ๋ คํด์ผํ๋ค.
- ์ฌ์ฉ์(ํด๋ผ์ด์ธํธ)๊ฐ ์ถฉ๋์ ๊ฐ์งํ๊ณ ํด์ํด์ผํ๋ค. ํด๋ผ์ด์ธํธ ๊ตฌํ์ด ๋ณต์กํด์ง๋ค
Last Write Wins ๊ฐ์ ๊ท์น์ ์ ํ๊ณ timestamp์ ๊ธฐ๋ฐํด์ ์ถฉ๋์ ํด๊ฒฐํ๋ ๋ก์ง์ ๊ตฌํํด์ผํ๋ค. - ์์ ์ด ์ฆ์ ๊ฒฝ์ฐ, ์ด๋ก ์ [์๋ฒ:๋ฒ์ ]์ ์์ด ์์ฒญ๋๊ฒ ๋ง์ด ๋์ด๋ ์ ์๋ค.
๋คํํ AWS ๋ค์ด๋๋ชจ ๋ฌธํ์ ๋ฐ๋ฅด๋ฉด ์ค์ ์๋น์ค์์ [์๋ฒ:๋ฒ์ ]์์ด ๋ง์์ ธ์ ๋ฌธ์ ๊ฐ ๋ ์ ์ ์๋ค๊ณ ํ๋ค.
# Handling failures (์ฅ์ ๊ฐ์ง, ์ฒ๋ฆฌ)
๋๊ท๋ชจ ์์คํ ์์ ์ฅ์ ๋ ๊ทธ์ ๋ถ๊ฐํผํ๊ธฐ๋ง ํ ๊ฒ์ด ์๋๋ผ ์์ฃผ ํํ๊ฒ ๋ฒ์ด์ง๋ ์ฌ๊ฑด์ด๋ค. ๋จผ์ ์ฅ์ ๊ฐ์ง ๊ธฐ๋ฒ์ ์ดํด๋ณด๊ณ ๋ค์์ ์ฅ์ ํด์์ ๋ํด ์์๋ณด๋๋ก ํ์.
๋ถ์ฐ ํ๊ฒฝ์์ ๊ฐ์ฅ ๋จ์ํ ๋ฐฉ๋ฒ์ ์ ๋ถ ๋ค ์ฐ๊ฒฐํด ๋ฉํฐ์บ์คํ (multicasting) ์ผ๋ก ์ฅ์ ๋ฅผ ๊ฐ์งํ๋ ๊ฒ์ด๋ค. ๋น์ฐํ ์ด๋ ๋นํจ์จ์ ์ด๋ค.
๋ ๋์ ๋ฐฉ๋ฒ์ผ๋ก๋ ๊ฐ์ญ ํ๋กํ ์ฝ(gossip protocol)๊ฐ์ ๋ถ์ฐํ ์ฅ์ ๊ฐ์ง ์๋ฃจ์ ์ ์ฌ์ฉํ ์ ์๋ค. ์ด๋ ์๋์ ๊ฐ์ด ๋์ํ๋ค.
- ๊ฐ ๋ ธ๋๋ ๋ฉค๋ฒ์ญ ๋ชฉ๋ก์ ์ ์งํ๋ค. ๋ฉค๋ฒ์ญ ๋ชฉ๋ก์ ๊ฐ [memberId, Heartbeat counter] ์์ ๋ชฉ๋ก์ด๋ค.
- ๊ฐ ๋ ธ๋๋ ์ฃผ๊ธฐ์ ์ผ๋ก ์์ ์ Heartbeat counter ์ฆ๊ฐ์ํจ๋ค.
- ๊ฐ ๋ ธ๋๋ ๋ฌด์์๋ก ์ ์ ๋ ๋ ธ๋๋ค์๊ฒ ์ฃผ๊ธฐ์ ์ผ๋ก ์์ ์ Heartbeat counter ๋ชฉ๋ก์ ๋ณด๋ธ๋ค.
- Heartbeat counter ๋ชฉ๋ก์ ๋ฐ์ ๋ ธ๋๋ ๋ฉค๋ฒ์ญ ๋ชฉ๋ก์ ์ต์ ๊ฐ์ผ๋ก ๊ฐฑ์ ํ๋ค.
- ์ด๋ค ๋ฉค๋ฒ์ Heartbeat counter ๊ฐ์ด ์ง์ ๋ ์๊ฐ๋์ ๊ฐฑ์ ๋์ง ์์ผ๋ฉด (= ํน์ ์๋ฒ์ counter ๋ฆฌ์คํธ๋ฅผ ์ด๋์๋ ๋ฐ์ง ๋ชปํ๋ค๋ฉด) ํด๋น ๋ฉค๋ฒ๋ ์ฅ์ ์ํ์ธ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋๋ค.
1๏ธโฃ ๊ฐ์ญ ํ๋กํ ์ฝ๋ก ๋ฐ๊ฒฌ -> ์ผ์์ ์ธ ์ฅ์ ์ฒ๋ฆฌ
๋ง์ฝ ์ ๊ณผ์ ์ ํตํด ์ฅ์ ๋ฅผ ๋ฐ๊ฒฌํ๋ค๋ฉด ๊ฐ์ฉ์ฑ ๋ณด์ฅ์ ์ํด ์ ์ ํ ์กฐ์น๋ฅผ ์ทจํด์ผํ๋ค.
- ์๊ฒฉํ ์ ์กฑ์(strict quorum): ์ ์ฒด ์ฝ๊ธฐ/์ฐ๊ธฐ ์ฐ์ฐ์ ๊ธ์ง์์ผ๋ฒ๋ฆฐ๋ค. ์ฅ์ ๋ฐ์์ ๊ฐ์ฉ์ฑ์ ์ต์ ์ด ๋๋ค.
- ๋์จํ ์ ์กฑ์(sloppy quorum): ์ฐ๊ธฐ ์ฐ์ฐ์ฉ W๊ฐ์ ์ ์๋
ธ๋, ์ฝ๊ธฐ ์ฐ์ฐ์ฉ R๊ฐ์ ์ ์๋
ธ๋๋ง ์ฌ์ฉํ๋ค. ๋๋จธ์ง ์๋ฒ๋ ๋ฌด์ํ๋ค.
์ดํ ์ฅ์ ์๋ฒ๊ฐ ๋ณต๊ตฌ๋์์ ๋ ๋ณ๊ฒฝ์ฌํญ(hint)์ ์ผ๊ด ๋ฐ์ํ์ฌ ๋ฐ์ดํฐ ์ ํฉ์ฑ์ ๋ณด์ฅํ๋ค.
2๏ธโฃ ๊ฐ์ญ ํ๋กํ ์ฝ๋ก ๋ฐ๊ฒฌ -> ์๊ตฌ์ ์ธ ์ฅ์ ์ฒ๋ฆฌ
ํด๋น ์๋ฒ๊ฐ ์ ๊น ๋ฌธ์ ์๋ค๋ฉด ์ ๋ฐฉ๋ฒ์ผ๋ก ์ฒ๋ฆฌํ๋ฉด ๋๋ค. ๋ค๋ง ์์ฐ์ฌํด๋ ์ด๋ ํ ์ด์ ๋ก ์๊ตฌ์ ์ธ ์ฅ์ ์ํฉ์ด๋ผ๋ฉด ์ด๋ป๊ฒ ์ฒ๋ฆฌํ ๊น?
๋ฐ-์ํธ๋กํผ ํ๋กํ ์ฝ (anti-entropy protocol) ์ ์ฌ์ฉํ ์ ์๋ค. ์ด๋ ์ฌ๋ณธ์ ๋น๊ตํ์ฌ ์ต์ ๋ฒ์ ์ผ๋ก ๊ฐฑ์ ํ๋ ๋ฐฉ๋ฒ์ด๋ค.
๋จ์ ๋ฌด์ํ๊ฒ ๋ชจ๋ ๊ฑธ ๋น๊ตํด์ ์ฌ๋ณธ์ ์ฐพ์์๋ ์๊ฒ ์ง๋ง ๋์ฉ๋ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ๋์๋ ์ฑ๋ฅ์ด ๋งค์ฐ ๋๋ ค์ง๋ค. ๋์ ํด์๋ฅผ ์ฌ์ฉํ๋ ๋จธํดํธ๋ฆฌ๋ฅผ ๊ตฌ์ฑํ๋ฉด ๋ฐ์ดํฐ ์ด๋๊ณผ ๋ฌด๊ดํ๊ฒ ์ด๋ฅผ ๊ตฌํํ ์ ์๋ค.
- ์๋์ ๊ฐ์ด ๋จธํดํธ๋ฆฌ(์์ ๋ ธ๋๋ค์ ๋ ์ด๋ธ๋ก๋ถํฐ ๊ณ์ฐ๋ ํด์๊ฐ์ ํ ์ด๋ธ๋ก ๋ถ์ฌ๋๋ ํธ๋ฆฌ)๋ฅผ ๊ตฌ์ฑํ๋ค.
- ์ดํ ์ผ์ชฝ ์์->์ค๋ฅธ์ชฝ ์์์ผ๋ก BFS ํ์์ ํ๋ฉฐ root ๋ ธ๋ ํด์์ ๋น๊ตํ๋ค.
- ํด์ฌ๊ฐ์ด ๊ฐ๋ค๋ฉด ๋ฐ์ดํฐ๊ฐ ๊ฐ์ผ๋ ๋์ด๊ฐ๋ฉด ๋๊ณ , ๋ค๋ฅด๋ค๋ฉด ๊ทธ ๋ฒํท์ ๋๊ธฐํํด์ฃผ๋ฉด ๋๋ค.
๋จธํด ํธ๋ฆฌ: https://en.wikipedia.org/wiki/Merkle_tree
์นด์ฐ๋๋ผ ์ํคํ ์ฒ: https://cassandra.apache.org/doc/latest/architecture/
SStable: https://www.igvita.com/2012/02/06/sstable-and-log-structured-storage-leveldb/
๋ธ๋ฃธ ํํฐ https://en.wikipedia.org/wiki/Bloom_filter
3๏ธโฃ ํน์ ๋ฐ์ดํฐ์ผํฐ์ ์ฅ์
์ด๋ ์์ฐ์ฌํด์ ๊ฐ๊น์ฐ๋ฏ๋ก ํ๋กํ ์ฝ๋ก ๊ทน๋ณตํ ์ ์๋ค. ์ด๊ธฐ ์ค๊ณ๋ถํฐ ๋ฐ์ดํฐ ์ผํฐ๋ฅผ ๋ค์คํํ์ฌ ์๋ฒ๋ฅผ ๊ตฌ์ฑํ๋ ๊ฒ์ด ์ข๋ค.
# System architecture diagram (์ํคํ ์ฒ ๋ค์ด์ด๊ทธ๋จ ์ค๊ณ)
์์์ ์ฌ๋ฌ๊ฐ์ง๋ฅผ ๊ณ ๋ คํด๋ณด์์ผ๋ ์ด์ ์์คํ ์ ๊ตฌํํ๊ธฐ์ํด ํฐ๊ทธ๋ฆผ, ์ฆ ์ํคํ ์ฒ๋ฅผ ๊ทธ๋ฆด ์ ์์ ๊ฒ์ด๋ค.
- ํด๋ผ์ด์ธํธ๋ ํค-๊ฐ ์ ์ฅ์๊ฐ ์ ๊ณตํ๋ API get(key)์ put(key, value)๋ก ํต์ ํ๋ค.
- ์ค์ฌ์๋ ํด๋ผ์ด์ธํธ์๊ฒ ํค-๊ฐ ์ ์ฅ์์ ๋ํ ํ๋ฝ์ ์ญํ ์ ํ๋ ๋ ธ๋๋ค.
- ๋ ธ๋๋ ์์ ํด์์ ํด์๋ง ์์ ๋ถํฌํ๋ค.
- Client API ์ง์ ์ ๋ฐ ๋ถ์ฐ ํ๊ฒฝ์์ ํ์ํ ์ธ๊ธํ ์์( ์ฅ์ ๊ฐ์ง, ๋ฐ์ดํฐ ์ ํฉ์ฑ, ๋ค์คํ, ๋ณต๊ตฌ..)๋ฅผ ๋ค ์ง์ํด์ผํ๋ค.
์๋ฅผ ๋ค์ด key-value ์ ์ฅ์์ค ํ๋์ธ ์นด์ฐ๋๋ผ๋ ์๋์ ๊ฐ์ด ์ฐ๊ธฐ์ ์ฝ๊ธฐ๋ฅผ ๊ตฌํํ๋ค.
๐ ๋ถ๋ก - AWS Dynamo DB ๊ฐ ์ค๊ณ๋ ๊ณผ์
AWS์์ ์ ์ธ๊ณ์ ์ธ ์๋น์ค๋ฅผ ์ด์ํ ๋ ํ์ํ ๊ณ ๊ฐ์ฉ์ฑ์ ๋ถ์ฐ key-value ์ ์ฅ์๊ฐ ํ์ํ๊ณ ์ด๋ฅผ ๊ตฌํํ๊ธฐ ์ํ ๋ ผ๋ฌธ(Dynamo: Amazon’s Highly Available Key-value Store)์ ๊ฒ์ ํ ๋ง๋ ์๋น์ค๊ฐ DynamoDB์ด๋ค. ์ค์ ๋ก ์คํ์์ค์ธ ์นด์ฐ๋๋ผ๋ ์ด ๋ ผ๋ฌธ์ ์ํฅ์ ๋ฐ์๋ค๊ณ ํ๋ค.
๋ฌผ๋ก ์ฌ์ฌํด์ Dynomo๋ฅผ ๋ง๋ ๊ฑด ์๋๋ค. AWS๋ ๊ธฐ์กด์๋ Oracle DB๋ก ์ด์ํ์์ผ๋, ์๋น์ค๊ฐ ์ ์ธ๊ณ์ ์ผ๋ก ํ์ฅ๋๋ฉฐ ๋ ์ด์ ๊ด๊ณํDB๋ก๋ ๊ฐ๋นํ ์๊ฐ ์์๊ธฐ์ ์ง์ ๋ถ์ฐํ๊ฒฝ์ ์ ์ ํ ๊ณ ๊ฐ์ฉ์ฑ DB๋ฅผ ์ค๊ณํ๊ณ ์ ์ง๋ณด์ํ๊ธฐ๋ก ๊ฒฐ์ ํ์๋ค๊ณ ํ๋ค.
# ์ด๋ค ๊ณผ์ ์ ๊ฑฐ์ณ ๋ง๋ค์ด์ก์๊น
๋ถ์ฐ ํ๊ฒฝ Key-Value ์ ์ฅ์์ธ Dynomo๊ฐ ํ์ํ๊ฒ ๋ ๋ฐฐ๊ฒฝ์ ์๋์ ๊ฐ๋ค.
- Oracle ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฌ์ฉ ํจํด์ ์กฐ์ฌ -> ์ค์ผ์ผ ์์ ์ฒ๋ฆฌ๋ฅผ ์ํด JOIN ์์ฒด๋ฅผ ์ฌ์ฉํ์ง ์๋ ๊ฒฝ์ฐ๊ฐ ๋ง์๋ค.
- ์ฆ ๋ณต์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒฝ์ฐ, ํ ์ฟผ๋ฆฌ๊ฐ ํ๋์ ํ ์ด๋ธ์์๋ง ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ํํ์๋ค.
- ๊ทธ ์ธ์๋ ์ธ๋ฑ์ค๋ฅผ ํตํ ๋จ์ผ ๋ฐ์ดํฐ ๊ฒ์์ด ๋๋ถ๋ถ์ด์๋ค.
# ์ด๋ค ๊ณ ๋ฏผ๋ค์ด ์์์๊น
Dynomo๋ ๋คํธ์ํฌ ์ฅ์ ๊ฐ ๋ฐ์ํ ๊ฒ์ด๋ผ๋ ๊ฐ์ ์๋ ๊ฐ์ฉ์ฑ์ ์ต๋๋ก ๋์ด๋๋ก ๋์์ธ๋์๋ค.
์ฆ ๋ฐ์ดํฐ๋ ๋น๋๊ธฐ์ ์ผ๋ก ์ ํ๋์ง๋ง ์ด์ ๋ฐ๋ฅธ ๋ฐ์ดํฐ ์ถฉ๋ ๋ฌธ์ (ํ ๋ฐ์ดํฐ๊ฐ ๋ค๋ฅธ ์์ ์ผ๋ก ์ฌ๋ฌ ๋ฒ์ ์ผ๋ก ๋ถ๊ธฐ) ๋ฐ์ํ ์ ์๋ค.
๋ถ์ฐ ์ ์ฅ์์์๋ DB ํธ๋์ญ์ ์ฒ๋ผ ์ฐ๊ธฐ๋ฅผ ๋ง์ ์ ์๋ค. ๊ทธ๋์ "ํญ์ ์ฐ๊ธฐ๊ฐ ๊ฐ๋ฅํ" key-value ์ ์ฅ์๋ฅผ ๋ชฉํ๋ก ํ๊ฒ๋๋ค.
- ์ธ์ ํด๊ฒฐํ ๊ฒ์ธ๊ฐ?
์ฐ๊ธฐ ์์ ์ ๊ฐ์ฉ์ฑ์ ์ํด ์ฝ๊ธฐ ์์ ์์ ์ถฉ๋์ ํด๊ฒฐํ๋ค. - ๋๊ฐ ํด๊ฒฐํ ๊ฒ์ธ๊ฐ?
DB๊ฐ ์๋ ์๋ฒ ๋ก์ง์ ๊ตฌํํ์ฌ ์ด๋ฅผ ์ฒ๋ฆฌํ๋ค.
์ฌ๊ธฐ์ ์์ด ์๋์ ์์๋ค์ ๊ฐ์ด ๊ณ ๋ คํ๋ค๊ณ ํ๋ค.
- ๋ ธ๋๋ฅผ ์ถ๊ฐ/์ญ์ ํ ๋ ์ด์ ๋ฐ ์์คํ ์ ์ต์ํ์ ์ํฅ๋ง์ ์ฃผ์ด์ผํ๋ค.
- ๋จ์ผ ๋ ธ๋์ ์ฅ์ ๊ฐ ์ ํ๋์๋ ์๋๋ค. ๋ชจ๋ ๋ ธ๋๊ฐ ๋์ผํ ์ญํ ์ ์ํํด์ผํ๋ค.
- ์ค์ ์์คํ ์ด ์ฅ์ ๋ก ๋ง๋น๋๋๋ผ๋ P2P ๋ฅผ ํตํ ๋ถ์ฐ ์ปจํธ๋กค์ด ๊ฐ๋ฅํ ์์คํ ์ ์ค๊ณํด์ผํ๋ค.
- ๊ฐ ๋ ธ๋๋ค์ ์ํฉ์ ๋ฐ๋ผ ํจ์จ์ ์ผ๋ก ๋ค์ํ๊ฒ(Heterogeneitry) ๊ตฌ์ฑ๋ ์ ์๋ค.
ํํฐ์ ๋ ( ๋ ธ๋ ์ถ๊ฐ / ์ ๊ฑฐ) | ์์ ํด์ ์ฌ์ฉ | ํธ๋ํฝ์ ๋ฐ๋ฅธ ์๋ฒ ์ฆ์ค, ์ฆ ์ฆ๋ถ ํ์ฅ์ฑ์ ์ฝ๊ฒ ๋ณด์ฅํ ์ ์์. |
์ฐ๊ธฐ ๊ณ ๊ฐ์ฉ์ฑ(HA) ๊ตฌ์ฑ | vector clock ์ฌ์ฉ ๋ฐ์ดํฐ ์ถฉ๋์ ํด๋ผ์ด์ธํธ๊ฐ ํด๊ฒฐ |
๋ฐ์ดํฐ ์ ํ๋ Eventual Consistency๋ฅผ ์ ํํจ. ์ฐ๊ธฐ ๊ฐ์ฉ์ฑ์ ๋ณด์ฅ๋ฐ์ ์ ์์. |
์ผ์์ ์คํจ | quorum ํ๋กํ ์ฝ๊ณผ Hinted Handoff(๋ณต๊ตฌ๋ฅผ ์ํ ๊ธฐ๋ก) ์ฌ์ฉ | ๋ฒ์ฉ์ ์ธ ์์คํ ์ ์ํ ์ผ์์ ์ธ ์คํจ ๋ณต๊ตฌ ๋ฐฉ๋ฒ |
๋ฉค๋ฒ์ญ, ์ฅ์ ํ์ง | gossip ํ๋กํ ์ฝ ์ฌ์ฉ | ๊ฐ ๋ ธ๋์ ๋์ผ์ฑ์ ์ ์งํ๋ฉด์ ํ ์ค์ํ ์์คํ ์ ๊ตฌํ |
Dynomo๋ ์์ ํด์์ ์ํด ๋ชจ๋ ๋ ธ๋์์ ์ฐ๊ธฐ๊ฐ ๊ฐ๋ฅํ๋ค. ์ฆ Leader ๋ ธ๋๋ผ๋ ๊ฐ๋ ์์ฒด๊ฐ ๋ชจํธํ๋ค.
์ฐ๊ธฐ๋ฅผ ์คํจํ๋ ๊ฒ์ ๋์จํ ์ ์กฑ์ (sloppy quorum)๋ฅผ ์ด์ฉํด ์ฝ๊ธฐ/์ฐ๊ธฐ๊ฐ ์ฑ๊ณตํ๋์ง๋ฅผ ํ๋จํ๋ค.
์์์ ์ค๋ช ํ quorum๊ณผ๋ ์กฐ๊ธ ๋ค๋ฅธ๊ฒ Dynamo๋ ์์ฒญ์ ๋ฐ์ ๋ ธ๋์๊ฒ ์ ํํด์ฃผ๋ ์ค๊ฐ์(Coordinator)๊ฐ ๋ฐ๋ก ์๋ค. ์์ฒญ์ ๋ณด๋ด๋ key์ ๋ฐ๋ผ ์์ ํด์์์ ํด๋น ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํด์ผํ๋ ์ฒซ๋ฒ์งธ ๋ ธ๋๊ฐ ์ค๊ฐ์ ์ญํ ์ ํ๋๋ก ๊ตฌํ๋์ด์๋ค.
์์ฒญ์ ๋ฐ์ ์ค๊ฐ์๊ฐ ๋ ๋ ธ๋๋ ๋ณต์ ํด์ผํ๋ ๋ ธ๋ ์ ๋งํผ ๋ค๋ฅธ ๋ ธ๋(preference list)์ ๋ฐ์ดํฐ๋ฅผ ์ ํํด์ผํ๋ค. ์ด ๊ณผ์ ์์์ ์คํจ ์ฌ๋ถ๋ ์ธ๊ธํ๋๋ก ๋์จํ ์ ์กฑ์(Sloppy Quorum)๋ฅผ ์ฌ์ฉํด์ ์ฑ๊ณต ์๋ต์ ํด๋ผ์ด์ธํธ์๊ฒ ๋ฐํํ๋ค. ๋์จํ ์ ์กฑ์๋ฅผ ์ฌ์ฉํด์ ์ผ๋ถ ์ฅ์ ๊ฐ ๋ฐ์ํ๋๋ผ๋ ์๋น์ค ๊ฐ์ฉ์ฑ์ ๋ณด์ฅํ๋ค.
์ด ๋ด์ฉ๋ค์ ์ฝ์ด๋ณด๋ฉด ์์์ ์ธ๊ธํ ๋ด์ฉ๋ค๊ณผ ๋น์ทํ ๋ถ๋ถ์ด ๋ง๋ค๋ ๊ฑธ ๋๋ ๊ฒ์ด๋ค.
๋น์ฅ์ ํ์์์ ์ ์๋ ์ง์์ด์ง๋ง ๋ถ์ฐ ํ๊ฒฝ ์๋น์ค๋ฅผ ๋ง๋ค๊ฒ ๋๋ค๋ฉด ์ง๊ธ ๋ฐฐ์ ๋ ๋ด์ฉ๋ค์ ์์ฐจ๊ฒ ์จ๋จน์ ์ ์๋ค.
์ ์ด์ Dynomo๋ ์ฒ์ฌ ๊ฐ๋ฐ์๊ฐ ์ง ํ๊ณ ๋ง๋ค์ด๋ธ ๊ฒ์ด ์๋๋ผ ์ ๋ถํฐ ๋ ผ์๋์ด์ค๋ ์ฌ๋ฌ ๋ฐฉ๋ฒ๋ค์ ์ต์ ํํ ๊ฒฐ๊ณผ์ด๊ธฐ ๋๋ฌธ์ด๊ธฐ๋ ํ๋ค.
'๐๊ธฐ๋ณธ ์ง์ > CS ๊ธฐ๋ณธ์ง์' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์์ ํด์(Consistent Hashing) (1) | 2024.02.18 |
---|---|
DB ์ธ๋ฑ์ค์์๋ ์ HashTable์ ์ฌ์ฉํ์ง ์์๊น? (0) | 2024.01.10 |
๋คํธ์ํฌ L4, L7 ๋ก๋๋ฐธ๋ฐ์ฑ (Load balancing) (0) | 2021.09.08 |
์ ์์ผ๊ณผ ์ต์คํธ๋ฆผ ํ๋ก๊ทธ๋๋ฐ(Agile , XP) (0) | 2021.08.25 |
ํธ๋์ญ์ ๊ฒฉ๋ฆฌ์์ค(DB Isolation Level) (0) | 2021.08.10 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
JiwonDev
JiwonDev