weaveworks-
Effortless Eventual Consistency
Gossip, CRDTs, and Weave Mesh
E ff ortless Eventual Consistency Gossip, CRDTs, and Weave Mesh - - PowerPoint PPT Presentation
E ff ortless Eventual Consistency Gossip, CRDTs, and Weave Mesh weave works - Outline Theory Practice Extension weave works - Outline Theory Gossip CRDT Practice Weave Mesh Weave Net Extension
weaveworks-
Gossip, CRDTs, and Weave Mesh
weaveworks-
weaveworks-
Gossip CRDT
Weave Mesh Weave Net
User data types Strong consistency
weaveworks-
Increment-only counter
weaveworks-
Increment-only counter
Increment
weaveworks-
Increment-only counter
1
Increment
weaveworks-
Increment-only counter
1
weaveworks-
Increment-only counter
1
Increment
weaveworks-
Increment-only counter
2
Increment
weaveworks-
Increment-only counter
2
weaveworks-
Increment-only counter
2
Increment Increment Increment Increment
weaveworks-
Increment-only counter
☹
Increment Increment Increment Increment
weaveworks-
Increment-only counter
Increment Increment Increment Increment
😰
weaveworks-
Increment-only counter
Increment Increment Increment Increment
2
weaveworks-
Increment-only counter
Increment Increment Increment Increment
2
weaveworks-
Increment-only counter
Increment Increment Increment Increment
3
weaveworks-
Increment-only counter
Increment Increment Increment
3
weaveworks-
Increment-only counter
Increment Increment Increment
3
weaveworks-
Increment-only counter
Increment Increment Increment
4
weaveworks-
Increment-only counter
Increment Increment
4
weaveworks-
Increment-only counter
Increment Increment
4
weaveworks-
Increment-only counter
Increment Increment
5
weaveworks-
Increment-only counter
Increment
5
weaveworks-
Increment-only counter
Increment
5
weaveworks-
Increment-only counter
Increment
6
weaveworks-
Increment-only counter
6
weaveworks-
Increment-only counter
6
weaveworks-
weaveworks-
weaveworks-
1x 1x
weaveworks-
weaveworks-
1x
weaveworks-
1x
weaveworks-
☹ ☹ ☹ ☹ ☹ ☹ ☹
1x
weaveworks-
weaveworks-
weaveworks-
weaveworks-
weaveworks-
weaveworks-
weaveworks-
weaveworks-
weaveworks-
weaveworks-
weaveworks-
weaveworks-
weaveworks-
weaveworks-
weaveworks-
weaveworks-
weaveworks-
weaveworks-
Increment-only counter
weaveworks-
Increment-only counter
weaveworks-
Increment-only counter
Increment
weaveworks-
Increment-only counter
1
Increment
weaveworks-
Increment-only counter
1
weaveworks-
Increment-only counter
1
t=1
weaveworks-
Increment-only counter
1 1
t=2
weaveworks-
Increment-only counter
1 1 1 1
t=3
weaveworks-
Increment-only counter
1 1 1 1 1 1
t=4
weaveworks-
Increment-only counter
1 1 1 1 1 1 1
t=5
weaveworks-
Increment-only counter
1 1 1 1 1 1 1 1
t=6
weaveworks-
Increment-only counter
1 1 1 1 1 1 1 1 1
t=7
weaveworks-
Increment-only counter
1 1 1 1 1 1 1 1 1
t=7
weaveworks-
Increment-only counter
weaveworks-
Increment-only counter
weaveworks-
Increment-only counter
1
weaveworks-
Increment-only counter
2
weaveworks-
Increment-only counter
2
weaveworks-
Increment-only counter
2 1 1 1 1 1 1 1 1
weaveworks-
Increment-only counter
weaveworks-
Increment-only counter
Increment
weaveworks-
Increment-only counter
Increment
weaveworks-
Increment-only counter
1
Increment
weaveworks-
Increment-only counter
1
Read
weaveworks-
Increment-only counter
😧 😧 😧 😧 😧 😧 😧 😧
x
weaveworks-
weaveworks-
weaveworks-
weaveworks-
weaveworks-
weaveworks-
weaveworks-
weaveworks-
weaveworks-
Increment-only counter CmRDT
weaveworks-
Increment-only counter CmRDT
weaveworks-
Increment-only counter CmRDT
Increment
weaveworks-
Increment-only counter CmRDT
1
Increment
weaveworks-
Increment-only counter CmRDT
1
weaveworks-
Increment-only counter CmRDT
1
A++
weaveworks-
Increment-only counter CmRDT
1 1
A++
weaveworks-
Increment-only counter CmRDT
1 1
weaveworks-
Increment-only counter CmRDT
1 1
A++
weaveworks-
Increment-only counter CmRDT
1 1 1
A++
weaveworks-
Increment-only counter CmRDT
1 1 1
weaveworks-
Increment-only counter CmRDT
1 1 1
Read
weaveworks-
Increment-only counter CmRDT
1 1 1
Read
Σ
= 1
weaveworks-
weaveworks-
Increment-only counter CmRDT
1 1 1
weaveworks-
Increment-only counter CmRDT
1 1 1
Increment
weaveworks-
Increment-only counter CmRDT
1 1 1 1
Increment
weaveworks-
Increment-only counter CmRDT
1 1 1 1
weaveworks-
Increment-only counter CmRDT
1 1 1 1
Σ Σ Σ
= 2 = 1 = 1
weaveworks-
Increment-only counter CmRDT
1 1 1 1
weaveworks-
Increment-only counter CmRDT
1 1 1 1
{A=1 B=1 C=0}
weaveworks-
Increment-only counter CmRDT
1 1 1 1 1
{A=1 B=1 C=0}
weaveworks-
Increment-only counter CmRDT
1 1 1 1 1
weaveworks-
Increment-only counter CmRDT
1 1 1 1 1
{A=1 B=1 C=0}
weaveworks-
Increment-only counter CmRDT
1 1 1 1 1 1
{A=1 B=1 C=0}
weaveworks-
Increment-only counter CmRDT
1 1 1 1 1 1
weaveworks-
weaveworks-
weaveworks-
Increment-only counter
δ-CRDT 1 1 1 1 1 1
weaveworks-
Increment-only counter
δ-CRDT 1 1 1 1 1 1
Increment
weaveworks-
Increment-only counter
δ-CRDT 1 1 1 2 1 1
Increment
weaveworks-
Increment-only counter
δ-CRDT 1 1 1 2 1 1
weaveworks-
Increment-only counter
δ-CRDT
A++
1 1 1 2 1 1
weaveworks-
Increment-only counter
δ-CRDT
{A=2 B=1 C=0}
1 1 1 2 1 1
weaveworks-
Increment-only counter
δ-CRDT
{A=2}
1 1 1 2 1 1
weaveworks-
Increment-only counter
δ-CRDT
{A=2}
1 1 1 2 2 1
weaveworks-
Increment-only counter
δ-CRDT 1 1 1 2 2 1
weaveworks-
Increment-only counter
δ-CRDT
{A=2}
1 1 1 2 2 1
weaveworks-
Increment-only counter
δ-CRDT
{A=2}
1 1 1 2 2 2
weaveworks-
Increment-only counter
δ-CRDT 1 1 1 2 2 2
weaveworks-
weaveworks-
Communication Theory + Information Theory = System Theory Gossip + CRDT = weavemesh
weaveworks-
weaveworks-
type GossipSender interface { GossipUnicast(dst Peer, m Msg) (err error) GossipBroadcast(m Msg) } type GossipReceiver interface { OnGossipUnicast(src Peer, m Msg) (err error) OnGossipBroadcast(src Peer, m Msg) (received Msgs, err error) OnGossip(m Msg) (delta Msgs, err error) DumpState() (complete Msgs) }
weaveworks-
type GossipData interface { Encode() Msgs Merge(other GossipData) (result GossipData) }
weaveworks-
Router B Router C Router A Router D
weaveworks-
Router B Router C Router A Router D Channel 1 Channel 1 Channel 1 Channel 1
weaveworks-
Router B Router C Router A Router D Channel 1 Channel 1 Channel 1 Channel 1 Gossip Receiver Gossip Receiver Gossip Receiver Gossip Receiver
weaveworks-
Router B Router C Router A Router D Channel 1 Channel 1 Channel 1 Channel 1 Gossip Receiver Gossip Receiver Gossip Receiver Gossip Receiver
weaveworks-
Channel GossipSender User GossipReceiver Router
weaveworks-
Router
Channel GossipSender User GossipReceiver User GossipData
weaveworks-
Router
Channel GossipSender Node User GossipData OnGossipUnicast OnGossipBroadcast OnGossip DumpState
weaveworks-
Router
Channel GossipSender Node State OnGossipUnicast OnGossipBroadcast OnGossip DumpState Merge
weaveworks-
Router
Channel GossipSender Node State OnGossipUnicast OnGossipBroadcast OnGossip DumpState Merge Encode API
weaveworks-
Router
Channel GossipSender Node State OnGossipUnicast OnGossipBroadcast OnGossip DumpState Merge Encode API
weaveworks-
weaveworks-
DC1 DC2 DC3 weavenet
weaveworks-
weaveworks-
hostA$ docker run --name=foo ...
containerX@hostB$ ping foo containerY@hostC$ ping foo
weaveworks-
weaveworks-
weaveworks-
weaveworks-
weaveworks-
type GossipData interface { Encode() Msgs Merge(other GossipData) (result GossipData) }
weaveworks-
type GossipData interface { Encode() Msgs Merge(other GossipData) (result GossipData) } type myData struct { m map[Node]int }
weaveworks-
type GossipData interface { Encode() Msgs Merge(other GossipData) (result GossipData) } type myData struct { m map[Node]int } func (d myData) Encode() Msgs { return Msgs{json.Encode(d.m)} // single msg, complete state }
weaveworks-
func (d myData) Merge(other GossipData) (result GossipData) { theirs = other.(myData) for node, val := range theirs.m { if val > d.m[node] { d.m[node] = val } } return d }
weaveworks-
type GossipReceiver interface { OnGossipUnicast(src Peer, m Msg) (err error) OnGossipBroadcast(src Peer, m Msg) (received Msgs, err error) OnGossip(m Msg) (delta Msgs, err error) DumpState() (complete Msgs) }
weaveworks-
type GossipReceiver interface { OnGossipUnicast(src Peer, m Msg) (err error) OnGossipBroadcast(src Peer, m Msg) (received Msgs, err error) OnGossip(m Msg) (delta Msgs, err error) DumpState() (complete Msgs) } func OnGossipUnicast(src Peer, m Msg) (err error) { update := json.UnmarshalFrom(m) state.Merge(update) return nil }
weaveworks-
func OnGossipBroadcast(src Peer, m Msg) (received Msgs, err error) { update := json.UnmarshalFrom(m) received := state.MergeReceived(update) return received, nil }
weaveworks-
func OnGossipBroadcast(src Peer, m Msg) (received Msgs, err error) { update := json.UnmarshalFrom(m) received := state.MergeReceived(update) return received, nil } func OnGossip(m Msg) (delta Msgs, err error) { update := json.UnmarshalFrom(m) delta := state.MergeDelta(update) return delta, err }
weaveworks-
func OnGossipBroadcast(src Peer, m Msg) (received Msgs, err error) { update := json.UnmarshalFrom(m) received := state.MergeReceived(update) return received, nil } func OnGossip(m Msg) (delta Msgs, err error) { update := json.UnmarshalFrom(m) delta := state.MergeDelta(update) return delta, err } func DumpState() (complete Msgs) { return json.Marshal(state) }
weaveworks-
type GossipSender interface { GossipUnicast(dst Peer, m Msg) (err error) GossipBroadcast(m Msg) }
weaveworks-
type GossipSender interface { GossipUnicast(dst Peer, m Msg) (err error) GossipBroadcast(m Msg) } func (d myData) Increment() { d.m[self]++ // make local state change update := d.Encode() // create state-based CRDT update GossipBroadcast(update) // eventual consistency }
weaveworks-
type GossipSender interface { GossipUnicast(dst Peer, m Msg) (err error) GossipBroadcast(m Msg) } func (d myData) Increment() { d.m[self]++ // make local state change update := d.Encode() // create state-based CRDT update GossipBroadcast(update) // eventual consistency } func (d myData) Read() (result int) { for _, val := range d.m { result += val } return result }
weaveworks-
Router
Channel GossipSender User GossipReceiver User GossipData
weaveworks-
Router
Channel GossipSender User GossipReceiver myData Merge Encode Read Incr
weaveworks-
Node OnGossipUnicast OnGossipBroadcast OnGossip DumpState Router
Channel GossipSender myData Merge Encode Read Incr
weaveworks-
weaveworks-
weaveworks-
type PacketConn interface { ReadFrom(b []byte) (n int, addr Addr, err error) WriteTo(b []byte, addr Addr) (n int, err error) Close() error LocalAddr() Addr SetDeadline(t time.Time) error SetReadDeadline(t time.Time) error SetWriteDeadline(t time.Time) error }
weaveworks-
type PacketConn interface { ReadFrom(b []byte) (n int, addr Addr, err error) WriteTo(b []byte, addr Addr) (n int, err error) Close() error LocalAddr() Addr SetDeadline(t time.Time) error SetReadDeadline(t time.Time) error SetWriteDeadline(t time.Time) error }
weaveworks-
net.PacketConn GossipReceiver
Raft Mesh
weaveworks-
ReadFrom OnGossipUnicast OnGossipBroadcast OnGossip Channel GossipSender WriteTo
weaveworks-
// Called from network driver to recv a packet. func (p *Peer) ReadFrom(p []byte) (..., remote Addr, ...) { pkt := <-p.recv // from mesh network copy(p, pkt) // copy data into p return ..., pkt.Src, ... // pkt.Src addr is remote }
weaveworks-
// Called from network driver to recv a packet. func (p *Peer) ReadFrom(p []byte) (..., remote Addr, ...) { pkt := <-p.recv // from mesh network copy(p, pkt) // copy data into p return ..., pkt.Src, ... // pkt.Src addr is remote } // Called from network driver to send a packet. func (p *Peer) WriteTo(b []byte, dst Addr) ... { pkt := Pkt{Src: p.Self, Dst: dst, Buf: b} p.sender.GossipUnicast(dst, pkt.Encode()) }
weaveworks-
func (p *Peer) OnGossipBroadcast(src Peer, m Msg) ... { p.recv <- makePkt(m) } func (p *Peer) OnGossipUnicast(src Peer, m Msg) ... { p.recv <- makePkt(m) } func (p *Peer) OnGossip(m Msg) ... { p.recv <- makePkt(m) } func (p *Peer) DumpState() ... { return nil // stateless }
weaveworks-
Weak Consistency + Adapter = Strong Consistency Mesh + MeshConn = Raft
weaveworks-
Node
Step ProposeEntry ProposeConfChange
weaveworks-
Node
Step ProposeEntry ProposeConfChange
Packet Oriented Transport
weaveworks-
Node
Step ProposeEntry ProposeConfChange
Packet Oriented Transport
weaveworks-
Node
Step ProposeEntry ProposeConfChange
Packet Oriented Transport State
weaveworks-
Controller
Node
Step ProposeEntry ProposeConfChange
Packet Oriented Transport State
weaveworks-
weaveworks-
weaveworks-
weaveworks-
▶ ︎
weaveworks-
▶ ︎ ▶︎
weaveworks-
▶ ︎ ▶︎ ▶ ︎ ▶︎
weaveworks-
▶ ︎ ▶︎ ▶ ︎ ▶︎
weaveworks-
Matthias Radestock, CTO Peter Bourgon, Typist
https://weave.works scope.weave.works
weavescope