Conflict Free Replicated Data-types in Eventually Consistent Systems - Joel Jacobson (Basho Technologies)

Post on 12-May-2015

2929 Views

Category:

Technology

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

This talk was due to be presented at JAX London 2013, but the speaker was unfortunately unable to attend. Distributed data stores give us increased availability, linear scalability, predictable latency and improved fault tolerance. The flip-side is having to deal with inconsistencies: most distributed databases will ask your application layer how to resolve such inconsistencies. Conflict-free Replicated Data Types (CRDTs) are a way for a distributed database, such as Riak, to resolve those inconsistencies logically and automatically. Unlike traditional data structures, there is always a single state on which they converge. In this talk, I’ll look at the development of CRDTs from an academic project to implementation in Riak.

Transcript

Conflict Free Replicated Data-types in Eventually Consistent SystemsJoel Jacobson, Basho Technologies

JAX London2013

Friday, 8 November 13

Retweet to win a copy!@joeljacobson

Friday, 8 November 13

RiakDistributed, Masterless, Key/Value Database+ Extras

Friday, 8 November 13

Buckets, Keys and ValuesSimple operations;GET, PUT, DELETE

Key ValueKey ValueKey ValueKey ValueKey ValueKey Value

Friday, 8 November 13

Distributed & Scalable

Friday, 8 November 13

Distributed & Scalable

Friday, 8 November 13

Fault Tolerance

Any node can serve R/W requests

Data is replicated

Fallback Node

Hinted Handoff

Friday, 8 November 13

Dynamo Systems

Distributed

High Availability

Masterless

Eventually Consistent

Friday, 8 November 13

A 1

3

2

Client

Friday, 8 November 13

A 1

3

2

Client

Friday, 8 November 13

N 1

3

2

N

Client

Client

Friday, 8 November 13

Conflicts

Friday, 8 November 13

Conflict Resolution

Last-Write Wins (LWW)

Vector Clocks (Siblings)

Friday, 8 November 13

Sibling Resolution

Friday, 8 November 13

Conflict-Free Replicated Data Types

Friday, 8 November 13

Counters

Sets

Maps

Registers

Booleans

Primitives

Friday, 8 November 13

Counters

Friday, 8 November 13

Counters

{    'type':  'g-­‐counter',    'e':  {        'a':  1,        'b':  5,        'c':  2    }}

Friday, 8 November 13

Counters

{    'type':  'g-­‐counter',    'e':  {        'a':  1,        'b':  5,        'c':  2    }}

{    'type':  'pn-­‐counter',    'p':  {        'a':  10,        'b':  2    },  'n':  {        'c':  5,        'a':  1    }}

Friday, 8 November 13

Counters

{    'type':  'g-­‐counter',    'e':  {        'a':  1,        'b':  5,        'c':  2    }}

{    'type':  'pn-­‐counter',    'p':  {        'a':  10,        'b':  2    },  'n':  {        'c':  5,        'a':  1    }}

P=12, N=6, so the value is 6

Friday, 8 November 13

The Problem of Absence

Friday, 8 November 13

Sets

Friday, 8 November 13

Sets{    'type':  'g-­‐set',    'e':  ['a',  'b',  'c']}

Friday, 8 November 13

Sets{    'type':  'g-­‐set',    'e':  ['a',  'b',  'c']}

'type':  'or-­‐set'{  [  {a,  3},  {b,  2},  {c,  2}],                %%  Version  Vector    [{  'bob',  [{a,  1}]},                            %%  Bob  was  added  by  'a'  at  logical  time  1  (a's  first  event)    {'joel',    [{a,  3}]},                            %%  Joel  was  added  by  'a'  at  logical  time  3  and  by  'c'  at  logical  time  1    {'sean',  [{a,  2},  {c,  1}]},                    {'matt',  [{b,  1}]},    {'stu',  [{c,  2},  {b,  2}]}]]}

Friday, 8 November 13

Sets

'type':  'or-­‐set'{  [  {a,  3},  {b,  2},  {c,  2}],                %%  Version  Vector    [{  'bob',  [{a,  1}]},                            %%  Bob  was  added  by  'a'  at  logical  time  1  (a's  first  event)    {'joel',    [{a,  3}]},                            %%  Joel  was  added  by  'a'  at  logical  time  3  and  by  'c'  at  logical  time  1    {'sean',  [{a,  2},  {c,  1}]},                    {'matt',  [{b,  1}]},    {'stu',  [{c,  2},  {b,  2}]}]]}

Friday, 8 November 13

Sets

'type':  'or-­‐set'{  [  {a,  3},  {b,  2},  {c,  2}],                %%  Version  Vector    [{  'bob',  [{a,  1}]},                            %%  Bob  was  added  by  'a'  at  logical  time  1  (a's  first  event)    {'joel',    [{a,  3}]},                            %%  Joel  was  added  by  'a'  at  logical  time  3  and  by  'c'  at  logical  time  1    {'sean',  [{a,  2},  {c,  1}]},                    {'matt',  [{b,  1}]},    {'stu',  [{c,  2},  {b,  2}]}]]}

VV,  element-­‐>dots

Friday, 8 November 13

Maps{    'type':  'map',              gold=100,  stone  =  10,                weapons=[sword,  knife,  shotgun],              armour=[helmet,  shield]}

Friday, 8 November 13

Maps{    'type':  'map',              gold=100,  stone  =  10,                weapons=[sword,  knife,  shotgun],              armour=[helmet,  shield]}

Hey  Riak  with  Map  at  Key  K  -­‐>  

[{increment  gold  by  10,  decrement  stone  by  4,  add  uzi  to  weapons  and  

remove  helmet  from  armour}]

Friday, 8 November 13

Use-Cases

Advert clicks (G-Counter)

Shopping cart (Modified OR-Set)

Logged in users (P-N Counter)

Maps can be composed of complex data

Friday, 8 November 13

Common Questions

What do they cost me?

How big are they?

What can’t they do?

Friday, 8 November 13

Thank youjoel@basho.com

Friday, 8 November 13

top related