[Algorithm] ๋ถ์ฐ ํฉ์: raft, paxos, zab
๋ถ์ฐ ํฉ์(distributed consensus)๋ ๋ถ์ฐ์์คํ
์ ์ฑ์ง๊ณผ ํ๊ณ๋ฅผ ๊ฒฐ์ ์ง๋ ์ฃผ์ ์์ ์ค ํ๋๋ค.
๋ถ์ฐ ํฉ์๋, ๋
ธ๋๊ฐ ์ฌ๋ฌ๊ฐ์ธ ํด๋ฌ์คํฐ ํ๊ฒฝ์์ ์ฌ๋ฌ๊ฐ์ ๋
ธ๋๊ฐ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ณด์ ํ ๋ ๋
ธ๋๋ผ๋ฆฌ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋๊ธฐํํ๋ ๊ฒ์ ๋งํ๋ค.
๋ณ๊ฑฐ ์๋ ๊ฒ ๊ฐ์ง๋ง, ์ฌ์ค ๊ธฐ๊ธฐ ์์ค์ ์ฅ์ ๋ ๋คํธ์ํฌ ๋๋ ์ด ๊ฐ์ ์ฌ๋ฌ ๋ณ์๋ค ๋๋ฌธ์ ์ด์ ๋ํ ๊ณ ๋ ค ์์ด๋ ์ ๋ขฐ์ฑ ์๋ ์์คํ ์ ๋ง๋ค ์ ์๋ค.
์ฌ๊ธฐ์๋ ๋ถ์ฐ ํฉ์์ ์ฌ์ฉ๋๋ ์ฃผ์ ์๊ณ ๋ฆฌ์ฆ ๋ช๊ฐ์ง๋ฅผ ์ ๋ฆฌํด๋ณธ๋ค.
raft
๋๋ชฉ ์๊ณ ๋ฆฌ์ฆ์ด๋ผ๊ณ ๋ ๋ถ๋ฆฌ๋ ์ฃผ์ ์๊ณ ๋ฆฌ์ฆ ์ค ํ๋๋ค.
2013๋
์ Diego Ongaro์ John Ousterhout๊ฐ paxos์ ๋จ์ํ ๋์์ผ๋ก์ ์ ์ํ๋ค.
์ด์์ ์ ๋ขฐ์ฑ(Reliable), ๋ณต์ (Replicated), ์ค๋ณต(Redundant), ๋ด๊ฒฐํจ์ฑ(Fault-Tolerant)์ ๊ธ์๋ฅผ ์ ๋นํ ๋ฐ์ "Re - And Fault-Tolerant" => RAFT๊ฐ ๋ ๊ฒ์ด๋ค.
๋ฌธ์ ๋ฅผ ์ต๋ํ ๋จ์ํํด์ ํด๊ฒฐํ๋ ๊ธฐ๋ฒ์ด๋ค.
- ๋ ธ๋๋ผ๋ฆฌ ํฌํ๋ฅผ ํตํด leader๋ฅผ ์ ์ถํ๋ค.
- ๊ทธ๋ฌ๋ฉด ๋๊ธฐํ์ ๋ํ ๋ชจ๋ ์ฑ ์์ leader๊ฐ ๊ฐ๊ณ ์ ๋ชจ๋ ์ค๋์ฌ๋ฅผ ์ฒ๋ฆฌํ๋ค.

