[Distributed System] Consensus Algorithm
๐งฉ State Machine Replication
๋ถ์ฐ ์์คํ ์์ ์ฌ๋ฌ ๋์ ์๋ฒ๊ฐ ํ๋์ ๊ฑฐ๋ํ ์ปดํจํฐ์ฒ๋ผ ๋์ํ๊ฒ ๋ง๋๋ ๋ง๋ฒ์ ์ํ ๋จธ์ ๋ณต์ (State Machine Replication, SMR)๋ผ๋ ๊ฐ๋ ์์ ์์๋ฉ๋๋ค. ์๋ฐฑ ๊ฐ์ ๋ ธ๋๊ฐ ํฉ์ด์ ธ ์๋ ํ๊ฒฝ์์๋ ์ฌ์ฉ์๊ฐ ๋ง์น ๋จ์ผ ์๋ฒ์ ํต์ ํ๋ ๊ฒ๊ณผ ๊ฐ์ ํ์์ ์ ์งํ๋ ค๋ฉด, ๋ชจ๋ ๋ ธ๋๊ฐ ๋์ผํ ์ํ๋ฅผ ๊ณต์ ํ๊ณ ๋์ผํ ์์๋ก ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค.
SMR์ ํต์ฌ ์ฒ ํ์ โ๊ฒฐ์ ๋ก (Determinism)โ์ ์์ต๋๋ค. ๋์ผํ ์ด๊ธฐ ์ํ์์ ์์ํ ๋ณต์ ๋ณธ(Replica)๋ค์ด ๋์ผํ ์ ๋ ฅ ์ํ์ค๋ฅผ ๋์ผํ ์์๋ก ์์ ํ์ฌ ์คํํ๋ค๋ฉด, ๊ทธ ๊ฒฐ๊ณผ๋ก ๋์ถ๋๋ ์ต์ข ์ํ ์ญ์ ๋ฐ๋์ ๋์ผํด์ผ ํ๋ค๋ ์์น์ ๋๋ค. ์ฌ๊ธฐ์ โ์ ๋ ฅโ์ ์์คํ ์ ์ํ๋ฅผ ๋ณํ์ํค๋ ๋ช ๋ น(Command)์ ์๋ฏธํ๋ฉฐ, ์ด ๋ช ๋ น๋ค์ด ์์ธ ๊ธฐ๋ก ๋ณด๊ด์๋ฅผ ์ฐ๋ฆฌ๋ ๋ก๊ทธ(Log)๋ผ๊ณ ๋ถ๋ฆ ๋๋ค.
Append-only Log
๋ก๊ทธ๋ ๋จ์ํ ๋ฐ์ดํฐ์ ๋์ด์ด ์๋๋ผ, ๋ถ์ฐ ์์คํ ๋ด์์ ๋ฐ์ํ๋ ๋ชจ๋ ์ฌ๊ฑด์ ์ ํ์ ์๊ฐ์ถ ์ญํ ์ ์ํํฉ๋๋ค. ๊ฐ ๋ ธ๋๋ ์์ ๋ง์ ๋ก์ปฌ ๋ก๊ทธ๋ฅผ ๊ด๋ฆฌํ๋ฉฐ, ํฉ์ ์๊ณ ๋ฆฌ์ฆ์ ์ฃผ๋ ์๋ฌด๋ ๋ชจ๋ ๋ ธ๋์ ๋ก๊ทธ๊ฐ ์ ํํ ๊ฐ์ ์์น์ ๊ฐ์ ๋ช ๋ น์ ๊ฐ๋๋ก ๋ณด์ฅํ๋ ๊ฒ์ ๋๋ค.
์ด ๊ตฌ์กฐ์์ ๊ฐ ๋ ธ๋๋ ์ธ ๊ฐ์ง ํต์ฌ ์ปดํฌ๋ํธ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
- Consensus Module: ๋ค๋ฅธ ๋ ธ๋๋ค๊ณผ ํต์ ํ๋ฉฐ ๋ก๊ทธ์ ๋ด์ฉ๊ณผ ์์์ ๋ํด ํฉ์๋ฅผ ์ด๋์ด๋ด๋ ์ง๋ฅํ ๋ ์ด์ด์ ๋๋ค.
- Log: ํฉ์๊ฐ ์๋ฃ๋(Committed) ๋ช ๋ น๋ค์ด ์๊ตฌ์ ์ผ๋ก ์ ์ฅ๋๋ ์ ์ฅ์์ ๋๋ค.
- State Machine: ๋ก๊ทธ์ ๊ธฐ๋ก๋ ๋ช ๋ น์ ์ค์ ๋ก ์คํํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ(์: ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํค-๊ฐ ์)๋ฅผ ๋ณ๊ฒฝํ๋ ์คํ ์์ง์ ๋๋ค.
๋น๊ฒฐ์ ๋ก ์ ์์์ ์ํ์ฑ (Non-determinism)
SMR ์ํคํ ์ฒ์์ ์ํ ๋จธ์ ์ด ์ํํ๋ ์์ ์
get_current_time()์ด๋random()๊ฐ์ ๋น๊ฒฐ์ ๋ก ์ ํจ์๊ฐ ํฌํจ๋๋ฉด ์์คํ ์ ์ฆ์ ๋ถ๊ดดํฉ๋๋ค. ๋์ผํ ๋ก๊ทธ๋ฅผ ์คํํ๋๋ผ๋ ๋ ธ๋๋ง๋ค ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ ธ ์ผ๊ด์ฑ(Consistency)์ด ๊นจ์ง๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ชจ๋ ๋ช ๋ น์ ์ค์ง ์ ๋ ฅ ๊ฐ๊ณผ ์ด์ ์ํ์๋ง ์์กดํด์ผ ํฉ๋๋ค.
์ปค๋ฐ์ ์๋ฏธ
๋จ์ํ ๋ก๊ทธ์ ๋ช ๋ น์ ์ด๋ค๊ณ ํด์ ์ํ๊ฐ ๋ฐ๋ก ๋ณํ๋ ๊ฒ์ ์๋๋๋ค. ํฉ์ ์๊ณ ๋ฆฌ์ฆ์ ํน์ ๋ก๊ทธ ์ํธ๋ฆฌ๊ฐ โ์์ ํ๊ฒ ๋ณต์ ๋์์โ์ ํ์ธํ๋ ๋จ๊ณ๋ฅผ ๊ฑฐ์น๋ฉฐ, ์ด๋ฅผ ์ปค๋ฐ(Commit)์ด๋ผ๊ณ ํฉ๋๋ค. ์ผ๋จ ์ปค๋ฐ๋ ๋ก๊ทธ๋ ์ด๋ค ์ฅ์ ์ํฉ์์๋ ์ฌ๋ผ์ง์ง ์์ผ๋ฉฐ(Durability), ์ํ ๋จธ์ ์ ์ค์ง ์ปค๋ฐ๋ ๋ก๊ทธ๋ง์ ์ฝ์ด ์๋น์ค์ ๋ฐ์ํฉ๋๋ค. ์ด ์๊ฒฉํ ํ์ดํ๋ผ์ธ ๋๋ถ์ ๋คํธ์ํฌ ์ง์ฐ์ด๋ ์ผ๋ถ ๋ ธ๋์ ๋ค์ด ์์์๋ ์ ์ฒด ์์คํ ์ ๋จ์ผํ ์ง์ค์ ์ ์งํ ์ ์์ต๋๋ค.
๐งฉ Consensus
๋ถ์ฐ ์์คํ ์์ ํฉ์(Consensus)๋ ๋จ์ํ ํฌํ๋ฅผ ํตํด ๋ค์๊ฒฐ์ ๋ฐ๋ฅด๋ ๋ฏผ์ฃผ์ ์ธ ์ ์ฐจ๊ฐ ์๋๋๋ค. ์ด๋ ์ง์ฐ(Latency), ํจํท ์์ค(Packet Loss), ๊ทธ๋ฆฌ๊ณ ๋ ธ๋ ์ฅ์ (Crash)๊ฐ ์ผ์์ ์ผ๋ก ๋ฐ์ํ๋ ๋น์ ๋ขฐ ๋คํธ์ํฌ(Unreliable Network) ์์์, ๋ชจ๋ ์ ์์ ์ธ ๋ ธ๋๊ฐ โ๋จ ํ๋์ ์ง์คโ์ ์ ํํ๋๋ก ๊ฐ์ ํ๋ ์๊ฒฉํ ํ๋กํ ์ฝ์ ๋๋ค.
ํฉ์์ ๋ณธ์ง์ ์ธ ์ด๋ ค์์ โ๋๊ฐ ์ฃฝ์๋์ง, ์๋๋ฉด ๊ทธ์ ๋๋ฆฐ ๊ฒ์ธ์งโ๋ฅผ ๊ตฌ๋ณํ ์ ์๋ค๋ ๋ถํ์ค์ฑ์์ ๊ธฐ์ธํฉ๋๋ค. ๋ฉ์์ง๋ฅผ ๋ณด๋๋๋ฐ ์๋ต์ด ์๋ค๋ฉด, ์๋๋ฐฉ์ ์๋ฒ๊ฐ ์ ์ ๋ถ๋์ผ๋ก ๋ฉ์ถ ๊ฒ์ผ๊น์? ์๋๋ฉด ๋คํธ์ํฌ ์ค์์น๊ฐ ํผ์กํ์ฌ ์๋ต์ด 10์ด ๋ค์ ๋์ฐฉํ๋ ๊ฒ์ผ๊น์? ์ด ์ฌ์ํ ๊ตฌ๋ถ์ ๋ถ๊ฐ๋ฅ์ฑ์ด ํฉ์ ์๊ณ ๋ฆฌ์ฆ์ ์ค๊ณ๋ฅผ ์ง์ฅ์ผ๋ก ๋ง๋ญ๋๋ค.
FLP ๋ถ๊ฐ๋ฅ์ฑ
1985๋ , Fischer, Lynch, Paterson์ ๋ถ์ฐ ์ปดํจํ ์ญ์ฌ์ ๊ฐ์ฅ ์ถฉ๊ฒฉ์ ์ธ ๋ ผ๋ฌธ์ ๋ฐํํฉ๋๋ค. ์์ FLP Impossibility๋ผ ๋ถ๋ฆฌ๋ ์ด ์ด๋ก ์ โ์์ ํ ๋น๋๊ธฐ ๋คํธ์ํฌ ํ๊ฒฝ์์๋ ๋จ ํ๋์ ๋ ธ๋๋ง ๊ฒฐํจ์ด ์๊ฒจ๋, ๊ฒฐ์ ๋ก ์ (Deterministic)์ผ๋ก ํฉ์๋ฅผ ๋ง์น ์ ์๋ ์๊ณ ๋ฆฌ์ฆ์ ์กด์ฌํ์ง ์๋๋คโ๋ ๊ฒ์ ์ฆ๋ช ํ์ต๋๋ค.
๋น๋๊ธฐ ์์คํ ์์๋ ๋ฉ์์ง ์ ๋ฌ ์๊ฐ์ ์ํ์ ์ด ์์ผ๋ฏ๋ก, ์์คํ ์ด ๋ฌดํํ โ๊ฒฐ์ ๋์ง ์์ ์ํโ์ ๋จธ๋ฌผ ์ ์๋ ์๋๋ฆฌ์ค๊ฐ ๋ฐ๋์ ์กด์ฌํ๋ค๋ ๋ป์ ๋๋ค. ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ๋ Raft๋ Paxos ๊ฐ์ ์๊ณ ๋ฆฌ์ฆ๋ค์ ์ด ์ด๋ก ์ ๋ฌด์ํ๋ ๊ฒ์ด ์๋๋ผ, ๋ฌด์์์ฑ(Randomness)์ด๋ ํ์์์(Timeout)์ด๋ผ๋ ํ์ค์ ์ธ ํํ์์ ๋์ ํ์ฌ ์ด ๋ ผ๋ฆฌ์ ๊ต์ฐฉ ์ํ๋ฅผ ๊นจ๋จ๋ฆฝ๋๋ค.
ํฉ์๋ฅผ ๊ตฌ์ฑํ๋ 3๊ฐ์ง ์ ๋ ์กฐ๊ฑด
๋ชจ๋ ํฉ์ ์๊ณ ๋ฆฌ์ฆ์ ๋ค์ ์ธ ๊ฐ์ง ์ํ์ ์์ฑ์ ๋ง์กฑํด์ผ๋ง ์ ํจํ๋ค๊ณ ๊ฐ์ฃผ๋ฉ๋๋ค.
- Agreement (ํฉ์): ๋ชจ๋ ์ ์์ ์ธ ๋ ธ๋๋ ๋์ผํ ๊ฐ์ ๋๋ฌํด์ผ ํ๋ค.
- Validity (์ ํจ์ฑ): ํฉ์๋ ๊ฐ์ ๋ฐ๋์ ๋๊ตฐ๊ฐ ์ ์ํ ๊ฐ์ด์ด์ผ ํ๋ค. (์๋ฑํ ๊ฐ์ด ํ์ด๋์์ ์ ๋๋ค.)
- Termination (์ข ๋ฃ): ๋ชจ๋ ์ ์์ ์ธ ๋ ธ๋๋ ๊ฒฐ๊ตญ ์ด๋ค ๊ฐ์ผ๋ก๋ ๊ฒฐ์ ์ ๋ด๋ ค์ผ ํ๋ค.
Safety์ Liveness์ ์คํ๊ธฐ
ํฉ์ ์๊ณ ๋ฆฌ์ฆ์ ์ค๊ณ๋ ๊ฒฐ๊ตญ Safety(์์ ์ฑ)์ Liveness(์์กด์ฑ) ์ฌ์ด์ ๊ท ํ์ ๋ง์ถ๋ ์ผ์ ๋๋ค.
- Safety๋ โ๋์ ์ผ(์๋ชป๋ ํฉ์)์ด ์ ๋ ์ผ์ด๋์ง ์์โ์ ๋ณด์ฅํฉ๋๋ค. ๋ ธ๋๋ค์ด ์๋ก ๋ค๋ฅธ ๊ฐ์ ํฉ์ํด ๋ฒ๋ฆฌ๋ ์ ํฉ์ฑ ์ค๋ฅ๊ฐ ์ด์ ํด๋นํฉ๋๋ค.
- Liveness๋ โ์ข์ ์ผ(๊ฒฐ๊ตญ ํฉ์๋จ)์ด ์ธ์ ๊ฐ๋ ์ผ์ด๋จโ์ ๋ณด์ฅํฉ๋๋ค. ์์คํ ์ด ๋ฉ์ถ์ง ์๊ณ ๊ณ์ํด์ ์์ฒญ์ ์ฒ๋ฆฌํด ๋๊ฐ๋ ๊ฐ์ฉ์ฑ์ด ์ด์ ํด๋นํฉ๋๋ค.
ํ์ค์ ๋ถ์ฐ ์์คํ ์ ๋๊ฐ Safety๋ฅผ ์ ๋์ ์ผ๋ก ์ฐ์ ์ํฉ๋๋ค. ์ผ์์ ์ผ๋ก ์์คํ ์ด ์๋ตํ์ง ์์์ง์ธ์ (Liveness ํฌ๊ธฐ), ๋ฐ์ดํฐ๊ฐ ๊ผฌ์ฌ์ ๋ ธ๋๋ง๋ค ๋ค๋ฅธ ๊ฐ์ ๊ฐ์ง๊ณ ์๋ ์ํฉ(Safety ํฌ๊ธฐ)์ ์ฉ๋ฉํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ฐ๋ฆฌ๊ฐ ๋ฐฐ์ฐ๋ ๋๋ถ๋ถ์ ํฉ์ ํ๋กํ ์ฝ์ ๋คํธ์ํฌ ํํฐ์ ์ํฉ์์ ๊ฐ์ฉ์ฑ์ ํฌ๊ธฐํจ์ผ๋ก์จ ๋ฐ์ดํฐ์ ๋ฌด๊ฒฐ์ฑ์ ์ํธํฉ๋๋ค.
๋น์ํด ์ฅ์ ์์ ๊ฒฝ๊ณ
์ฐ๋ฆฌ๊ฐ ๋ค๋ฃจ๋ ์ผ๋ฐ์ ์ธ ํฉ์ ์๊ณ ๋ฆฌ์ฆ(Paxos, Raft)์ ๋ ธ๋๊ฐ ๋จ์ํ ๋ฉ์ถ๋ Fail-stop ์ฅ์ ๋ฅผ ๊ฐ์ ํฉ๋๋ค. ํ์ง๋ง ๋ ธ๋๊ฐ ์ ์์ ์ผ๋ก ๊ฑฐ์ง ๋ฉ์์ง๋ฅผ ๋ณด๋ด๊ฑฐ๋ ํ๋กํ ์ฝ์ ๋ณ์กฐํ๋ ๋น์ํด ์ฅ์ (Byzantine Fault) ์ํฉ์ ์ด๋ณด๋ค ํจ์ฌ ๋ณต์กํ ํฉ์ ๊ณผ์ ์ ์๊ตฌํฉ๋๋ค. ์ผ๋ฐ์ ์ธ ์์ง๋์ด๋ง ํ๊ฒฝ์์๋ ๋ ธ๋๊ฐ ์๊ตฐ(Trusted)์ด๋ผ๋ ๊ฐ์ ํ์ ์ฑ๋ฅ ์ต์ ํ๋ฅผ ๊พํ์ง๋ง, ๋ธ๋ก์ฒด์ธ๊ณผ ๊ฐ์ด ๋๊ตฌ๋ ๋ฏฟ์ ์ ์๋ ํ๊ฒฝ์์๋ ์ด ์ ๋ขฐ์ ๊ฒฝ๊ณ๋ฅผ ํ๋ฌด๋ ๊ฒ์์๋ถํฐ ๋ค์ ํฉ์๋ฅผ ์์ํด์ผ ํฉ๋๋ค.
๐งฉ Quorum
๋ถ์ฐ ์์คํ ์์ ์ ํฉ์ฑ์ ์ ์งํ๋ ๊ฐ์ฅ ๊ฐ๋ ฅํ ๋ฌด๊ธฐ๋ ์ญ์ค์ ์ด๊ฒ๋ โ๋ชจ๋ ๋ ธ๋์ ๋์๋ฅผ ๊ตฌํ์ง ์๋ ๊ฒโ์ ์์ต๋๋ค. ๋ชจ๋ ๋ ธ๋๊ฐ ์๋ตํ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ์์คํ ์ ๋จ ํ๋์ ๋ ธ๋๋ง ๊ณ ์ฅ ๋๋ ์ ์ฒด๊ฐ ๋ง๋น๋๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ฌ๊ธฐ์ ๋ฑ์ฅํ๋ ๊ฐ๋ ์ด ๋ฐ๋ก ์ฟผ๋ผ(Quorum), ์ฆ ์์ฌ๊ฒฐ์ ์ ํ์ํ ์ต์ํ์ ์ ์กฑ์์ ๋๋ค. ์ฟผ๋ผ์ ์์คํ ์ ๊ฐ์ฉ์ฑ(Availability)๊ณผ ์ผ๊ด์ฑ(Consistency) ์ฌ์ด์์ ์ ๋ฌํ ๊ท ํ์ ์ก๋ ์ํ์ ์ฅ์น์ ๋๋ค.
์ฟผ๋ผ์ ํต์ฌ ์๋ฆฌ๋ โ๊ต์งํฉ์ ๋ณด์ฅโ์ ์์ต๋๋ค. ์ ์ฒด ๋ ธ๋ ์๊ฐ $N$์ผ ๋, ์ด๋ค ๊ฒฐ์ ์ ์ฐธ์ฌํ ๋ ธ๋๋ค์ ์งํฉ์ด ๋ฐ๋์ ์ด์ ๊ฒฐ์ ์ ์ฐธ์ฌํ๋ ๋ ธ๋๋ค์ ์งํฉ๊ณผ ์ ์ด๋ ํ๋ ์ด์์ ๋ ธ๋๋ฅผ ๊ณต์ ํ๋๋ก ๊ฐ์ ํ๋ ๊ฒ์ ๋๋ค. ์ด ์ค์ฒฉ๋ ๋ ธ๋๊ฐ ๋ฐ๋ก ๊ณผ๊ฑฐ์ ๊ธฐ์ต(์ํ)์ ํ์ฌ๋ก ์ ๋ฌํ๋ โ์ง์ค์ ์ ๋ฌ์โ ์ญํ ์ ์ํํฉ๋๋ค.
$N/2 + 1$
๊ฐ์ฅ ํํ ์ฌ์ฉ๋๋ ๋ฐฉ์์ ๊ณผ๋ฐ์ ์ฟผ๋ผ์ ๋๋ค. ์ ์ฒด ๋ ธ๋๊ฐ 5๋๋ผ๋ฉด 3๋($5/2 + 1$)์ ๋์๊ฐ ํ์ํฉ๋๋ค. ์ ํํ ๊ณผ๋ฐ์์ผ๊น์? ์ํ์ ์ผ๋ก $N$๊ฐ์ ์์๋ฅผ ๊ฐ์ง ์งํฉ์์ ๊ณผ๋ฐ์ ํฌ๊ธฐ์ ๋ ๋ถ๋ถ์งํฉ์ ์ถ์ถํ๋ฉด, ์ด ๋ ์งํฉ์ ๋ฐ๋์ ์ต์ํ ํ๋์ ๊ณตํต ์์๋ฅผ ๊ฐ์ง ์๋ฐ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ด ์๋ฆฌ๋ ๋คํธ์ํฌ ํํฐ์ (Network Partition) ์ํฉ์์ ๋น์ ๋ฐํฉ๋๋ค. ๋คํธ์ํฌ๊ฐ ๋ฌผ๋ฆฌ์ ์ผ๋ก ๋ ๊ทธ๋ฃน์ผ๋ก ์ชผ๊ฐ์ก์ ๋, ๊ณผ๋ฐ์๋ฅผ ํ๋ณดํ ๊ทธ๋ฃน์ ์ค์ง ํ์ชฝ๋ฟ์ ๋๋ค. ๋๋จธ์ง ๊ทธ๋ฃน์ ์ ์กฑ์ ๋ฏธ๋ฌ๋ก ์ธํด ์ด๋ค ๊ฒฐ์ ๋ ๋ด๋ฆด ์ ์๊ฒ ๋์ด, ์์คํ ์ ์ฒด์์ ์๋ก ๋ค๋ฅธ ๋ ๊ฐ์ ์ง์ค์ด ๋ฐ์ํ๋ โ์คํ๋ฆฟ ๋ธ๋ ์ธ(Split-brain)โ ํ์์ ์์ฒ ์ฐจ๋จํฉ๋๋ค.
Read/Write ์ฟผ๋ผ์ ์ํธ์์ฉ
์ฟผ๋ผ์ ๋จ์ํ ๊ณผ๋ฐ์ ๋ชจ๋ธ์๋ง ๊ตญํ๋์ง ์์ต๋๋ค. ์ฝ๊ธฐ ์ฟผ๋ผ($R$)๊ณผ ์ฐ๊ธฐ ์ฟผ๋ผ($W$)์ ์กฐ์ ํ์ฌ ์์คํ ์ ์ฑ๋ฅ ํน์ฑ์ ๋ฐ๊ฟ ์ ์์ต๋๋ค. ์ด๋ ๋ฐ๋์ ์ง์ผ์ผ ํ ์ฒ ์น์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ฟผ๋ผ์ ๋์์น: $R + W > N$
์ฝ๊ธฐ ์ ์กฑ์์ ์ฐ๊ธฐ ์ ์กฑ์์ ํฉ์ด ์ ์ฒด ๋ ธ๋ ์($N$)๋ณด๋ค ์ปค์ผ ํฉ๋๋ค. ์ด ์กฐ๊ฑด์ด ๋ง์กฑ๋์ด์ผ๋ง ์ฝ๊ธฐ ์์ฒญ ์ ์ต์ํ ํ ๋ ์ด์์ ๋ ธ๋๋ ๋ฐ๋์ ๊ฐ์ฅ ์ต์ ์ ์ฐ๊ธฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง ๋ ธ๋์์ ๋ณด์ฅ๋ฐ์ ์ ์์ต๋๋ค.
- Write-Heavy ์์คํ : ์ฐ๊ธฐ ์ฑ๋ฅ์ด ์ค์ํ๋ค๋ฉด $W$๋ฅผ ๋ฎ์ถ๊ณ $R$์ ๋์ ๋๋ค. ํ์ง๋ง ์ต์ ๋ฐ์ดํฐ๋ฅผ ์ฐพ๊ธฐ ์ํด ๋ ๋ง์ ๋ ธ๋๋ฅผ ๋ค์ ธ์ผ ํ๋ฏ๋ก ์ฝ๊ธฐ ์ง์ฐ ์๊ฐ์ด ๋์ด๋ฉ๋๋ค.
- Read-Heavy ์์คํ : ์ฝ๊ธฐ ์ฑ๋ฅ์ด ์ค์ํ๋ค๋ฉด $W$๋ฅผ ๋์ด๊ณ (๋ชจ๋ ๋ ธ๋์ ๋ณต์ ) $R=1$๋ก ์ค์ ํฉ๋๋ค. ์ด๋ ๋ ธ๋์์ ์ฝ์ด๋ ์ต์ ๋ฐ์ดํฐ์์ ๋ณด์ฅ๋ฐ์ง๋ง, ์ฐ๊ธฐ ์ ๋จ ํ ๋์ ๋ ธ๋๋ง ์ฅ์ ๊ฐ ๋๋ ์ ์ฒด ์ฐ๊ธฐ๊ฐ ์คํจํ ์ํ์ด ์ปค์ง๋๋ค.
์ฅ์ ํ์ฉ ๋ฒ์
์ฟผ๋ผ ์์คํ ์์ ์ฐ๋ฆฌ๊ฐ ๊ฐ๋ดํด์ผ ํ ๋น์ฉ์ ๋ช ํํฉ๋๋ค. ์ ์ฒด ๋ ธ๋๊ฐ $N$๋์ผ ๋, ์์คํ ์ด ์ ์ ์๋ํ๊ธฐ ์ํด ๊ฒฌ๋ ์ ์๋ ์ต๋ ์ฅ์ ๋ ธ๋ ์๋ $F = (N-1)/2$์ ๋๋ค. ์๋ฅผ ๋ค์ด:
- 3๋ ์ค 1๋ ์ฅ์ ๊น์ง ํ์ฉ (์ฟผ๋ผ 2๋)
- 5๋ ์ค 2๋ ์ฅ์ ๊น์ง ํ์ฉ (์ฟผ๋ผ 3๋)
์ฌ๊ธฐ์ ํฅ๋ฏธ๋ก์ด ์ ์ ๋ ธ๋๋ฅผ 1๋ ์ถ๊ฐํ๋ค๊ณ ํด์ ํญ์ ์ฅ์ ํ์ฉ ๋ฅ๋ ฅ์ด ์ ํ์ ์ผ๋ก ๋์ด๋์ง ์๋๋ค๋ ๊ฒ์ ๋๋ค. ๋ ธ๋๊ฐ 3๋์ผ ๋์ 4๋์ผ ๋ ๋ชจ๋ ์ฅ์ ํ์ฉ์น๋ 1๋๋ก ๋์ผํฉ๋๋ค(4๋์ ๊ณผ๋ฐ์๋ 3๋์ด๋ฏ๋ก). ๋ฐ๋ผ์ ๋ถ์ฐ ์์คํ ์ํคํ ์ฒ๋ฅผ ์ค๊ณํ ๋๋ ํจ์จ์ ์ธ ์ฟผ๋ผ ๊ตฌ์ฑ์ ์ํด ๋ ธ๋ ์๋ฅผ ์ฃผ๋ก ํ์๋ก ์ ์งํ๋ ์ ๋ต์ ์ทจํฉ๋๋ค.
๐งฉ Leader & Follower
๋ถ์ฐ ์์คํ ์์ ํฉ์์ ๋๋ฌํ๋ ๊ฐ์ฅ ๋น ๋ฅธ ๋ฐฉ๋ฒ์ ๋ฌด์์ผ๊น์? ์์ด๋ฌ๋ํ๊ฒ๋ ์์ฌ๊ฒฐ์ ๊ถ์ ๋จ ํ ๋ช ์๊ฒ ๋ชฐ์์ฃผ๋ ๊ฒ์ ๋๋ค. ๋ชจ๋ ๋ ธ๋๊ฐ ์๋ก ์ ์์ ์ฃผ๊ณ ๋ฐ์ผ๋ฉฐ ์ธ์ฐ๋ ๋์ , ๋ชจ๋๊ฐ ์ธ์ ํ๋ ๋จ ํ ๋ช ์ ๋ฆฌ๋(Leader)๊ฐ ๋ช ๋ น์ ์์๋ฅผ ์ ํ๊ณ , ๋๋จธ์ง ํ๋ก์(Follower)๋ค์ ๊ทธ ๊ฒฐ์ ์ ๋ฌต๋ฌตํ ๋ฐ๋ฅด๋ ๋ฐฉ์์ ๋๋ค. ์ด ๊ณ์ธต์ ๊ตฌ์กฐ๋ ๋ณต์กํ ํฉ์ ๋ฌธ์ ๋ฅผ ๋จ์ํ โ๋ณต์ โ ๋ฌธ์ ๋ก ์นํํฉ๋๋ค.
๋ฆฌ๋๋ ์์คํ ์ ์ ๊ตฌ์ด์ ์ฌ๋ นํ์ ๋๋ค. ํด๋ผ์ด์ธํธ์ ๋ชจ๋ ์์ฒญ์ ๋ฆฌ๋์๊ฒ ์ง์ค๋๋ฉฐ, ๋ฆฌ๋๋ ์ด ์์ฒญ๋ค์ ์ผ๋ จ๋ฒํธ๋ฅผ ๋ถ์ฌํ์ฌ ๋ก๊ทธ์ ๊ธฐ๋กํฉ๋๋ค. ํ๋ก์๋ค์ ๋ฆฌ๋๊ฐ ๋ณด๋ด์ฃผ๋ ๋ก๊ทธ ์กฐ๊ฐ๋ค์ ์์ ์ ์ฅ๋ถ์ ์ฎ๊ฒจ ์ ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค. ๋๋ถ์ ๋คํธ์ํฌ ๋ฉ์์ง ๊ตํ ํ์๋ ํ๊ธฐ์ ์ผ๋ก ์ค์ด๋ค๊ณ , ์์คํ ์ ์ฒ๋ฆฌ๋(Throughput)์ ๋น์ฝ์ ์ผ๋ก ์์นํฉ๋๋ค.
์๊ธฐ์ ํํธ๋นํธ
์ ๋ ๊ถ๋ ฅ์ ๋ฐ๋์ ๋ถํจํ๊ฑฐ๋, ๋ ํํ ๊ฒฝ์ฐ๋ก๋ โ์ฃฝ์ต๋๋คโ. ๋ฆฌ๋ ๋ ธ๋์ ์ฅ์ ๊ฐ ๋ฐ์ํ๋ฉด ์ ์ฒด ์์คํ ์ด ๋ง๋น๋๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ํฉ์ ์๊ณ ๋ฆฌ์ฆ์ ์๊ธฐ(Term ๋๋ Epoch)๋ผ๋ ๋ ผ๋ฆฌ์ ์๊ฐ ๊ฐ๋ ์ ๋์ ํฉ๋๋ค.
๋ฆฌ๋๋ ์์ ์ด ์ด์์์์ ์ฆ๋ช ํ๊ธฐ ์ํด ํ๋ก์๋ค์๊ฒ ์ฃผ๊ธฐ์ ์ผ๋ก ํํธ๋นํธ(Heartbeat) ๋ฉ์์ง๋ฅผ ๋ณด๋ ๋๋ค. โ๋๋ ์์ง ๊ฑด์ฌํ๋ ์๋ก์ด ์ ๊ฑฐ๋ฅผ ์ด์ง ๋ง๋ผโ๋ ์ ํธ์ ๋๋ค. ๋ง์ฝ ์ ํด์ง ์๊ฐ(Election Timeout) ๋์ ํํธ๋นํธ๊ฐ ๋์ฐฉํ์ง ์์ผ๋ฉด, ํ๋ก์๋ค์ ๋ฆฌ๋์ ์ ๋ช ์ ๋ฌ๋ฆฌํ ๊ฒ์ผ๋ก ๊ฐ์ฃผํ๊ณ ์ฆ์ ๋ค์ ์๊ธฐ๋ฅผ ์์ํ๋ฉฐ ์๋ก์ด ๋ฆฌ๋ ์ ์ถ ํ๋ก์ธ์ค์ ๋์ ํฉ๋๋ค.
๋ฆฌ๋์ญ์ ์ ๋น์ฑ ํ์ธ
์๋ก์ด ๋ฆฌ๋๊ฐ ๋ํ๋ฌ์ ๋, ํ๋ก์๋ค์ ๊ทธ๊ฐ ๋ค๊ณ ์๋ โ์๊ธฐ ๋ฒํธโ๋ฅผ ํ์ธํฉ๋๋ค. ๋ง์ฝ ์์ ์ ๊ธฐ๋ก๋ณด๋ค ๋ฎ์ ๋ฒํธ๋ฅผ ๋ค๊ณ ์๋ ๋ฆฌ๋๊ฐ ๋ช ๋ น์ ๋ด๋ฆฐ๋ค๋ฉด, ํ๋ก์๋ ๊ทธ๋ฅผ โ๊ณผ๊ฑฐ์ ์ ๋ นโ์ผ๋ก ์ทจ๊ธํ๊ณ ๋ช ๋ น์ ๊ฑฐ๋ถํฉ๋๋ค. ์ด๋ ๋คํธ์ํฌ ์ง์ฐ์ผ๋ก ์ธํด ๋ค๋ฆ๊ฒ ๋์ฐฉํ ์ ๋ฆฌ๋์ ๋ฉ์์ง๊ฐ ์์คํ ์ ๊ต๋ํ๋ ๊ฒ์ ๋ง๋ ํต์ฌ ์์ ์ฅ์น์ ๋๋ค.
์๋์ ๋ณต์ ์ ๊ฐ์
ํ๋ก์๋ ๊ฒฐ์ฝ ๋ฌด๋ฅํ ์กด์ฌ๊ฐ ์๋๋๋ค. ๊ทธ๋ค์ ๋ฆฌ๋์ ๋ช ๋ น์ ๋ณต์ ํ๋ ๋์์, ๋ฆฌ๋๊ฐ ์ฟผ๋ผ(Quorum)์ ์ ์งํ๊ณ ์๋์ง ํ์ธํ๋ ํฌํ๊ถ์๋ค์ ๋๋ค. ๋ฆฌ๋๊ฐ ๋ณด๋ธ ๋ก๊ทธ๊ฐ ๊ณผ๋ฐ์ ์ด์์ ํ๋ก์์๊ฒ ์์ ํ๊ฒ ์ ๋ฌ๋์์ ๋๋ง ๊ทธ ๋ช ๋ น์ โํ์ (Commit)โ๋ฉ๋๋ค. ์ฆ, ๋ฆฌ๋๋ ์ ์ํ๊ณ ํ๋ก์๋ ๊ฒ์ฆํฉ๋๋ค.
๋ํ ํ๋ก์๋ ๋ฆฌ๋๊ฐ ๋ ๋ ธ๋๊ฐ ์ ๋ง๋ก ์๊ฒฉ์ด ์๋์ง(๊ฐ์ฅ ์ต์ ์ ๋ก๊ทธ๋ฅผ ๊ฐ์ก๋์ง)๋ฅผ ์ ๊ฑฐ ๊ณผ์ ์์ ์๊ฒฉํ ์ฌ์ฌํฉ๋๋ค. ๋ฆฌ๋์ ํ๋ก์์ ๊ด๊ณ๋ ๋จ์ํ ์ํ๊ด๊ณ๊ฐ ์๋๋ผ, ํฉ์๋ผ๋ ๊ณต๋์ ๋ชฉํ๋ฅผ ์ํด ์๋ก๋ฅผ ๊ฒฌ์ ํ๊ณ ๋ณด์ํ๋ ์ ๊ธฐ์ ์ธ ํ๋ ฅ ๊ด๊ณ์ ๊ฐ๊น์ต๋๋ค.
๋ณ๋ชฉ ํ์๊ณผ ์ฅ์ ์กฐ์น
๋ชจ๋ ์์ฒญ์ด ๋ฆฌ๋๋ฅผ ๊ฑฐ์ณ์ผ ํ๋ค๋ ์ ์ ๊ณง ๋ฆฌ๋๊ฐ ์์คํ ์ ๋ณ๋ชฉ ์ง์ (Bottleneck)์ด ๋ ์ ์์์ ์๋ฏธํฉ๋๋ค. ๋ํ ๋ฆฌ๋๊ฐ ๊ต์ฒด๋๋ ์งง์ ์ฐฐ๋์ ์๊ฐ ๋์ ์์คํ ์ ์ด๋ ํ ์์ฒญ๋ ์ฒ๋ฆฌํ ์ ์๋ โ๊ฐ์ฉ์ฑ ๊ณต๋ฐฑโ ์ํ์ ๋น ์ง๋๋ค. ํฉ์ ์๊ณ ๋ฆฌ์ฆ ์ค๊ณ์๋ค์ ์ด ๊ณต๋ฐฑ์ ๋ฐ๋ฆฌ์ด(ms) ๋จ์๋ก ์ค์ด๊ธฐ ์ํด ์ ๊ฑฐ ์๊ณ ๋ฆฌ์ฆ์ ์ต์ ํํ๊ณ , ํํธ๋นํธ ๊ฐ๊ฒฉ์ ์ ๊ตํ๊ฒ ํ๋ํ๋ ๋ฐ ์๋ง์ ๋ฐค์ ์ง์์๋๋ค.
๐งฉ Safety & Liveness
๋ชจ๋ ๋ถ์ฐ ์๊ณ ๋ฆฌ์ฆ์ ๋ช ์ธ์ ๊ฐ์ฅ ๊น์ ๊ณณ์๋ ๋ ๊ฐ์ง ์ฝ์์ด ์๊ฒจ์ ธ ์์ต๋๋ค. ํ๋๋ โ๊ฒฐ์ฝ ํ๋ฆฌ์ง ์๊ฒ ๋คโ๋ ์ฝ์์ด๊ณ , ๋ค๋ฅธ ํ๋๋ โ๊ฒฐ๊ตญ ํด๋ด๊ฒ ๋คโ๋ ์ฝ์์ ๋๋ค. ์ฐ๋ฆฌ๋ ์ด๋ฅผ ๊ฐ๊ฐ Safety์ Liveness๋ผ๊ณ ๋ถ๋ฆ ๋๋ค. ์ด ๋ ์์ฑ์ ๋ถ์ฐ ์์คํ ์ ์ ๋น์ฑ์ ํ๊ฐํ๋ ๊ฐ์ฅ ๊ทผ๋ณธ์ ์ธ ์ฃ๋์ด๋ฉฐ, ๋์์ ์๋ก๋ฅผ ๋ฐ์ด๋ด๋ ๊ธด์ฅ ๊ด๊ณ์ ๋์ฌ ์์ต๋๋ค.
Safety
Safety๋ ์์คํ ์ ์ ํฉ์ฑ(Consistency)์ ๋ด๋ณดํ๋ ์ฅ์น์ ๋๋ค. ๋ถ์ฐ ํฉ์์์ Safety๊ฐ ์ง์ผ์ง๋ค๋ ๊ฒ์, ์๋ก ๋ค๋ฅธ ๋ ๋ ธ๋๊ฐ ๋์ผํ ๋ก๊ทธ ์ธ๋ฑ์ค์ ๋ํด ์๋ก ๋ค๋ฅธ ๊ฐ์ ์ปค๋ฐํ๋ ๋น๊ทน์ด ๋ฐ์ํ์ง ์์์ ์๋ฏธํฉ๋๋ค. ์ผ๋จ ์ด๋ค ๊ฐ์ด โํฉ์โ๋์๋ค๊ณ ์ ์ธ๋๋ฉด, ๊ทธ ์ฌ์ค์ ์์ํ ๋ณํ์ง ์์์ผ ํฉ๋๋ค(Immutability).
๋ง์ฝ Safety๊ฐ ๊นจ์ง๋ค๋ฉด, ์ฌ์ฉ์ A๋ ์์ ์ ์๊ณ ๊ฐ 100์์ด๋ผ๊ณ ๋ฏฟ๋๋ฐ ์ฌ์ฉ์ B์ ํ๋ฉด์๋ 0์์ด๋ผ๊ณ ํ์๋๋ ๋ฐ์ดํฐ ์ค์ผ์ด ๋ฐ์ํฉ๋๋ค. ๋ถ์ฐ ์์คํ ์์ง๋์ด๋ค์๊ฒ Safety๋ ํํ ๋ถ๊ฐ๋ฅํ ์ฑ์ญ์ ๋๋ค. ์์คํ ์ด ์ ์ ๋ฉ์ถ์ง์ธ์ (Liveness ํฌ๊ธฐ), ์๋ชป๋ ์ ๋ณด๋ฅผ ์ง์ง๋ผ๊ณ ์ฐ๊ธฐ๋ ์ํฉ์ ์ ๋๋ก ์ฉ๋ฉ๋์ง ์์ต๋๋ค.
Safety์ ๋ถ๋ณ์ฑ
ํฉ์ ์๊ณ ๋ฆฌ์ฆ์์ Safety๋ฅผ ์ฆ๋ช ํ๊ธฐ ์ํด ํํ โ๋จ์กฐ ์ฆ๊ฐ(Monotonicity)โ ์ฑ์ง์ ์ด์ฉํฉ๋๋ค. ๋ก๊ทธ ์ธ๋ฑ์ค๋ ๋ค๋ก ๊ฐ ์ ์์ผ๋ฉฐ, ํ ๋ฒ ๊ฒฐ์ ๋ ๋ฆฌ๋์ ๊ณผ๊ฑฐ ์ด๋ ฅ์ ๋ฎ์ด์์์ง ์ ์๋ค๋ ๊ท์น๋ค์ด ๋ชจ์ฌ ์์คํ ์ ์ฒด์ Safety๋ฅผ ํ์ฑํฉ๋๋ค.
Liveness
๋ฐ๋ฉด Liveness๋ ์์คํ ์ ์ ์ง(Progress)๊ณผ ๊ด๋ จ์ด ์์ต๋๋ค. ์๋ฌด๋ฆฌ ์๋ฒฝํ๊ฒ ์์ ํ ์์คํ ์ด๋ผ๋, ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์์ํ ์๋ตํ์ง ์๋๋ค๋ฉด ๊ทธ๊ฒ์ ์ฃฝ์ ์์คํ ๊ณผ ๋ค๋ฆ์์ต๋๋ค. Liveness๋ โ์์คํ ์ ์ฐธ์ฌํ ์ ์์ ์ธ ๋ ธ๋๋ค์ด ์ถฉ๋ถํ๋ค๋ฉด, ๊ฒฐ๊ตญ์๋ ํฉ์์ ๋๋ฌํ๊ณ ์์ฒญ์ ์ฒ๋ฆฌํ๋คโ๋ ๊ฒ์ ๋ณด์ฅํฉ๋๋ค.
ํ์ค ์ธ๊ณ์์ Liveness๋ฅผ ์ํํ๋ ๊ฐ์ฅ ํฐ ์ ์ ๋ฌดํ ๋ฃจํ๋ ๊ต์ฐฉ ์ํ(Deadlock)๊ฐ ์๋๋ผ, ๋คํธ์ํฌ ํํฐ์ ๊ณผ ๋ฆฌ๋ ์ ์ถ์ ๋ฌดํ ๋ฐ๋ณต์ ๋๋ค. ์๋ฅผ ๋ค์ด, ๋ ๋ ธ๋๊ฐ ์ ํํ ๋์์ ๋ฆฌ๋ ์ ๊ฑฐ๋ฅผ ์์ํ๊ณ ๋๊ฐ์ด ํ ํ์ฉ ๋๋ ๊ฐ๋ ์ํฉ์ด ๋ฌดํํ ๋ฐ๋ณต๋๋ค๋ฉด ์์คํ ์ Liveness๋ ์๋ฉธํฉ๋๋ค. Raft๋ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด โ๋ฌด์์ ์ ๊ฑฐ ํ์์์โ์ด๋ผ๋ ์ง๊ทนํ ํ์ค์ ์ด๊ณ ์ฐ์ํ ํด๊ฒฐ์ฑ ์ ๋์ ํ์ต๋๋ค.
๋ถ๋ถ ๋๊ธฐํ ๋ชจ๋ธ
์์ ์ธ๊ธํ FLP ๋ถ๊ฐ๋ฅ์ฑ ์๋ฆฌ์ ๋ฐ๋ฅด๋ฉด, ์์ํ๊ฒ ๋น๋๊ธฐ์ ์ธ ํ๊ฒฝ์์๋ Safety์ Liveness๋ฅผ ๋์์ 100% ๋ง์กฑ์ํค๋ ๊ฒฐ์ ๋ก ์ ์๊ณ ๋ฆฌ์ฆ์ ๋ง๋ค ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ํ๋์ ํฉ์ ์๊ณ ๋ฆฌ์ฆ๋ค์ Partial Synchrony(๋ถ๋ถ ๋๊ธฐํ) ๋ชจ๋ธ์ ์ฑํํฉ๋๋ค.
์ด ๋ชจ๋ธ์์ ์์คํ ์ ํ์์๋ Safety์ Liveness๋ฅผ ๋ชจ๋ ๋ง์กฑํ๋ฉฐ ๊ธฐ๋ฏผํ๊ฒ ์์ง์ ๋๋ค. ํ์ง๋ง ๊ทน์ฌํ ๋คํธ์ํฌ ์ฅ์ ๊ฐ ๋ฐ์ํ๋ฉด, ์๊ณ ๋ฆฌ์ฆ์ ์ฆ์ Safety ๋ชจ๋๋ก ์ ํํฉ๋๋ค. โ์ ํํ ์ ์ ์๋ค๋ฉด ์๋ตํ์ง ์๋๋คโ๋ ์ ๋ต์ ์ทจํ๋ ๊ฒ์ ๋๋ค. ์ฅ์ ๊ฐ ํด์๋๊ณ ๋คํธ์ํฌ ์ง์ฐ์ด ์ผ์ ๋ฒ์ ์์ผ๋ก ๋ค์ด์ค๋ฉด, ์์คํ ์ ๋ค์ Liveness๋ฅผ ํ๋ณตํ๊ณ ๋ฉ์ท๋ ํฉ์๋ฅผ ์ฌ๊ฐํฉ๋๋ค.
๋ถ์ฐ ์์คํ ์ ํธ๋ ์ด๋์คํ
๊ฒฐ๊ตญ ์์ง๋์ด๋ง์ ์ ํ์ ๋ฌธ์ ์ ๋๋ค.
- Safety ์ฐ์ : ๊ธ์ต ์์คํ , ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ฆฌ ์์คํ . ๋ฐ์ดํฐ์ ์ ํ์ฑ์ด ์๋ช ์ด๋ฉฐ, ์ฅ์ ์ ์๋น์ค ์ค๋จ์ ๊ฐ์ํ๋๋ผ๋ ์ ํฉ์ฑ์ ์งํต๋๋ค.
- Liveness ์ค์ฌ: ์ค์๊ฐ ์คํธ๋ฆฌ๋ฐ, ๋จ์ ์บ์ ์์คํ . ์ต์ ๋ฐ์ดํฐ๊ฐ ์๋๋๋ผ๋ ์ผ๋จ ํ๋ฉด์ ๋ฌด์ธ๊ฐ ๋์ค๋ ๊ฒ์ด ์ค์ํ ๋ ์ ํํฉ๋๋ค. (๋ฌผ๋ก ์ด ๊ฒฝ์ฐ ์๊ฒฉํ ์๋ฏธ์ โํฉ์ ์๊ณ ๋ฆฌ์ฆโ๋ณด๋ค๋ ์ต์ข ์ผ๊ด์ฑ ๋ชจ๋ธ์ ์ฌ์ฉํฉ๋๋ค.)
Raft Election Restriction
ํฉ์ ์๊ณ ๋ฆฌ์ฆ์ ์ธ๊ณ์์ ๊ฐ์ฅ ๋์ฐํ ์๋๋ฆฌ์ค๋ โ๊ณผ๊ฑฐ๋ฅผ ๋ชจ๋ฅด๋ ๋ฆฌ๋โ๊ฐ ์ ์ถ๋๋ ๊ฒ์ ๋๋ค. ๋ง์ฝ ์ด๋ค ๋ ธ๋๊ฐ ์ด๋ฏธ ๊ณผ๋ฐ์์ ๋์๋ฅผ ์ป์ด ํ์ (Commit)๋ ๋ก๊ทธ๋ฅผ ๊ฐ์ง๊ณ ์์ง ์์ ์ฑ ๋ฆฌ๋๊ฐ ๋๋ค๋ฉด, ๊ทธ๋ ์์ ์ ๋น์ด์๋ ๋ก๊ทธ๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ค๋ฅธ ํ๋ก์๋ค์ ์์คํ ๋ฐ์ดํฐ๋ฅผ ๋ฎ์ด์์ ๋ฒ๋ฆด ๊ฒ์ ๋๋ค. Raft๋ ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ์ ์ถ ์ ์ฝ ์กฐ๊ฑด(Election Restriction)์ด๋ผ๋ ๋งค์ฐ ๋จ์ํ๋ฉด์๋ ๊ฐ๋ ฅํ ์์ ์ฅ์น๋ฅผ ๋์ ํ์ต๋๋ค.
๋ฐ์ดํฐ์ ์ต์ ์ฑ
Raft์ ๋ฆฌ๋ ์ ์ถ ๊ณผ์ ์ ๋ฏผ์ฃผ์ ์ด์ง๋ง, ๋์์ ์ฒ ์ ํ๊ฒ ์ค๋ ฅ(๋ฐ์ดํฐ์ ์ต์ ์ฑ) ์์ฃผ๋ก ๋์๊ฐ๋๋ค. ์ด๋ค ํ๋ณด์๊ฐ ํฌํ๋ฅผ ์์ฒญ(RequestVote)ํ๋๋ผ๋, ํฌํ๋ฅผ ํ๋ ํ๋ก์๋ ํ๋ณด์์ ๋ก๊ทธ๊ฐ ์ต์ํ ์์ ์ ๋ก๊ทธ๋ณด๋ค โ์ต์ (At least as up-to-date)โ์ธ์ง๋ฅผ ๋จผ์ ๊ฒ์ฌํฉ๋๋ค. ๋ง์ฝ ํ๋ณด์์ ๋ก๊ทธ๊ฐ ์์ ๋ณด๋ค ๋ค์ฒ์ ธ ์๋ค๋ฉด, ํ๋ก์๋ ๊ฐ์ฐจ ์์ด ํฌํ๋ฅผ ๊ฑฐ๋ถํฉ๋๋ค.
์ฌ๊ธฐ์ โ์ต์ ์ฑโ์ ํ๋จํ๋ ๊ธฐ์ค์ ๋ค์ ๋ ๊ฐ์ง ๊ท์น์ ์๊ฒฉํ ๋ฐ๋ฆ ๋๋ค.
- Term(์๊ธฐ) ๋น๊ต: ๋ง์ง๋ง ๋ก๊ทธ ์ํธ๋ฆฌ์ ์๊ธฐ ๋ฒํธ๊ฐ ๋ ํฐ ์ชฝ์ด ๋ ์ต์ ์ด๋ค.
- Index(์ธ๋ฑ์ค) ๋น๊ต: ๋ง์ฝ ์๊ธฐ ๋ฒํธ๊ฐ ๊ฐ๋ค๋ฉด, ๋ก๊ทธ์ ๊ธธ์ด๊ฐ ๋ ๊ธด(๋ง์ง๋ง ์ธ๋ฑ์ค๊ฐ ๋ ํฐ) ์ชฝ์ด ๋ ์ต์ ์ด๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
/**
* Raft Election Restriction
* * Raft์ Safety๋ฅผ ๋ณด์ฅํ๋ ํต์ฌ ๋ก์ง์ธ '๋ก๊ทธ ์ต์ ์ฑ ๋น๊ต'๋ฅผ ๋ค๋ฃน๋๋ค.
* ํ๋ณด์๊ฐ ๊ณผ๋ฐ์์ ๋์๋ฅผ ์ป๊ธฐ ์ํด์๋ ๋ฐ๋์ ํฌํ์์ ๋ก๊ทธ๋ณด๋ค ์ต์ ์ด์ด์ผ ํฉ๋๋ค.
*/
public class RaftNode {
private int currentTerm;
private String votedFor;
private List<LogEntry> log;
private NodeState state;
// ... ๊ธฐํ ํ๋ ๋ฐ ์์ฑ์ ์๋ต ...
/**
* ํ๋ณด์๋ก๋ถํฐ ์์ ํ RequestVote RPC๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค.
*/
public synchronized VoteResponse handleRequestVote(VoteRequest args) {
// 1. ์๊ธฐ ๋น๊ต: ํ๋ณด์์ ์๊ธฐ๊ฐ ํ์ฌ ๋์ ์๊ธฐ๋ณด๋ค ๋ฎ์ผ๋ฉด ๊ฑฐ์
if (args.getTerm() < this.currentTerm) {
return new VoteResponse(this.currentTerm, false);
}
// 2. ์๋ก์ด ์๊ธฐ ๋ฐ๊ฒฌ: ์๊ธฐ ์
๋ฐ์ดํธ ๋ฐ ์ํ ์ ํ
if (args.getTerm() > this.currentTerm) {
this.currentTerm = args.getTerm();
this.votedFor = null;
this.state = NodeState.FOLLOWER;
}
// 3. ํฌํ๊ถ ํ์ฌ ๊ฐ๋ฅ ์ฌ๋ถ ํ์ธ (votedFor ์ฒดํฌ)
if (this.votedFor == null || this.votedFor.equals(args.getCandidateId())) {
// ๋ด ๋ก์ปฌ ๋ก๊ทธ์ ๋ง์ง๋ง ์ํ ์ถ์ถ
int myLastLogIndex = this.log.size() - 1;
int myLastLogTerm = (myLastLogIndex >= 0) ? this.log.get(myLastLogIndex).getTerm() : 0;
/**
* [ํต์ฌ Logic] Raft Paper Section 5.4.1: Up-to-Date Restriction
* * 1. ๋ง์ง๋ง ๋ก๊ทธ์ ์๊ธฐ(Term)๊ฐ ๋ค๋ฅด๋ฉด, ๋ ๋์ ์๊ธฐ๋ฅผ ๊ฐ์ง ๋ก๊ทธ๊ฐ ์ต์ ์ด๋ค.
* 2. ๋ง์ง๋ง ๋ก๊ทธ์ ์๊ธฐ๊ฐ ๊ฐ๋ค๋ฉด, ๋ก๊ทธ์ ๊ธธ์ด(Index)๊ฐ ๋ ๊ธด ์ชฝ์ด ์ต์ ์ด๋ค.
*/
boolean isUpToDate = (args.getLastLogTerm() > myLastLogTerm) ||
(args.getLastLogTerm() == myLastLogTerm &&
args.getLastLogIndex() >= myLastLogIndex);
if (isUpToDate) {
this.votedFor = args.getCandidateId();
resetElectionTimer(); // ํฌํ ์น์ธ ์ ์ ๊ฑฐ ํ์ด๋จธ ์ด๊ธฐํ
return new VoteResponse(this.currentTerm, true);
}
}
// ๋ก๊ทธ๊ฐ ์ต์ ์ด ์๋๊ฑฐ๋ ์ด๋ฏธ ๋ค๋ฅธ ํ๋ณด์๊ฒ ํฌํํ ๊ฒฝ์ฐ
return new VoteResponse(this.currentTerm, false);
}
}
/**
* ๋ก๊ทธ ์ํธ๋ฆฌ๋ฅผ ๋ํ๋ด๋ ๋ถ๋ณ ๊ฐ์ฒด
*/
class LogEntry {
private final int term;
private final String command;
public LogEntry(int term, String command) {
this.term = term;
this.command = command;
}
public int getTerm() { return term; }
}
ํฌํ ๊ฑฐ๋ถ์ ๋ ผ๋ฆฌ
์ด ์ ์ฝ ์กฐ๊ฑด์ด ์ ์ค์ํ์ง ์ดํดํ๋ ค๋ฉด ์ฟผ๋ผ(Quorum)์ ์๋ฆฌ๋ฅผ ๋ค์ ๋ ์ฌ๋ ค์ผ ํฉ๋๋ค.
์ด๋ค ๋ก๊ทธ๊ฐ ์ปค๋ฐ๋์๋ค๋ ๊ฒ์ ์ด๋ฏธ ๊ณผ๋ฐ์(Quorum)์ ๋ ธ๋์ ํด๋น ๋ก๊ทธ๊ฐ ๋ณต์ ๋์์์ ์๋ฏธํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์๋ก์ด ๋ฆฌ๋๊ฐ ์ ์ถ๋๊ธฐ ์ํด์๋ ์ญ์ ๊ณผ๋ฐ์์ ํฌํ๊ฐ ํ์ํฉ๋๋ค. ์ด ๋ ๊ณผ๋ฐ์ ์งํฉ์ ๋ฐ๋์ ์ต์ํ ํ๋์ ๋ ธ๋๋ฅผ ๊ณต์ ํ๊ฒ ๋ฉ๋๋ค.
์ด ๊ณต์ ๋ ๋ ธ๋๋ ๋ฐ๋์ ์ปค๋ฐ๋ ์ต์ ๋ก๊ทธ๋ฅผ ๊ฐ์ง๊ณ ์์ ๊ฒ์ด๋ฉฐ, ์ ์ถ ์ ์ฝ ์กฐ๊ฑด์ ์ํด ์์ ๋ณด๋ค ๋ค์ฒ์ง ๋ก๊ทธ๋ฅผ ๊ฐ์ง ํ๋ณด์์๊ฒ๋ ์ ๋ ํฌํํ์ง ์์ต๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก, ์ปค๋ฐ๋ ๋ชจ๋ ๋ก๊ทธ๋ฅผ ๋ณด์ ํ ๋ ธ๋๋ง์ด ๋ฆฌ๋๋ก ๋น์ ๋ ์ ์๋ ์ํ์ ํ์ฐ์ฑ์ด ์์ฑ๋ฉ๋๋ค. Paxos๊ฐ ๋ณต์กํ ๋ก๊ทธ ๋ณต๊ตฌ ๊ณผ์ ์ ๊ฑฐ์น๋ ๊ฒ๊ณผ ๋ฌ๋ฆฌ, Raft๋ ์ ์ถ ๋จ๊ณ์์ ์์ ์๊ฒฉ ์๋ ๋ฆฌ๋๋ฅผ ๊ฑธ๋ฌ๋์ผ๋ก์จ ๋ฌธ์ ๋ฅผ ํ๊ธฐ์ ์ผ๋ก ๋จ์ํํ์ต๋๋ค.
๋ก๊ทธ ๋งค์นญ ์์ฑ
Raft์ ์ ์ถ ์ ์ฝ ์กฐ๊ฑด์ โ๋ฆฌ๋๊ฐ ๋ ๋ ธ๋์ ๋ก๊ทธ๋ ๋ฌด์กฐ๊ฑด ์ณ๋คโ๋ ์ ์ ๋ฅผ ๋ง๋ญ๋๋ค. ๋ฐ๋ผ์ ๋ฆฌ๋๋ ํ๋ก์์ ๋ก๊ทธ๋ฅผ ์ ๋ ์ญ์ ํ๊ฑฐ๋ ๋ฎ์ด์ฐ์ง ์์ผ๋ฉฐ, ์ค์ง ์์ ์ ๋ก๊ทธ๋ฅผ ํ๋ก์์๊ฒ ๊ฐ์ ๋ก ๋ณต์ ํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค. ์ด๋ ๋ณต์ ๋ก์ง์ ๋จ๋ฐฉํฅ์ผ๋ก ๋จ์ํํ์ฌ ๊ตฌํ์ ๋ณต์ก์ฑ์ ๋ฎ์ถ๋ ๊ฒฐ์ ์ ์ธ ์์ธ์ด ๋ฉ๋๋ค.
์ต์ ์ฑ ์ฒดํฌ์ ํ๊ณ์ ํธ๋ ์ด๋์คํ
ํ์ง๋ง ์ด ์ฐ์ํ ์ค๊ณ์๋ ์์ง๋์ด๋ง์ ์ธ ๋น์ฉ์ ์กด์ฌํฉ๋๋ค.
- ์ ๊ฑฐ ์ง์ฐ (Election Delay): ๋คํธ์ํฌ ํํฐ์ ์ด๋ ํน์ ๋ ธ๋์ ์ฆ์ ์ฌ์์์ผ๋ก ์ธํด ๋ก๊ทธ๊ฐ ํํธํ๋ ๊ฒฝ์ฐ, ์๋ก๊ฐ ์๋ก์ ์ต์ ์ฑ์ ์ธ์ ํ์ง ์์ ํฌํ๊ฐ ๋ฌด์ฐ๋๊ณ ์ฌ์ ๊ฑฐ๊ฐ ๋ฐ๋ณต๋๋ โLiveness ์ ํโ ํ์์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
- ๋ณต๊ตฌ ๋น์ฉ: ๊ฐ์ฅ ์ต์ ๋ก๊ทธ๋ฅผ ๊ฐ์ง ๋ ธ๋๊ฐ ํ๋์จ์ด ์ฅ์ ๋ก ์๊ตฌํ ๊ฒฉ๋ฆฌ๋๋ค๋ฉด, ์์คํ ์ ์ฐจ์ ์ ๋ก๊ทธ๋ฅผ ๊ฐ์ง ๋ ธ๋๋ฅผ ๋ฆฌ๋๋ก ์ธ์ฐ๊ธฐ ์ํด ๋ณต์กํ ์๋ ๊ฐ์ ์ด๋ ํน์ํ ํฉ์ ๋ฌด์ ์ ๋ต์ ์จ์ผ ํ ์๋ ์์ต๋๋ค.
๊ฒฐ๊ตญ Raft์ ์ ์ถ ์ ์ฝ ์กฐ๊ฑด์ โ์กฐ๊ธ ๋ฆ๋๋ผ๋(Liveness), ๊ณผ๊ฑฐ์ ์ง์ค์ ์์ด๋ฒ๋ฆฌ๋ ์ผ(Safety)์ ์ ๋ ์์ด์ผ ํ๋คโ๋ ๋ถ์ฐ ์์คํ ์ ์ฒ ํ์ ์ ํ์ด ๊ตฌํ๋ ๊ฒฐ๊ณผ๋ฌผ์ ๋๋ค.
Summary
ํฉ์ ์๊ณ ๋ฆฌ์ฆ์ ์ ๋ขฐํ ์ ์๋ ๋ถ์ฐ ํ๊ฒฝ์์ ๋จ์ผํ ์ง์ค์ ์ ์งํ๊ธฐ ์ํ ๋ ผ๋ฆฌ์ ํฌ์์ ์ฐ๋ฌผ์ ๋๋ค. ๋ณต์ ์ํ ๋จธ์ (SMR)์ ํตํด ๋ชจ๋ ๋ ธ๋๊ฐ ๋์ผํ ์คํ ๊ฒฝ๋ก๋ฅผ ๊ฑท๊ฒ ํ๋ฉฐ, ์ฟผ๋ผ(Quorum)์ด๋ผ๋ ์ํ์ ๊ฒฝ๊ณ๋ฅผ ์ค์ ํ์ฌ ๋ฌผ๋ฆฌ์ ์ธ ๋คํธ์ํฌ ๋จ์ ์์์๋ ๋ฐ์ดํฐ์ ๋ฌด๊ฒฐ์ฑ์ ์ํธํฉ๋๋ค. Raft์ ๊ฐ์ ํ๋์ ํ๋กํ ์ฝ์ ํจ์จ์ ์ธ ๋ฆฌ๋์ญ ๋ชจ๋ธ๊ณผ ์๊ฒฉํ ์ ์ถ ์ ์ฝ์ ๊ฒฐํฉํ์ฌ ์์คํ ์ ๋ณต์ก์ฑ์ ์ธ๊ฐ์ด ์ดํด ๊ฐ๋ฅํ ์์ค์ผ๋ก ์ ์ดํ๋ฉด์๋ ์์ ์ฑ(Safety)์ ์๋ฒฝํ ์ฆ๋ช ํด๋ ๋๋ค. ๊ฒฐ๊ตญ ํฉ์๋ ๋ถ์์ ํ ๋ฌผ๋ฆฌ ์ธ๊ณ ์์ ์๋ฒฝํ ๋ ผ๋ฆฌ ์ฒด๊ณ๋ฅผ ๊ตฌ์ถํ๋ ค๋ ์์ง๋์ด๋ค์ ์ ๊ตํ ํํ์ด์ ์์ ์ ๋๋ค.



