RSM & Paxos
Consensus Trilogy - Episode II
RSM & Paxos Consensus Trilogy - Episode II Replicated State - - PowerPoint PPT Presentation
RSM & Paxos Consensus Trilogy - Episode II Replicated State Machine What is the problem? Fault Tolerance by Replication KV-Store Client Fault Tolerance by Replication KV-Store Client set("s0", ...) Fault Tolerance by
Consensus Trilogy - Episode II
KV-Store Client
KV-Store
set("s0", ...)
Client
KV-Store
set("s0", ...) set("s1", ...)
Client
KV-Store
set("s0", ...) set("s1", ...) get("s0")->...
Client
KV-Store
set("s0", ...) set("s1", ...) get("s0")->...
Client
KV-Store
set("s0", ...) set("s1", ...) get("s0")->...
Client
get("s1")->☠
KV-Store
set("s0", ...) set("s1", ...) get("s0")->...
Client
get("s1")->☠
KV-Store
set("s0", ...) set("s1", ...) get("s0")->...
Client KV-Store
KV-Store
set("s0", ...) set("s1", ...) get("s0")->...
Client
get("s1")->☠
KV-Store
set("s0", ...) set("s1", ...) get("s0")->...
Client KV-Store
KV-Store
set("s0", ...) set("s1", ...) get("s0")->...
Client
get("s1")->☠ get("s1")->...
KV-Store
set("s0", ...) set("s1", ...) get("s0")->...
Client KV-Store
KV-Store
set("s0", ...) set("s1", ...) get("s0")->...
Client
get("s1")->☠ get("s1")->...
KV-Store
set("s0", ...) set("s1", ...) get("s0")->...
Client KV-Store •Replica takes over on failure.
KV-Store
set("s0", ...) set("s1", ...) get("s0")->...
Client
get("s1")->☠ get("s1")->...
KV-Store
set("s0", ...) set("s1", ...) get("s0")->...
Client KV-Store •Replica takes over on failure.
KV-Store
set("s0", ...) set("s1", ...) get("s0")->...
Client
get("s1")->☠ get("s1")->...
KV-Store
set("s0", ...) set("s1", ...) get("s0")->...
Client KV-Store •Replica takes over on failure.
KV-Store
set("s0", ...) set("s1", ...) get("s0")->...
Client
get("s1")->☠ get("s1")->...
KV-Store
set("s0", ...) set("s1", ...) get("s0")->...
Client KV-Store •Replica takes over on failure.
KV-Store
set("s0", ...) set("s1", ...) get("s0")->...
Client
get("s1")->☠ get("s1")->...
KV-Store
set("s0", ...) set("s1", ...) get("s0")->...
Client KV-Store •Replica takes over on failure.
KV-Store
set("s0", ...) set("s1", ...) get("s0")->...
Client KV-Store Client
set("s2", ...) set("s1", ...) get("s1")->...
Client
set("s1", ...) get("s0")->...
KV-Store
set("s0", ...) set("s1", ...) get("s0")->...
Client KV-Store Client
set("s2", ...) set("s1", ...) get("s1")->...
Client
set("s1", ...) get("s0")->...
In what order should these commands be run?
KV-Store Client KV-Store Client Client
KV-Store Client KV-Store Client Client
set("s1", 25)
KV-Store
set("s1", 42)
Client KV-Store Client Client
set("s1", 25)
KV-Store
set("s1", 42)
Client KV-Store Client
set("s1", 1729)
Client
set("s1", 25)
KV-Store
set("s1", 42)
Client KV-Store Client
set("s1", 1729)
Client
set("s1", 25) set("s1", 25)
KV-Store
set("s1", 42)
Client KV-Store Client
set("s1", 1729)
Client
set("s1", 25) set("s1", 25) set("s1", 42)
KV-Store
set("s1", 42)
Client KV-Store Client
set("s1", 1729)
Client
set("s1", 25) set("s1", 25) set("s1", 42) set("s1", 1729)
KV-Store
set("s1", 42)
Client KV-Store Client
set("s1", 1729)
Client
set("s1", 25) set("s1", 25) set("s1", 42) set("s1", 1729) set("s1", 1729)
KV-Store
set("s1", 42)
Client KV-Store Client
set("s1", 1729)
Client
set("s1", 25) set("s1", 25) set("s1", 42) set("s1", 1729) set("s1", 1729) set("s1", 42)
KV-Store
set("s1", 42)
Client KV-Store Client
set("s1", 1729)
Client
set("s1", 25) set("s1", 25) set("s1", 42) set("s1", 1729) set("s1", 1729) set("s1", 42)
KV-Store
set("s1", 42)
Client KV-Store Client
set("s1", 1729)
Client
set("s1", 25) set("s1", 25) set("s1", 42) set("s1", 1729) set("s1", 1729) set("s1", 42)
KV-Store
set("s1", 42)
Client KV-Store Client
set("s1", 1729)
Client
set("s1", 25) set("s1", 25) set("s1", 42) set("s1", 1729) set("s1", 1729) set("s1", 42)
KV-Store
set("s1", 42)
Client KV-Store Client
set("s1", 1729)
Client
set("s1", 25) set("s1", 25) set("s1", 42) set("s1", 1729) set("s1", 1729) set("s1", 42)
KV-Store
set("s1", 42)
Client KV-Store Client
set("s1", 1729)
Client
set("s1", 25) set("s1", 25) set("s1", 42) set("s1", 1729) set("s1", 1729) set("s1", 42)
KV-Store
set("s1", 42)
Client KV-Store Client
set("s1", 1729)
Client
set("s1", 25) set("s1", 25) set("s1", 42) set("s1", 1729) set("s1", 1729) set("s1", 42)
KV-Store
set("s1", 42)
Client KV-Store Client
set("s1", 1729)
Client
set("s1", 25) set("s1", 42) set("s1", 25) set("s1", 1729) set("s1", 42) set("s1", 25) set("s1", 1729)
KV-Store
set("s1", 42)
Client KV-Store Client
set("s1", 1729)
Client
set("s1", 25) set("s1", 42) set("s1", 25) set("s1", 1729) set("s1", 42) set("s1", 25) set("s1", 1729)
Proposers
Proposers Acceptors
Proposers Acceptors Learners
Proposers Acceptors Learners Propose values that should be selected from.
Proposers Acceptors Learners Propose values that should be selected from. Decide what value is ultimately accepted.
Proposers Acceptors Learners Propose values that should be selected from. Decide what value is ultimately accepted. Are told what decision was made and can then act on the decision.
Proposal: (id, value)
Proposal: (id, value)
Proposal: (id, value)
Proposal: (id, value)
Proposal: (id, value) (1, a) (2, b) (3, a) (4, a) (5, a) Chosen
prepare (1, a) a b c p r e p a r e ( 1 , a ) prepare (1, a) Prepare Message: prepare <proposal ID> Proposal ID: (<index>, <Sequence #>)
Want to propose cake Proposal: (0, z) Accepted: ∅ Proposal: (0, z) Accepted: ∅ Proposal: (0, z) Accepted: ∅ Proposal: (0, z) Accepted: ∅
promise (1, a) ∅ a b c p r
i s e ( 1 , a ) ∅ promise (1, a) ∅ Promise Message: promise <proposal ID> <accepted value>
Want to propose cake Proposal: (1, a) Accepted: ∅ Proposal: (1, a) Accepted: ∅ Proposal: (1, a) Accepted: ∅ Proposal: (0, z) Accepted: ∅
accept (1, a) cake a b c Accept Message: accept <proposal ID> <value>
Want to propose cake Proposal: (1, a) Accepted: ∅ Proposal: (1, a) Accepted: ∅ Proposal: (1, a) Accepted: ∅ Proposal: (0, z) Accepted: ∅
a c c e p t ( 1 , a ) c a k e accept (1, a) cake
a b c accepted cake
Want to propose cake Proposal: (1, a) Accepted: cake Proposal: (1, a) Accepted: cake Proposal: (1, a) Accepted: cake Proposal: (0, z) Accepted: ∅
prepare (1, b) a b c p r e p a r e ( 1 , b ) prepare (1, b) Prepare Message: prepare <proposal ID>
Want to propose ice cream Proposal: (1, a) Accepted: cake Proposal: (1, a) Accepted: cake Proposal: (1, a) Accepted: cake Proposal: (0, z) Accepted: ∅
promise (1, b) cake a 😟b c p r
i s e ( 1 , b ) c a k e promise (1, b) ∅ Promise Message: promise <proposal ID> <accepted value>
Proposal: (1, a) Accepted: cake Proposal: (1, b) Accepted: cake Proposal: (1, b) Accepted: cake Proposal: (1, b) Accepted: ∅ Want to propose ice cream
accept (1, b) cake a b c a c c e p t ( 1 , b ) c a k e accept (1, b) cake Prepare Message: prepare <proposal ID>
Want to propose ice cream Proposal: (1, a) Accepted: cake Proposal: (1, b) Accepted: cake Proposal: (1, b) Accepted: cake Proposal: (1, b) Accepted: ∅
a b c
Proposal: (1, a) Accepted: cake Proposal: (1, b) Accepted: cake Proposal: (1, b) Accepted: cake Proposal: (1, b) Accepted: cake
a b c
Proposal: (1, a) Accepted: cake Proposal: (1, a) Accepted: cake Proposal: (1, b) Accepted: cannoli Proposal: (1, b) Accepted: cannoli Proposal: (1, b) Accepted: cannoli
a b c
Proposal: (1, a) Accepted: cake Proposal: (1, a) Accepted: cake Proposal: (1, b) Accepted: cannoli Proposal: (1, b) Accepted: cannoli Proposal: (1, b) Accepted: cannoli
Is it possible to reach this situation?
a b c
Proposal: (1, a) Accepted: cake Proposal: (1, a) Accepted: cake Proposal: (1, b) Accepted: cannoli Proposal: (1, b) Accepted: cannoli Proposal: (1, b) Accepted: cannoli Want to propose cake
prepare (1, c) prepare (1, c) prepare (1, c)
prepare (1, a) a b c p r e p a r e ( 1 , a ) prepare (1, a)
Proposal: (0, z) Accepted: ∅ Proposal: (0, z) Accepted: ∅ Proposal: (0, z) Accepted: ∅
promise (1, a) ∅ a b c p r
i s e ( 1 , a ) ∅ promise (1, a) ∅
Proposal: (1, a) Accepted: ∅ Proposal: (1, a) Accepted: ∅ Proposal: (1, a) Accepted: ∅
prepare (1, b) a b c prepare (1, b) prepare (1, b)
Proposal: (1, a) Accepted: ∅ Proposal: (1, a) Accepted: ∅ Proposal: (1, a) Accepted: ∅
promise (1, b) ∅ a b c p r
i s e ( 1 , b ) ∅ p r
i s e ( 1 , b ) ∅
Proposal: (1, b) Accepted: ∅ Proposal: (1, b) Accepted: ∅ Proposal: (1, b) Accepted: ∅
a b c
Proposal: (1, b) Accepted: ∅ Proposal: (1, b) Accepted: ∅ Proposal: (1, b) Accepted: ∅
Accept for (1, a) will fail.
prepare (2, a) a b c p r e p a r e ( 2 , a ) prepare (2, a)
Proposal: (1, b) Accepted: ∅ Proposal: (1, b) Accepted: ∅ Proposal: (1, b) Accepted: ∅
promise (2, a) ∅ a b c p r
i s e ( 2 , a ) ∅ promise (2, a) ∅
Proposal: (2, a) Accepted: ∅ Proposal: (2, a) Accepted: ∅ Proposal: (2, a) Accepted: ∅
a b c
Proposal: (2, a) Accepted: ∅ Proposal: (2, a) Accepted: ∅ Proposal: (2, a) Accepted: ∅
Accept for (1, b) will fail.
a b c Can I be leader?
a b c Can I be leader?
Ballot: (0,z) Ballot: (0,z) Ballot: (0,z) p1a(a, (1,a)) p 1 a ( a , ( 1 , a ) ) p1a(a, (1,a))
a b c Can I be leader?
Ballot: (1, a) Accepted: [...] Ballot: (1, a) Accepted: [...] Ballot: (1, a) Accepted: [...] p1b((1,a), accepted) p 1 b ( ( 1 , a ) , a c c e p t e d ) p1b((1,a), accepted)
a b c
Ballot: (1, a) Accepted: [...] Ballot: (1, a) Accepted: [...] Ballot: (1, a) Accepted: [...]
a b c
Ballot: (1, a) Accepted: [...] Ballot: (1, a) Accepted: [...] Ballot: (1, a) Accepted: [...] p2a(a, <(1,a), 1, x>) p 2 a ( a , < ( 1 , a ) , 1 , x > ) p2a(a, <(1,a), 1, x>)
a b c
Ballot: (1, a) Accepted: [...] Ballot: (1, a) Accepted: [...] Ballot: (1, a) Accepted: [...] p2b((1, a)) p 2 b ( ( 1 , a ) ) p2b((1, a))
a b c
Ballot: (1, a) Accepted: [...] Ballot: (1, a) Accepted: [...] Ballot: (1, a) Accepted: [...] p2a(a, <(1,a), 2, y>) p 2 a ( a , < ( 1 , a ) , 2 , y > ) p2a(a, <(1,a), 2, y>)
a b c
Ballot: (1, a) Accepted: [...] Ballot: (1, a) Accepted: [...] Ballot: (1, a) Accepted: [...] p2b((1, a)) p 2 b ( ( 1 , a ) ) p2b((1, a))
a b c Can I be leader?
Ballot: (1,a) Ballot: (1,a) Ballot: (1,a) p1a(b, (1,b)) p1a(b, (1,b)) p 1 a ( b , ( 1 , b ) )
a b c
Ballot: (1,b) Ballot: (1,b) Ballot: (1,b)
a b c
Ballot: (1, b) Accepted: [...] Ballot: (1, b) Accepted: [...] Ballot: (1, b) Accepted: [...] p2b((1, b)) p 2 b ( ( 1 , b ) ) p2b((1, b))
a b c
Ballot: (1, b) Accepted: [...] Ballot: (1, b) Accepted: [...] Ballot: (1, b) Accepted: [...]