leader๋ ๋ฐ์ดํฐ ๋๊ธฐํ๋ ๋ก๊ทธ ๋ณต์ ๋ฅผ ์ด๊ดํ๋ค.
๋ง์ฝ leader๊ฐ ์คํจํ๊ฑฐ๋ ์ฅ์ ๊ฐ ๋ฐ์ํ๋ค๋ฉด ๋๋จธ์ง ๋
ธ๋๋ค๋ผ๋ฆฌ ์ leader๋ฅผ ์ ์ถํด์ ์ฑ
์์ ์์ํ๋ค.
์ด ๋งค์ปค๋์ฆ์ ๊ฐ์ฅ ํฐ ์ฅ์ ์ ๋จ์์ฑ๊ณผ ๊ตฌํ์ ์ฉ์ด์ฑ์ด๋ค.
cockroachDB, elasticsearch, redis, etcd, rabbitMQ, clickhouse, nats ๋ฑ ํด๋ฌ์คํฐ๋ง์ ์ง์ํ๋ ๋ง์ ์์ฉ DB ์์คํ ๋ค์์ ์ฌ์ฉํ๊ณ ์๋ค.
mongoDB ๊ฐ์ ๊ฒฝ์ฐ๋ raft์ ๋ณํ์ ์ฌ์ฉํ๋ค.
paxos๋ฅผ ์ฌ์ฉํ๋ ์๋น์์ ์์คํ
๋ค๋ raft๋ก ์ฎ๊ฒจ๊ฐ๋ ค๋ ์์ง์์ ๋ณด์ด๊ณค ํ๋ค.
raft๊ฐ ์ถ๊ตฌํ๋ ๋ฐฉํฅ์ฑ์ ๊ฐ์ฉ์ฑ์ด๋ค.
๋น ๋ฅธ ํ๋ณต๊ณผ ๋ณต๊ตฌ์ ์ด์ ์ ๋ง์ท๊ธฐ ๋๋ฌธ์, ์ฅ์ ์ ๋ฐ์ํ ์ ์๋ ์ฝ๊ฐ์ ๊ฒฐํจ, ๋ฐ์ดํฐ ๋ถ์ผ์น ๋ฑ์ด ๋จ์ ์ผ๋ก ๊ผฝํ๊ณค ํ๋ค.
paxos
paxos๋ raft๊ฐ ๋ฑ์ฅํ๊ธฐ ์ด์ ์ ์ฃผ๋ก ์ฌ์ฉ๋์๋ ํฉ์ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. 1989๋ ์ฆ์์ ์ ์๋์๋ค.
raft๊ฐ ๊ฐ์ฉ์ฑ์ ์ป๊ณ ์ฝ๊ฐ์ ์ ํ์ฑ์ ํฌ๊ธฐํ ๊ฒ๊ณผ ๋ฐ๋๋ก, paxos๋ ๊ฐ์ฉ์ฑ์ ์ข ํฌ๊ธฐํ ๋์ ์ ํ์ฑ์ ๊ฐ์ ธ๊ฐ๋ ๊ฒ์ ์งํฅํ๋ค.
๊ตฌํ์ด ๋ณต์กํ ํธ์ด๊ณ , ๋ ธ๋์ ์ค์๊ฐ ์ถ๊ฐ/์์ ๋ฑ์ ์ด๋ ค์๋ ์๊ณ ํด์ ์๋ก ๋ง๋ค์ด์ง๋ ์์คํ ๋ค์๋ ์ ์ฌ์ฉ๋์ง ์๋๋ค.
์ ์ ์์ฒด๊ฐ ์กฐ๊ธ ์ถ์์ ์ธ ํธ์ด๋ค.
Raft์ ๋น์ทํ๊ฒ leader์ ๊ฐ๋
์ ์ฌ์ฉํ๊ธด ํ๋ค.
paxos๋ 3๊ฐ์ง ์ฃผ์ ์ญํ ์ ํตํด ๋๊ธฐํ์์์ ํฉ์๋ฅผ ๊ตฌํํ๋ค.
-
Proposer์ ํฉ์๋ฅผ ์ ์ํ๋ค.
ํฉ์๋ฅผ ์ ์ํ ๋ ์์์ ํน์ ์ซ์๊ฐ N, ์ ์กฑ์์ ์ฐธ์ฌํ Proposer ๋ชฉ๋ก์ ํจ๊ป ๋๊ฒจ์ค๋ค. ์์ ๋์์ Acceptor๊ฐ ๋๋ค. ์ด๋ฅผ prepare ๋จ๊ณ๋ผ๊ณ ํ๋ค.
N์ ์ด์ ์ซ์๊ฐ๋ณด๋ค ํญ์ ํฐ ๊ฐ์ ๋ณด๋ด๋๋ก ํ๋ค. -
Acceptor๋ Proposer์๊ฒ์ ํฉ์ ์ ์์ ๋ฐ๊ณ ์ฒ๋ฆฌํ๋ค.
- prepare ๋ฉ์ธ์ง๋ก ์จ N์ด ์ด์ ์ ๋ฐ์ ๊ฐ์ฅ ํฐ N๋ณด๋ค ์๋ค๋ฉด ํฉ์๋ฅผ ๊ฑฐ๋ถํ๋ค.
- prepare ๋ฉ์ธ์ง๋ก ์จ N์ด ์ด์ ์ ๋ฐ์ ๊ฐ์ฅ ํฐ N๋ณด๋ค ํฌ๋ค๋ฉด ํฉ์๋ฅผ ์์ฉํ๋ค. ๊ทธ๋ฆฌ๊ณ proposer์๊ฒ ๋ฉ์ธ์ง๋ฅผ ๋ฐํํด์ค๋ค. ์ด๋ฅผ promise๋ผ๊ณ ํ๋ค. promise๊ฐ ์ด๋ฃจ์ด์ก๋ค๋ฉด acceptor๋ ์ดํ์ ํฉ์ ์ ์์ ๋ฌด์ํ๋ค.
-
Proposer๊ฐ Acceptor๋ก๋ถํฐ promise๋ฅผ ๋ฐ์ผ๋ฉด, v๋ผ๋ ์์์ ๊ฐ์ ์ค์ ํด์ ๋ค์ Acceptor์๊ฒ Accept ์์ฒญ์ ๋ณด๋ธ๋ค. ๊ทธ๋ฆฌ๊ณ Acceptor๋ก๋ถํฐ Accept๊ฐ ๋จ์ด์ง๋ฉด ํฉ์์ ์ฑ๊ณตํ ๊ฒ์ด๋ค. ์ ์กฑ์๊ฐ ๋ณดํต์ ๊ทธ ์ฑ๊ณต์ ๊ธฐ์ค์ด ๋ ๊ฒ์ด๋ค.
-
Learner๋ ํฉ์ ๊ฒฐ๊ณผ๋ฅผ ๋ชจ๋์๊ฒ ๋ฐํํ๋ ์ญํ ์ ๋งก๋๋ค.
paxos ์์ฒด์๋ leader์ ๊ฐ๋ ์ด ๋ช ์๋์ด์์ง๋ ์์ง๋ง, proposer๊ฐ ์์ ์ด leader๊ฐ ๋๊ณ ์ถ๋ค๊ณ ์ฃผ์ฅํ๊ณ acceptor๋ค์ด ์น์ธํ๋ค๋ฉด leader๊ฐ ๋ ์ ์๋ค.
GCP Spanner, DynamoDB, ScyllaDB, CassandraDB ๋ฑ์ DB ์์คํ
๋ค์ด ์ด ๋งค์ปค๋์ฆ์ ์ฌ์ฉํ๋ค.
์ฌ๊ธฐ์ ScyllaDB๋ ๊ฒฝ๋ ํธ๋์ญ์
์๋ง ์ฌ์ฉํ๋๋ฐ, ์ด๋ง์ ๋ ๊ฑท์ด๋ด๊ณ ์๋ ์ค์ด๋ผ๊ณ ํ๋ค. (RAFT๋ก ์ด์ )
AWS ECS ๊ฐ์ ํด๋ฌ์คํฐ ์๋น์ค๋ paxos ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๊ณค ํ๋ค.
zab
zab์ Zookeeper Atomic Broadcast์ ์ค๋ง๋ก, ์ฃผํคํผ์์ ์ฌ์ฉํ๋ ๋ถ์ฐ ํฉ์ ๋งค์ปค๋์ฆ์ด๋ค.
์ด ๋งค์ปค๋์ฆ์ ์์์ ๋ณด์ฅ์ ์ต์ ํ๋์ด์๋ค.
"๋ชจ๋ ๋ ธ๋์ ๋ํด์" ์์๊ฐ ๋ช ํํ๊ฒ ๋ณด์ฅํ๋ ๊ฒ์ ๋ชฉํ๋ก ํ๋ค.
zab๋ ์ฌํ ๋ถ์ฐ ๊ตฌ์กฐ์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋จ์ผ leader์ ์ฌ๋ฌ๊ฐ์ follower๊ฐ ๋ฐ๋ผ์ค๋ ์ค์์ง๊ถํ ๊ตฌ์กฐ๋ฅผ ์งํฅํ๋ค.
raft์ ๋น์ทํ๊ฒ ํฌํ๋ฅผ ํตํด์ leader๋ฅผ ์ ์ถํ๋ค.
write๋ ๋ฌด์กฐ๊ฑด leader๊ฐ ์ฑ
์์ง๊ณ ๋ฐ์์ follow๋ค์๊ฒ ์ง์ ๋๊ธฐํํ๋ค. ์ฌ๊ธฐ์๋ ์์ ํ ๋ณต์ ๋ฅผ ์ํด 2๋จ๊ณ ์ปค๋ฐ์ ์ฌ์ฉํ๋ค.
read์ ๊ฒฝ์ฐ์๋ ๋ชจ๋ ๋
ธ๋๊ฐ ๊ณตํํ๊ฒ ๋ก๋๋ฐธ๋ฐ์ฑ์ ํ๋ค.
๊ทธ๋ฆฌ๊ณ zab์ ํญ์ ์๋น leader๋ฅผ ๋ฏธ๋ฆฌ ์ ์ถํด๋๋ค๊ฐ, ๊ธฐ์กด leader์๊ฒ ๋ฌธ์ ๊ฐ ์๊ธฐ๋ฉด ๋ฐ๋ก leader๋ฅผ ๊ต์ฒดํ๊ณ ๊ธฐ์กด leader๋ฅผ ๋ฒ๋ฆฌ๋ ๋ฐฉ์์ ์ทจํ๋ค. ์๋น leader์๊ฒ๋ ์ต์ํ์ leader ์์ ํ์คํ ๋ฆฌ๊ฐ ๋ณด๊ด๋์ด์๊ธฐ ๋๋ฌธ์ ์์ค์ ์ค์ผ ์ ์๋ค.
์ฐธ์กฐ
https://medium.com/@adityashete009/the-zab-algorithm-502781c54498
https://medium.com/@remisharoon/paxos-vs-raft-vs-zab-a-comprehensive-dive-into-distributed-consensus-protocols-6243a3f6539b
https://en.wikipedia.org/wiki/Paxos_(computer_science)
https://www.scylladb.com/glossary/paxos-consensus-algorithm/
https://medium.com/@mani.saksham12/raft-and-paxos-consensus-algorithms-for-distributed-systems-138cd7c2d35a
https://gruuuuu.github.io/integration/paxos-raft/
https://stackoverflow.com/questions/45871855/paxos-vs-raft-for-leader-election
https://www.linkedin.com/pulse/zab-consensus-algorithm-yeshwanth-n