This document summarizes an Erlang meeting held on July 3, 2009 in Tokyo. It discusses the gen_paxos Erlang module, which implements the Paxos consensus algorithm. Paxos is needed to solve problems like split-brains where data could become inconsistent without coordination between nodes. The document explains the key aspects of Paxos like its phases, data model in gen_paxos, and how nodes communicate through message passing in Erlang. It also provides references to related works and papers about Paxos.
1 of 29
Download to read offline
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
More Related Content
genpaxospublic-090703114743-phpapp01.pdf
1. gen_paxos
kuenishi
2009/7/3 3rd Erlang‐meeting in
Shirogane‐takanawa, Tokyo
2. kuenishi@gmail.com
Erlang Python
See id:kuenishi, g:erlang:id:kuenishi, @kuenishi
http://github.com/kuenishi
http://bitbucket.org/kuenishi
Recent Activities
Yet another TC‐Erlang binding
http://bitbucket.org/kuenishi/yatce/
Mercurial l10n
1.3 has been released on 7/1!
http://bitbucket.org/foozy/mercurial‐translation‐ja/
2
3. Outline
Introduction
Why PAXOS?
What is PAXOS?
How can we implement PAXOS?
Why Erlang?
Where is PAXOS?
When?
Appendix
Notice: Basically English, Sometimes Japanese
3
4. Introduction – what is gen_paxos?
GENeric PAXOS module written in Erlang
Reduction of the cost of re‐invention of wheels.
At first, I had aimed to make it sth like ‘behaviour’
http://github.com/kuenishi/gen_paxos
Related works (I think not enough)
libpaxos
gen_leader
Why not enough?
4
5. Why PAXOS?
Split Brain
Typically, broken switches / wires
Both master and slave updates independently
ID
name
addr
ID
name
addr
0
Hage
0
Hage
1
hoge
1
hoge
…
…
…
…
…
…
Replication Master
Replication Slave
Data Inconsistency! Ouch!
5
6. Why PAXOS? – cont’d
Split Brain Problem
Separate actors can’t coordinate
Lacking coordination ‐> Multi‐master
Multi‐master ‐> Data Inconsistency
Inconsistency ‐> Tragedy
Typically, BigTable solely depends upon Chubby[2]
BigTable’s Master Election, so on.
Byzantine Generals Problem
A faulty actor who lies destroys consistency
I don’t know current implementation of gen_paxos solves
this problem – not in scope
See Byzantine PAXOS in Wikpedia[6]
6
7. What is PAXOS?
Distributed Consensus/Coordination Algorithm
Masterless (no SPOF)
Robust to split brain environment such as network
separation
Proved to converge within infinite time period[9]
Works iff majority of fixed group of actors is alive
and communicable
7
10. What is PAXOS? – data model in gen_paxos
Actors
n processors with processor ID
Data
Instance ID (Subject)
Proposal ID (N)
Proposal itself (Value)
N should be unique
ID
1
2
3
4
5
At first, V differs
n(1)
1
2
3
4
5
later V converges
n(2)
6
7
8
9
10
n(3)
11
12
13
14
15
n(4)
16
17
18
19
20
n(…)
…
…
..
…
..
10
11. What is PAXOS? – details in gen_paxos
Basic sequence of Each actor
Prepare Phase
If Prepare comes, agree or disagree be Acceptor
If Prepare doesn’t come, send Prepare be Proposer
If majority of group agrees Prepare, send Propose
If timeout, increase n and restart Prepare phase
Propose Phase
Acceptor – agree to Propose (ignoring lower n)
Proposer – decided if majority agrees
If timeout, increase n and restart Prepare phase
Commit Phase
Send the committed Value again to notify
11
12. What is PAXOS? – details in gen_paxos
Basic sequence of Each actor
Prepare Phase
Prepare Acceptor
Prepare Prepare Proposer
Prepare Propose
n
Propose Phase
Acceptor ‐ Propose n
Proposer ‐
n Prepare Phase
Commit Phase
12
13. What is PAXOS? – details in gen_paxos
Basic sequence of Each actor
Prepare Phase
Prepare Acceptor
Prepare Prepare Proposer
Prepare Propose
n
Propose Phase
Acceptor ‐ Propose
Proposer ‐
n Prepare Phase
Commit Phase
13
16. How can we implement PAXOS? (2/2)
2. Write an FSM code
Define a set of
Module:State/2
Module:State(Event, Data)
‐> {next_state,
NextState, NextData}
(See paxos_fsm.erl for details)
16
17. Process Architecture of a Node (gen_paxos.erl)
A‐little‐bit load balancing
Not pursuing consensus performance
Thinkin’bout Chubby[5] (no dynamic node addition/removal)
gen_fsm:start_link/4 gen_fsm starts for
Creates gen_fsm after each subject
receiving message
Sends message after
balancing with paxos_fsm(Key)
erlang:phash(Key,3) coordinator0
coordinator1
coordinator2
puts the result
into process
gen_paxos.erl dictionary after
receiving message
User
process
Sends message
after getting
{Key, Value}
consensus
17
18. Messaging between nodes (paxos_fsm.erl)
FSMs talk each other by sending events with globalname()
globalname() = {global, GlobalName}
GlobalName is for first argument of gen_fsm:start_link/4
gen_fsm:send_event/2 sends Events to remote nodes
gen_fsm:send_event({global, GlobalName}, Event). – that’s all.
Anyway, no need to design application protocol, object
serialization, nor GoF ‘State, Observer’ pattern! That’s
WHY ERLANG!!
gen_fsm:send_event/2
nodeA
nodeB
nodeC
paxos_fsm
paxos_fsm
paxos_fsm
coordinators
coordinators
coordinators
User User User
process
process
process
18