Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Feel The Rush: CRDTs in Riak

Feel The Rush: CRDTs in Riak

Reconciling conflicts in eventually consistent distributed systems can be messy adventure, but conflict-free replicated datatypes (CRDT’s) offer a solution where updates are accepted without remote synchronization and replicas properly converge into an equivalent state. Riak Data Types bring CRDTs to the server side, making data modeling simpler and skipping the need to roll your own conflict resolution logic. More than anything, these data types make some of the recent research in strong eventual consistency real and practical, and I’ll demo #howitdoesit.

Zeeshan Lakhani

May 23, 2015
Tweet

More Decks by Zeeshan Lakhani

Other Decks in Programming

Transcript

  1. Feel the Rush: CRDTs in Riak
    Zeeshan Lakhani
    Software Engineer at Basho Technologies,Inc | Founder/Organizer Papers We Love
    @zeeshanlakhani
    5-22-2015 (LambdaConf)
    Zeeshan Lakhani Feel the Rush: CRDTs in Riak 5-22-2015 (LambdaConf) 1 / 18

    View Slide

  2. Partial Order of Events
    Time, Clocks, and the Ordering of Events never gets old
    Can only release say that something happened before1
    Events
    q1 happens before p2 and before p3
    p3 and q2 are concurrent - p3 || q22
    (figure on next slide)
    1Time, Clocks, and the Ordering of Events in a Distributed System [Lamport]
    http://bit.ly/1kQ3xhL
    2A Brief History of Time in Riak [Cribbs] http://bit.ly/1Apto80
    Zeeshan Lakhani Feel the Rush: CRDTs in Riak 5-22-2015 (LambdaConf) 2 / 18

    View Slide

  3. Lamport’s "space-time"/process diagram3
    3Time, Clocks, and the Ordering of Events in a Distributed System [Lamport]
    http://bit.ly/1kQ3xhL
    Zeeshan Lakhani Feel the Rush: CRDTs in Riak 5-22-2015 (LambdaConf) 3 / 18

    View Slide

  4. Replication + Coordination (CRDTs)
    A kind of safety called Strong Eventual Consistency
    Data Structures reducing the need for coordination
    Zeeshan Lakhani Feel the Rush: CRDTs in Riak 5-22-2015 (LambdaConf) 4 / 18

    View Slide

  5. State vs Operations-Based6
    CvRDT (convergent)
    apply change locally; propagate entire state4
    partial order to values
    grows state monotonically
    CmRDT (commutative)
    needs reliable broadcast to guarantee operations are delivered in
    partial order5
    partial order to operations
    replicas received updates
    4Consistency and Riak [Meiklejohn] http://bit.ly/1PBykxQ
    5CRDT Notes [pfraze] http://bit.ly/1dpxMdn
    6A comprehensive study of Convergent and Commutative Replicated Data
    Types [Shapiro, et al.] http://bit.ly/1PBC4zc
    Zeeshan Lakhani Feel the Rush: CRDTs in Riak 5-22-2015 (LambdaConf) 5 / 18

    View Slide

  6. "Hello World" of a distributed ordering/replication
    issue
    When two writes occur concurrently, the next read returns their
    union. Concurrent updates even on unrelated elements, a
    remove may be undone.7
    Using (semantic reconciliation) mechanism, an ’add to cart’
    operation is never lost. However, deleted items can resurface."8
    7An Optimized Conflict-free Replicated Set [Bieniusa, et al.]
    http://bit.ly/1ITUF48
    8Dynamo [DeCandia, et al.] http://bit.ly/13QWj5Y
    Zeeshan Lakhani Feel the Rush: CRDTs in Riak 5-22-2015 (LambdaConf) 6 / 18

    View Slide

  7. Foundations - Lattice
    A bounded join-semilattice9 :
    S, , ⊥
    smallest element in S:

    binary merge operator:
    9Logic and Lattices for Distributed Programming [Conway, et al.]
    http://bit.ly/1IQ6ppV
    Zeeshan Lakhani Feel the Rush: CRDTs in Riak 5-22-2015 (LambdaConf) 7 / 18

    View Slide

  8. lmax10, 11
    10Logic and Lattices for Distributed Programming [Conway, et al.]
    http://bit.ly/1IQ6ppV
    11Consistency and Riak [Meiklejohn] http://bit.ly/1PBykxQ
    Zeeshan Lakhani Feel the Rush: CRDTs in Riak 5-22-2015 (LambdaConf) 8 / 18

    View Slide

  9. Foundations - LUB
    a merge function/operation that produces a Least Upper Bound
    (LUB) over a join-semilattice
    Replica A has a Haskell book - insert into cart
    Replica B has a Scheme book - insert into cart
    LUB would be the smallest cart state that’s greater than or
    equal to both elements in the ordering: {A, B}12
    If LUB exists, then it’s unique & conflict resolution is
    deterministic12
    12What’s the deal w/ lvars and crdts [Kuper] http://bit.ly/1Kpz4Cq
    Zeeshan Lakhani Feel the Rush: CRDTs in Riak 5-22-2015 (LambdaConf) 9 / 18

    View Slide

  10. 2P-Set Example13
    {
    ’type’: ’2p-set’,
    ’a’: [’a’, ’b’],
    ’r’: [’b’]
    }
    only a exists
    13meangirls [Kingsbury] http://bit.ly/1cSrWQQ
    Zeeshan Lakhani Feel the Rush: CRDTs in Riak 5-22-2015 (LambdaConf) 10 / 18

    View Slide

  11. Regular Or-Set Example14
    {
    ’type’: ’or-set’,
    ’e’: [
    [’a’, [1]],
    [’b’, [1], [1]],
    [’c’, [1, 2], [2, 3]]
    ]
    }
    unique tags associted w/ each assertion
    a exists
    b != exist . . . insertion was deleted,
    c exists . . . two insertions, one deleted
    14meangirls [Kingsbury] http://bit.ly/1cSrWQQ
    Zeeshan Lakhani Feel the Rush: CRDTs in Riak 5-22-2015 (LambdaConf) 11 / 18

    View Slide

  12. Comparing Vector Versions - (VVs) track
    divergence
    Zeeshan Lakhani Feel the Rush: CRDTs in Riak 5-22-2015 (LambdaConf) 12 / 18

    View Slide

  13. Descends, Dominates, Concurrent15
    descends A >= B
    A summarizes at least the same history as B (as seen all the
    events in B)
    dominates A > B (good for discarding)
    A is strictly greater than B (has seen all events B and at least
    1 more event
    concurrent A || B
    A contains at least 1 event unseen by B and B contains at least
    1 event unseen by A
    15A Brief History of Time in Riak [Cribbs] http://bit.ly/1Apto80
    Zeeshan Lakhani Feel the Rush: CRDTs in Riak 5-22-2015 (LambdaConf) 13 / 18

    View Slide

  14. Riak’s implementation - ORSWOT
    Optimized Observe-Remove Set16, 17
    Two-Way Comparison
    E.g. 2 Replicas Merge. . . one contains element in the set, other
    does not
    16An Optimized Conflict-free Replicated Set [Bieniusa, et al.]
    http://bit.ly/1ITUF48
    17riak_dt_orswot.erl [Russell Brown] http://bit.ly/1ca8Wgb
    Zeeshan Lakhani Feel the Rush: CRDTs in Riak 5-22-2015 (LambdaConf) 14 / 18

    View Slide

  15. Causality to the Rescue18
    Sets as (dotted) version vectors
    [{actor1, count}=Dot1, {actor2, count}=Dot2,. . . ] - minimal clock
    We take all the elements that are in Set A and not in Set B
    and compare their minimal clocks to Set B’s set version
    vector. Every element whose minimal clock is dominated
    has been removed from Set B, does not make it into the
    merged set. Also drop dots dominated by Set B’s clocka
    Then repeat the other way (compare to Set A’s VV)
    a[Russell Brown] http://bit.ly/1AptLzI
    18[Russell Brown] http://bit.ly/1AptLzI
    Zeeshan Lakhani Feel the Rush: CRDTs in Riak 5-22-2015 (LambdaConf) 15 / 18

    View Slide

  16. DVVs19
    VVs merge
    DVV
    19Dotted Version Vector Sets [Gonçalves] http://bit.ly/1Akedxs
    Zeeshan Lakhani Feel the Rush: CRDTs in Riak 5-22-2015 (LambdaConf) 16 / 18

    View Slide

  17. Riak Data Types20, 21
    Maps - riak_dt_map
    Sets - riak_dt_orswot
    Registers - riak_dt_lwwreg
    Flags - riak_dt_od_flag
    Counters - riak_dt_emcntr
    20Riak DT [Russell Brown] http://bit.ly/1Eoj0J4
    21Riak Data Types http://bit.ly/1Q1S7RG
    Zeeshan Lakhani Feel the Rush: CRDTs in Riak 5-22-2015 (LambdaConf) 17 / 18

    View Slide

  18. Erlang client-side Example
    22
    Map4 = riakc_map:update({<<"interests">>, set},
    fun(S) ->
    riakc_set:add_element(<<"robots">>, S)
    end,
    Map3),
    Map5 = riakc_map:update({<<"interests">>, set},
    fun(S) ->
    riakc_set:add_element(<<"opera">>, S)
    end,
    Map4).
    22Riak Data Types Map http://bit.ly/1BhfnEI
    Zeeshan Lakhani Feel the Rush: CRDTs in Riak 5-22-2015 (LambdaConf) 18 / 18

    View Slide