Raft and Other Stories
Consensus Trilogy: Part III
Raft and Other Stories Consensus Trilogy: Part III Rough Timeline - - PowerPoint PPT Presentation
Raft and Other Stories Consensus Trilogy: Part III Rough Timeline for Today Talk about logistics and lab 0 Raft: You should all know this better than I do. Quiz and midterm course evaluation. Lab 0 and 2 Some Observations Nearly
Consensus Trilogy: Part III
const NThreads = 1000 var wg sync.WaitGroup for i := 0; i < NThreads; i++ { wg.Add(1) go func(iter int) { run(endpoint) wg.Done() }(i) } wg.Wait()
const NThreads = 1000 var wg sync.WaitGroup for i := 0; i < NThreads; i++ { wg.Add(1) go func(iter int) { run(endpoint) wg.Done() }(i) } wg.Wait() func run(endpoint string) { conn, err := grpc.Dial(endpoint, grpc.WithInsecure()) if err != nil { ... } ... }
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)
Term Command Index
Term Command Index
Entries with the same term from the same leader.
Term Command Index
set(x, 5)
Entries with the same term from the same leader.
Term Command Index
set(x, 5) set(x, 6)
1
Entries with the same term from the same leader.
Term Command Index
set(x, 5) set(x, 6)
1 1
get(x)
2
Entries with the same term from the same leader.
Term Command Index
set(x, 5) set(x, 6)
1 1
get(x)
2
get(x)
3
Entries with the same term from the same leader.
Term Command Index
set(x, 5) set(x, 6)
1 1
get(x)
2
get(x)
3
Terms should not go back Entries with the same term from the same leader.
Term Command Index
set(x, 5) set(x, 6)
1 1
get(x)
2
set(x, 5) set(x, 6)
1 1
get(x)
2
set(x, 5) set(x, 6)
1 1
set(z, 2)
2
Term Command Index
set(x, 5) set(x, 6)
1 1
get(x)
2
set(x, 5) set(x, 6)
1 1
get(x)
2
set(x, 5) set(x, 6)
1 1
set(z, 2)
2
Two entries with the same index and term are identical.
Term Command Index
set(x, 5) set(x, 6)
1 1
get(x)
2
set(x, 5) set(x, 6)
1 1
get(x)
2
set(x, 5) set(x, 6)
1
set(z, 8)
2
Term Command Index
set(x, 5) set(x, 6)
1 1
get(x)
2
set(x, 5) set(x, 6)
1 1
get(x)
2
set(x, 5) set(x, 6)
1
set(z, 8)
2 1
set(y, 6)
3
Term Command Index
set(x, 5) set(x, 6)
1 1
get(x)
2
set(x, 5) set(x, 6)
1 1
get(x)
2
set(x, 5) set(x, 6)
1
set(z, 8)
2 1
set(y, 6)
3 1
set(y, 6)
3
Term Command Index
set(x, 5) set(x, 6)
1 1
get(x)
2
set(x, 5) set(x, 6)
1 1
get(x)
2
set(x, 5) set(x, 6)
1
set(z, 8)
2 1
set(y, 6)
3 1
set(y, 6)
3 1
set(y, 6)
3
Term Command Index
set(x, 5) set(x, 6)
1 1
get(x)
2
set(x, 5) set(x, 6)
1 1
get(x)
2
set(x, 5) set(x, 6)
1
set(z, 8)
2 1
set(y, 6)
3 1
set(y, 6)
3 1
set(y, 6)
3
If two logs agree on an entry, they agree on the prefix
Term Command Index
set(x, 5) set(x, 6)
1 1
get(x)
2
set(x, 5) set(x, 6)
1 1
get(x)
2
set(x, 5) set(x, 6)
1
set(z, 8)
2 1
set(y, 6)
3 1
set(y, 6)
3
If two logs agree on an entry, they agree on the prefix
Term Command Index
set(x, 5) set(x, 6)
1 1
get(x)
2
set(x, 5) set(x, 6)
1 1
get(x)
2
set(x, 5) set(x, 6)
1 1
set(y, 6)
3 1
set(y, 6)
3
If two logs agree on an entry, they agree on the prefix
Term Command Index
set(x, 5) set(x, 6)
1 1
get(x)
2
set(x, 5) set(x, 6)
1 1
get(x)
2
set(x, 5) set(x, 6)
1 1
set(y, 6)
3 1
set(y, 6)
3 1
get(x)
2
If two logs agree on an entry, they agree on the prefix
Term Command Index
set(x, 5) set(x, 6)
1 1
get(x)
2
set(x, 5) set(x, 6)
1 1
get(x)
2
set(x, 5) set(x, 6)
1 1
set(y, 6)
3 1
set(y, 6)
3 1
get(x)
2
If two logs agree on an entry, they agree on the prefix
1
set(y, 6)
3
Term
L e a d e r E l e c t i
Term
L e a d e r E l e c t i
R e i g n Term
L e a d e r E l e c t i
R e i g n L e a d e r E l e c t i
Term
L e a d e r E l e c t i
R e i g n L e a d e r E l e c t i
Term
L e a d e r E l e c t i
R e i g n L e a d e r E l e c t i
Term
set(x, 5) set(x, 5) set(x, 6)
set(x, 5) set(x, 5) set(x, 6)
1
AppendEntries(term=0, prevIdx =0, prevTerm=0, [(1,0, set(x,6)]) AppendEntries(term=0, prevIdx =0, prevTerm=0, [(1,0, set(x,6)])
set(x, 5) set(x, 5) set(x, 6)
1
AppendEntries(term=0, prevIdx =0, prevTerm=0, [(1,0, set(x,6)]) AppendEntries(term=0, prevIdx =0, prevTerm=0, [(1,0, set(x,6)])
How should the followers respond?
set(x, 5) set(x, 5) set(x, 6)
1
(0, Success) (0, Fail) set(x, 6)
1
set(x, 5) set(x, 5) set(x, 6)
1
(0, Success) (0, Fail) set(x, 6)
1
What can the leader infer from this interaction?
set(x, 5) set(x, 5) set(x, 6)
1
set(x, 6)
1
AppendEntries(term=-1, prevIdx=-1, prevTerm=-1, [(0,0, set(x, 5),(1,0, set(x,6)])
set(x, 5) set(x, 5) set(x, 6)
1
set(x, 6)
1
set(x, 5) set(x, 6)
1
set(x, 5) set(x, 5) set(x, 6)
1
set(x, 6)
1
set(x, 5) set(x, 6)
1
... ... ...
...
22
...
23
...
24
set(x, 5) set(x, 5) set(x, 6)
1
set(x, 6)
1
set(x, 5) set(x, 6)
1
... ... ...
...
22
...
23
...
24
set(x, 5) set(x, 5) set(x, 6)
1
set(x, 6)
1
set(x, 5) set(x, 6)
1
... ... ...
...
22
...
23
...
24 1
...
22
set(x, 5) set(x, 5) set(x, 6)
1
set(x, 6)
1
set(x, 5) set(x, 6)
1
... ... ...
...
22
...
23
...
24 1
...
22 1
...
22
set(x, 5) set(x, 5) set(x, 6)
1
set(x, 6)
1
set(x, 5) set(x, 6)
1
... ... ... 1
...
22 1
...
22
set(x, 5) set(x, 5) set(x, 6)
1
set(x, 6)
1
set(x, 5) set(x, 6)
1
... ... ... 1
...
22 1
...
22 1
...
22
set(x, 5) set(x, 5) set(x, 6)
1
set(x, 6)
1
set(x, 5) set(x, 6)
1
... ... ... 1
...
22 1
...
22 1
...
22
Log entries can be deleted. When is it safe to execute commands?
set(x, 5) set(x, 5) set(x, 6)
1
set(x, 6)
1
set(x, 5) set(x, 6)
1
...
2
...
3
...
4
...
2
RequestVote(term=1, lastLogIndex = 1, lastLogTerm = 0)
set(x, 5) set(x, 5) set(x, 6)
1
set(x, 6)
1
set(x, 5) set(x, 6)
1
...
2
...
3
...
4
...
2
RequestVote(term=1, lastLogIndex = 1, lastLogTerm = 0)
How should the followers respond?
set(x, 5) set(x, 5) set(x, 6)
1
set(x, 6)
1
set(x, 5) set(x, 6)
1
...
2
...
3
...
4
...
2
RequestVote(term=2, lastLogIndex = 2, lastLogTerm = 0)
set(x, 5) set(x, 5) set(x, 6)
1
set(x, 6)
1
set(x, 5) set(x, 6)
1
...
2
...
3
...
4
...
2
RequestVote(term=2, lastLogIndex = 2, lastLogTerm = 0)
How should the followers respond?
set(x, 5) set(x, 5) set(x, 6)
1
set(x, 6)
1
set(x, 5) set(x, 6)
1
...
2 1
...
2
RequestVote(term=2, lastLogIndex = 2, lastLogTerm = 1) ...
2
set(x, 5) set(x, 5) set(x, 6)
1
set(x, 6)
1
set(x, 5) set(x, 6)
1
...
2 1
...
2
RequestVote(term=2, lastLogIndex = 2, lastLogTerm = 1)
How should the followers respond?
...
2
1
1
1
1
1
1
1
1
1
1
2
2
2
2
1
1
1
1
1
1
1
1
1
1
2
2
2
2
1
1
1
1
1
1
1
1
1
1
2
2
2
2
1
1
1
1
1
1
1
1
1
1
2
2
2
2
3
3
1
1
1
1
1
1
1
1
1
1
2
2
2
2
3
3
1
1
1
1
1
1
1
1
1
1
2
2
2
2
3
3
1
1
1
1
1
1
1
1
1
1
2
2
2
2
3
3
4
4
1
1
1
1
1
1
1
1
1
1
2
2
2
2
3
3
4
4
2
2
Is this stable?
1
1
1
1
1
1
1
1
1
1
2
2
2
2
3
3
4
4
2
2
1
1
1
1
1
1
1
1
1
1
2
2
2
2
3
3
4
4
2
2
1
1
1
1
1
1
1
1
1
1
2
2
2
2
3
3
4
4
2
2
Is this legal?
1
1
1
1
1
1
1
1
1
1
2
2
2
2
3
3
4
4
2
2
3
3
1
1
1
1
1
1
1
1
1
1
3
3
3
3
1
1
1
1
1
1
1
1
1
1
3
3
3
3
3
3
1
1
1
1
1
1
1
1
1
1
3
3
3
3
3
3
3
3
1
1
1
1
1
1
1
1
1
1
3
3
3
3
3
3
3
3
3
3
Term Config Index
Term Config Index
Term Config Index
set(x, 5) set(x, 5) set(x, 6)
1
set(x, 6)
1
set(x, 5) set(x, 6)
1
...
2
...
3
...
4
...
2
set(x, 5) set(x, 5) set(x, 6)
1
set(x, 6)
1
set(x, 5) set(x, 6)
1
...
2
...
3
...
4
...
2
set(x, 5) set(x, 5) set(x, 6)
1
set(x, 6)
1
set(x, 5) set(x, 6)
1
...
2
...
3
...
4
...
2
C
5
set(x, 5) set(x, 5) set(x, 6)
1
set(x, 6)
1
set(x, 5) set(x, 6)
1
...
2
...
3
...
4
...
2
C
5
...
3
...
4
C
5
...
2
...
3
...
4
C
5
set(x, 5) set(x, 6)
1
...
2
...
3
...
4
C
5
set(x, 5) set(x, 6)
1
...
2
...
3
...
4
C
5
set(x, 5) set(x, 5) set(x, 6)
1
set(x, 6)
1
set(x, 5) set(x, 6)
1
...
2
...
2
...
3
...
4
C
5
set(x, 5) set(x, 5) set(x, 6)
1
set(x, 6)
1
set(x, 5) set(x, 6)
1
...
2
...
2
...
3
...
4
C
5
set(x, 5) set(x, 5) set(x, 6)
1
set(x, 6)
1
set(x, 5) set(x, 6)
1
...
2
...
2
...
3
...
4
C
5 1
...
3
set(x, 5) set(x, 5) set(x, 6)
1
set(x, 6)
1
set(x, 5) set(x, 6)
1
...
2
...
2
...
3
...
4
C
5 1
...
3
...
2 1
...
3
set(x, 5) set(x, 5) set(x, 6)
1
set(x, 6)
1
set(x, 5) set(x, 6)
1
...
2
...
2 1
...
3
...
2 1
...
3
set(x, 5) set(x, 5) set(x, 6)
1
set(x, 6)
1
set(x, 5) set(x, 6)
1
...
2
...
2 1
...
3
...
2 1
...
3
...
2 1
...
3
set(x, 5) set(x, 5) set(x, 6)
1
set(x, 6)
1
set(x, 5) set(x, 6)
1
...
2
...
2 1
...
3
...
2 1
...
3
...
2 1
...
3
What happens now?
set(x, 5) set(x, 5) set(x, 6)
1
set(x, 6)
1
set(x, 5) set(x, 6)
1
...
2
...
3
...
4
...
2
set(x, 5) set(x, 5) set(x, 6)
1
set(x, 6)
1
set(x, 5) set(x, 6)
1
...
2
...
3
...
4
...
2
set(x, 5) set(x, 5) set(x, 6)
1
set(x, 6)
1
set(x, 5) set(x, 6)
1
...
2
...
3
...
4
...
2
C-all
5
set(x, 5) set(x, 5) set(x, 6)
1
set(x, 6)
1
set(x, 5) set(x, 6)
1
...
2
...
3
...
4
...
2
C-all
5
...
3
...
4
...
2
...
3
...
4
C-all
5
set(x, 5) set(x, 6)
1
...
2
...
3
...
4
C-all
5
set(x, 5) set(x, 6)
1
...
2
...
3
...
4
C-all
5
set(x, 5) set(x, 5) set(x, 6)
1
set(x, 6)
1
set(x, 5) set(x, 6)
1
...
2
...
3
...
4
...
2
C-all
5
...
3
...
4
...
2
...
3
...
4
C-all
5
set(x, 5) set(x, 6)
1
...
2
...
3
...
4
C-all
5
set(x, 5) set(x, 6)
1
...
2
...
3
...
4
C-all
5
C-new
5
set(x, 5) set(x, 5) set(x, 6)
1
set(x, 6)
1
...
2
...
3
...
4
C-all
5
...
2
...
3
...
4
C-all
5
set(x, 5) set(x, 6)
1
...
2
...
3
...
4
C-all
5
set(x, 5) set(x, 6)
1
...
2
...
3
...
4
C-all
5
C-new
5
C-new
5
C-new
5
C-new
5