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

Bolt-on Causal Consistency

pbailis
June 27, 2013

Bolt-on Causal Consistency

pbailis

June 27, 2013
Tweet

More Decks by pbailis

Other Decks in Technology

Transcript

  1. July 2000: CAP Conjecture A system facing network partitions must

    choose between either availability or strong consistency
  2. July 2000: CAP Conjecture A system facing network partitions must

    choose between either availability or strong consistency Theorem
  3. NoSQL Strong consistency is out! “Partitions matter, and so does

    low latency” [cf. Abadi: PACELC] ...offer eventual consistency instead
  4. Eventual Consistency eventually all replicas agree on the same value

    Extremely weak consistency model: Any value can be returned at any given time ...as long as it’s eventually the same everywhere
  5. Eventual Consistency eventually all replicas agree on the same value

    Extremely weak consistency model: Any value can be returned at any given time ...as long as it’s eventually the same everywhere Provides liveness but no safety guarantees Liveness: something good eventually happens Safety: nothing bad ever happens
  6. Do we have to give up safety if we want

    availability? ? No! There’s a spectrum of models.
  7. Do we have to give up safety if we want

    availability? ? No! There’s a spectrum of models.
  8. Do we have to give up safety if we want

    availability? ? No! There’s a spectrum of models. UT Austin TR: No model stronger than Causal Consistency is achievable with HA
  9. Why Causal Consistency? Highly available, low latency operation Long-identified useful

    “session” model Natural fit for many modern apps [Bayou Project, 1994-98] [UT Austin 2011 TR]
  10. Dilemma! Eventual consistency is the lowest common denominator across systems...

    ...yet eventual consistency is often insufficient for many applications...
  11. Dilemma! Eventual consistency is the lowest common denominator across systems...

    ...and no production-ready storage systems offer highly available causal consistency. ...yet eventual consistency is often insufficient for many applications...
  12. In this talk... show how to upgrade existing stores to

    provide HA causal consistency Approach: bolt on a narrow shim layer to upgrade eventual consistency
  13. In this talk... show how to upgrade existing stores to

    provide HA causal consistency Approach: bolt on a narrow shim layer to upgrade eventual consistency Outcome: architecturally separate safety and liveness properties
  14. Consistency-related Safety Mostly algorithmic Small code base Separation of Concerns

    Shim handles: Consistency/visibility Underlying store handles: Messaging/propagation Durability/persistence Failure-detection/handling
  15. Consistency-related Safety Mostly algorithmic Small code base Separation of Concerns

    Shim handles: Consistency/visibility Liveness and Replication Lots of engineering Reuse existing efforts! Underlying store handles: Messaging/propagation Durability/persistence Failure-detection/handling
  16. Consistency-related Safety Mostly algorithmic Small code base Separation of Concerns

    Shim handles: Consistency/visibility Liveness and Replication Lots of engineering Reuse existing efforts! Underlying store handles: Messaging/propagation Durability/persistence Failure-detection/handling Guarantee same (useful) semantics across systems! Allows portability, modularity, comparisons
  17. Bolt-on Architecture Bolt-on shim layer upgrades the semantics of an

    eventually consistent data store Clients only communicate with shim Shim communicates with one of many different eventually consistent stores (generic)
  18. Bolt-on Architecture Bolt-on shim layer upgrades the semantics of an

    eventually consistent data store Clients only communicate with shim Shim communicates with one of many different eventually consistent stores (generic) Treat EC store as “storage manager” of distributed DBMS
  19. Bolt-on Architecture Bolt-on shim layer upgrades the semantics of an

    eventually consistent data store Clients only communicate with shim Shim communicates with one of many different eventually consistent stores (generic) Treat EC store as “storage manager” of distributed DBMS for now, an extreme: unmodified EC store
  20. What is Causal Consistency? Reads obey: 1.) Writes Follow Reads

    (“happens-before”) 2.) Program order 3.) Transitivity [Lamport 1978]
  21. What is Causal Consistency? Reads obey: 1.) Writes Follow Reads

    (“happens-before”) 2.) Program order 3.) Transitivity [Lamport 1978] Here, applications explicitly define happens-before for each write (“explicit causality”) [Ladin et al. 1990, cf. Bailis et al. 2012]
  22. What is Causal Consistency? Reads obey: 1.) Writes Follow Reads

    (“happens-before”) 2.) Program order 3.) Transitivity [Lamport 1978] Here, applications explicitly define happens-before for each write (“explicit causality”) [Ladin et al. 1990, cf. Bailis et al. 2012] First Tweet Reply to Alex
  23. What is Causal Consistency? Reads obey: 1.) Writes Follow Reads

    (“happens-before”) 2.) Program order 3.) Transitivity [Lamport 1978] Here, applications explicitly define happens-before for each write (“explicit causality”) [Ladin et al. 1990, cf. Bailis et al. 2012] First Tweet Reply to Alex happens-before
  24. 1.) Representing Order Two Tasks: How do we efficiently store

    causal ordering in the EC system? 2.) Controlling Order How do we control the visibility of new updates to the EC system?
  25. 1.) Representing Order Two Tasks: How do we efficiently store

    causal ordering in the EC system? 2.) Controlling Order How do we control the visibility of new updates to the EC system?
  26. 1.) Representing Order Two Tasks: How do we efficiently store

    causal ordering in the EC system? 2.) Controlling Order How do we control the visibility of new updates to the EC system?
  27. 1.) Representing Order Two Tasks: How do we efficiently store

    causal ordering in the EC system? 2.) Controlling Order How do we control the visibility of new updates to the EC system?
  28. Strawman: use vector clocks Representing Order First Tweet :0 {

    } :1, :1 { } :1, Reply-to Alex [e.g., Bayou, Causal Memory]
  29. Strawman: use vector clocks Representing Order First Tweet :0 {

    } :1, :1 { } :1, Reply-to Alex Problem? Given missing dependency (from vector), what key should we check? [e.g., Bayou, Causal Memory]
  30. Strawman: use vector clocks Representing Order First Tweet :0 {

    } :1, :1 { } :1, Reply-to Alex Problem? Given missing dependency (from vector), what key should we check? If I have <3,1>; where is <2,1>? <1,1>? Write to same key? Write to different key? Which? [e.g., Bayou, Causal Memory]
  31. Strawman: use dependency pointers First Tweet A @ timestamp 1092,

    dependencies = {} Representing Order [e.g., Lazy Replication, COPS]
  32. Strawman: use dependency pointers First Tweet A @ timestamp 1092,

    dependencies = {} Reply-to Alex B @ timestamp 1109, dependencies={A@1092} Representing Order [e.g., Lazy Replication, COPS]
  33. Strawman: use dependency pointers Problem? First Tweet A @ timestamp

    1092, dependencies = {} Reply-to Alex B @ timestamp 1109, dependencies={A@1092} Representing Order [e.g., Lazy Replication, COPS]
  34. Strawman: use dependency pointers Problem? First Tweet A @ timestamp

    1092, dependencies = {} Reply-to Alex B @ timestamp 1109, dependencies={A@1092} Representing Order A@1→B@2→C@3 [e.g., Lazy Replication, COPS]
  35. C@3 A@1 Strawman: use dependency pointers Problem? First Tweet A

    @ timestamp 1092, dependencies = {} Reply-to Alex B @ timestamp 1109, dependencies={A@1092} Representing Order A@1→B@2→C@3 B@2 [e.g., Lazy Replication, COPS]
  36. C@3 A@1 Strawman: use dependency pointers Problem? First Tweet A

    @ timestamp 1092, dependencies = {} Reply-to Alex B @ timestamp 1109, dependencies={A@1092} Representing Order A@1→B@2→C@3 B@2 [e.g., Lazy Replication, COPS]
  37. C@3 A@1 Strawman: use dependency pointers Problem? First Tweet A

    @ timestamp 1092, dependencies = {} Reply-to Alex B @ timestamp 1109, dependencies={A@1092} Representing Order A@1→B@2→C@3 B@2 [e.g., Lazy Replication, COPS]
  38. C@3 A@1 Strawman: use dependency pointers Problem? First Tweet A

    @ timestamp 1092, dependencies = {} Reply-to Alex B @ timestamp 1109, dependencies={A@1092} Representing Order A@1→B@2→C@3 B@7 [e.g., Lazy Replication, COPS]
  39. C@3 A@1 Strawman: use dependency pointers Problem? First Tweet A

    @ timestamp 1092, dependencies = {} Reply-to Alex B @ timestamp 1109, dependencies={A@1092} Representing Order A@1→B@2→C@3 B@7 [e.g., Lazy Replication, COPS]
  40. C@3 A@1 Strawman: use dependency pointers Problem? First Tweet A

    @ timestamp 1092, dependencies = {} Reply-to Alex B @ timestamp 1109, dependencies={A@1092} Representing Order A@1→B@2→C@3 B@7 single pointers can be overwritten! [e.g., Lazy Replication, COPS]
  41. Strawman: use dependency pointers Representing Order single pointers can be

    overwritten “overwritten histories” Strawman: use vector clocks don’t know what items to check
  42. Strawman: use dependency pointers Representing Order single pointers can be

    overwritten “overwritten histories” Strawman: use vector clocks don’t know what items to check Strawman: use N2 items for messaging
  43. Strawman: use dependency pointers Representing Order single pointers can be

    overwritten “overwritten histories” Strawman: use vector clocks don’t know what items to check Strawman: use N2 items for messaging highly inefficient!
  44. Representing Order Solution: store metadata about causal cuts short answer:

    consistent cut applied to data items; not quite the transitive closure
  45. short answer: consistent cut applied to data items; not quite

    the transitive closure Representing Order Solution: store metadata about causal cuts
  46. short answer: consistent cut applied to data items; not quite

    the transitive closure Representing Order Solution: store metadata about causal cuts A@1→B@2→C@3 Causal cut for C@3: {B@2, A@1}
  47. short answer: consistent cut applied to data items; not quite

    the transitive closure Representing Order Solution: store metadata about causal cuts A@1→B@2→C@3 Causal cut for C@3: {B@2, A@1} A@6→B@17→C@20 A@10→B@12 Causal cut for C@20: {B@17, A@10}
  48. Two Tasks: 1.) Representing Order How do we efficiently store

    causal ordering in the EC system? 2.) Controlling Order How do we control the visibility of new updates to the EC system?
  49. Two Tasks: 1.) Representing Order 2.) Controlling Order How do

    we control the visibility of new updates to the EC system? Shim stores causal cut summary along with every key due to overwrites and “unreliable” delivery
  50. Two Tasks: 1.) Representing Order 2.) Controlling Order How do

    we control the visibility of new updates to the EC system? Shim stores causal cut summary along with every key due to overwrites and “unreliable” delivery
  51. Controlling Order Standard technique: reveal new writes to readers only

    when dependencies have been revealed Inductively guarantee clients read from causal cut
  52. Controlling Order Standard technique: reveal new writes to readers only

    when dependencies have been revealed Inductively guarantee clients read from causal cut In bolt-on causal consistency, two challenges:
  53. Controlling Order Standard technique: reveal new writes to readers only

    when dependencies have been revealed Inductively guarantee clients read from causal cut In bolt-on causal consistency, two challenges: Each shim has to check dependencies manually Underlying store doesn’t notify clients of new writes
  54. Controlling Order Standard technique: reveal new writes to readers only

    when dependencies have been revealed Inductively guarantee clients read from causal cut In bolt-on causal consistency, two challenges: Each shim has to check dependencies manually Underlying store doesn’t notify clients of new writes EC store may overwrite “stable” cut Clients need to cache relevant cut to prevent overwrites
  55. Controlling Order Standard technique: reveal new writes to readers only

    when dependencies have been revealed Inductively guarantee clients read from causal cut In bolt-on causal consistency, two challenges: Each shim has to check dependencies manually Underlying store doesn’t notify clients of new writes EC store may overwrite “stable” cut Clients need to cache relevant cut to prevent overwrites
  56. Each shim has to check dependencies manually EC store may

    overwrite “stable” cut SHIM EC Store
  57. Each shim has to check dependencies manually EC store may

    overwrite “stable” cut read(B) SHIM EC Store
  58. Each shim has to check dependencies manually EC store may

    overwrite “stable” cut read(B) SHIM EC Store read(B)
  59. Each shim has to check dependencies manually EC store may

    overwrite “stable” cut read(B) SHIM EC Store read(B) B@1109, deps={A@1092}
  60. Each shim has to check dependencies manually EC store may

    overwrite “stable” cut read(B) SHIM EC Store read(B) B@1109, deps={A@1092} read(A)
  61. Each shim has to check dependencies manually EC store may

    overwrite “stable” cut read(B) SHIM EC Store read(B) B@1109, deps={A@1092} read(A) A@1092, deps={}
  62. Each shim has to check dependencies manually EC store may

    overwrite “stable” cut read(B) SHIM EC Store read(B) B@1109, deps={A@1092} read(A) A@1092, deps={} B@1109
  63. Each shim has to check dependencies manually EC store may

    overwrite “stable” cut read(B) SHIM EC Store read(B) B@1109, deps={A@1092} read(A) A@1092, deps={} B@1109
  64. Each shim has to check dependencies manually EC store may

    overwrite “stable” cut read(B) SHIM EC Store read(B) B@1109, deps={A@1092} A@1092, deps={}
  65. Each shim has to check dependencies manually EC store may

    overwrite “stable” cut read(B) SHIM EC Store read(B) B@1109, deps={A@1092} A@1092, deps={} Cache this value for A! EC store might overwrite it with “unresolved” write
  66. 1.) Representing Order Two Tasks: 2.) Controlling Order How do

    we control the visibility of new updates to the EC system? Shim stores causal cut summary along with every key due to overwrites and “unreliable” delivery
  67. 1.) Representing Order Two Tasks: 2.) Controlling Order Shim performs

    dependency checks for client, caches dependencies Shim stores causal cut summary along with every key due to overwrites and “unreliable” delivery
  68. UpgradeD CASSANDRA to Causal consistency 322 lines Java for CORE

    Safety Custom serialization Client-side caching
  69. Dataset Chain Length Message Depth Serialized Size (b) Twitter 2

    4 169 Flickr 3 5 201 Metafilter 6 18 525 TUAW 13 8 275 Median
  70. Dataset Chain Length Message Depth Serialized Size (b) Twitter 2

    4 169 Flickr 3 5 201 Metafilter 6 18 525 TUAW 13 8 275 Median
  71. Dataset Chain Length Message Depth Serialized Size (b) Twitter 2

    4 169 Flickr 3 5 201 Metafilter 6 18 525 TUAW 13 8 275 Median Twitter 40 230 5407 Flickr 44 100 2447 Metafilter 170 870 19375 TUAW 62 100 2438 99th percentile
  72. Dataset Chain Length Message Depth Serialized Size (b) Twitter 2

    4 169 Flickr 3 5 201 Metafilter 6 18 525 TUAW 13 8 275 Median Twitter 40 230 5407 Flickr 44 100 2447 Metafilter 170 870 19375 TUAW 62 100 2438 99th percentile
  73. Dataset Chain Length Message Depth Serialized Size (b) Twitter 2

    4 169 Flickr 3 5 201 Metafilter 6 18 525 TUAW 13 8 275 Median Twitter 40 230 5407 Flickr 44 100 2447 Metafilter 170 870 19375 TUAW 62 100 2438 99th percentile
  74. Dataset Chain Length Message Depth Serialized Size (b) Twitter 2

    4 169 Flickr 3 5 201 Metafilter 6 18 525 TUAW 13 8 275 Median Twitter 40 230 5407 Flickr 44 100 2447 Metafilter 170 870 19375 TUAW 62 100 2438 99th percentile
  75. Dataset Chain Length Message Depth Serialized Size (b) Twitter 2

    4 169 Flickr 3 5 201 Metafilter 6 18 525 TUAW 13 8 275 Median Twitter 40 230 5407 Flickr 44 100 2447 Metafilter 170 870 19375 TUAW 62 100 2438 99th percentile
  76. Dataset Chain Length Message Depth Serialized Size (b) Twitter 2

    4 169 Flickr 3 5 201 Metafilter 6 18 525 TUAW 13 8 275 Median Twitter 40 230 5407 Flickr 44 100 2447 Metafilter 170 870 19375 TUAW 62 100 2438 99th percentile
  77. Dataset Chain Length Message Depth Serialized Size (b) Twitter 2

    4 169 Flickr 3 5 201 Metafilter 6 18 525 TUAW 13 8 275 Median Twitter 40 230 5407 Flickr 44 100 2447 Metafilter 170 870 19375 TUAW 62 100 2438 99th percentile
  78. Dataset Chain Length Message Depth Serialized Size (b) Twitter 2

    4 169 Flickr 3 5 201 Metafilter 6 18 525 TUAW 13 8 275 Median Twitter 40 230 5407 Flickr 44 100 2447 Metafilter 170 870 19375 TUAW 62 100 2438 99th percentile
  79. Dataset Chain Length Message Depth Serialized Size (b) Twitter 2

    4 169 Flickr 3 5 201 Metafilter 6 18 525 TUAW 13 8 275 Median Twitter 40 230 5407 Flickr 44 100 2447 Metafilter 170 870 19375 TUAW 62 100 2438 99th percentile
  80. Dataset Chain Length Message Depth Serialized Size (b) Twitter 2

    4 169 Flickr 3 5 201 Metafilter 6 18 525 TUAW 13 8 275 Median Twitter 40 230 5407 Flickr 44 100 2447 Metafilter 170 870 19375 TUAW 62 100 2438 99th percentile
  81. Dataset Chain Length Message Depth Serialized Size (b) Twitter 2

    4 169 Flickr 3 5 201 Metafilter 6 18 525 TUAW 13 8 275 Median Twitter 40 230 5407 Flickr 44 100 2447 Metafilter 170 870 19375 TUAW 62 100 2438 99th percentile Most chains are small Metadata often < 1KB Power laws mean some chains are difficult
  82. Strategy 1: Resolve dependencies at read time Often (but not

    always) within 40% of eventual Long chains hurt throughput
  83. Strategy 1: Resolve dependencies at read time Often (but not

    always) within 40% of eventual Long chains hurt throughput N.B. Locality in YCSB workload greatly helps read performance; dependencies (or replacements) often cached (used 100x default # keys, but still likely to have concurrent write in cache)
  84. SHIM EC Store What if we serve entirely from cache

    and fetch new data asynchronously?
  85. read(B) SHIM EC Store What if we serve entirely from

    cache and fetch new data asynchronously?
  86. read(B) SHIM EC Store B from cache What if we

    serve entirely from cache and fetch new data asynchronously?
  87. read(B) SHIM EC Store read(B) B from cache What if

    we serve entirely from cache and fetch new data asynchronously?
  88. read(B) SHIM EC Store read(B) B@1109, deps=... B from cache

    What if we serve entirely from cache and fetch new data asynchronously?
  89. read(B) SHIM EC Store read(B) B@1109, deps=... read(A) B from

    cache What if we serve entirely from cache and fetch new data asynchronously?
  90. read(B) SHIM EC Store read(B) B@1109, deps=... read(A) A@1092, deps={}

    B from cache What if we serve entirely from cache and fetch new data asynchronously?
  91. read(B) SHIM EC Store read(B) B@1109, deps=... read(A) A@1092, deps={}

    B from cache What if we serve entirely from cache and fetch new data asynchronously? EC store reads are async
  92. A thought... Causal consistency trades visibility for safety How far

    can we push this visibility? What if we serve reads entirely from cache and fetch new data asynchronously?
  93. A thought... Causal consistency trades visibility for safety How far

    can we push this visibility? What if we serve reads entirely from cache and fetch new data asynchronously? Continuous trade-off space between dependency resolution depth and fast-path latency hit
  94. Sync Reads Async Reads Reading from cache is fast; linear

    speedup ...but not reading most recent data... ...in this case, effectively a straw-man.
  95. Lessons Causal consistency is achievable without modifications to existing stores

    represent and control ordering between updates EC is “orderless” until convergence trade-off between visibility and ordering
  96. Lessons Causal consistency is achievable without modifications to existing stores

    works well for workloads with small causal histories, good temporal locality represent and control ordering between updates EC is “orderless” until convergence trade-off between visibility and ordering
  97. Rethinking the EC API Uncontrolled overwrites increased metadata and local

    storage requirements Clients had to check causal dependencies independently, with no aid from EC store
  98. Rethinking the EC API What if we eliminated overwrites? via

    multi-versioning, conditional updates or immutability
  99. Rethinking the EC API What if we eliminated overwrites? via

    multi-versioning, conditional updates or immutability No more overwritten histories Decrease metadata Still have to check for dependency arrivals
  100. Rethinking the EC API What if the EC store notified

    us when dependencies converged (arrived everywhere)?
  101. Rethinking the EC API What if the EC store notified

    us when dependencies converged (arrived everywhere)? put( after converges)
  102. Rethinking the EC API What if the EC store notified

    us when dependencies converged (arrived everywhere)? put( after converges)
  103. Rethinking the EC API What if the EC store notified

    us when dependencies converged (arrived everywhere)? put( after converges)
  104. Rethinking the EC API What if the EC store notified

    us when dependencies converged (arrived everywhere)? put( after converges)
  105. Rethinking the EC API What if the EC store notified

    us when dependencies converged (arrived everywhere)? put( after converges)
  106. Rethinking the EC API What if the EC store notified

    us when dependencies converged (arrived everywhere)? put( after converges)
  107. Rethinking the EC API What if the EC store notified

    us when dependencies converged (arrived everywhere)? put( after converges)
  108. Rethinking the EC API What if the EC store notified

    us when dependencies converged (arrived everywhere)? put( after converges)
  109. Rethinking the EC API What if the EC store notified

    us when dependencies converged (arrived everywhere)? put( after converges)
  110. Rethinking the EC API What if the EC store notified

    us when dependencies converged (arrived everywhere)? Wait to place writes in shared EC store until dependencies have converged No need for metadata No need for additional checks Ensure durability with client-local EC storage
  111. Multi-versioning or Conditional Update Stable Callback Reduces Metadata YES YES

    No Dependency Checks NO YES Data Store Multi-versioning or Conditional Update Stable Callback Amazon DynamoDB YES NO Amazon S3 NO NO Amazon SimpleDB YES NO Amazon Dynamo YES NO Cloudant Data Layer YES NO Google App Engine YES NO Apache Cassandra NO NO Apache CouchDB YES NO Basho Riak YES NO LinkedIn Voldemort YES NO MongoDB YES NO Yahoo! PNUTS YES NO ...not (yet) common to all stores
  112. Rethinking the EC API Our extreme approach (unmodified EC store)

    definitely impeded efficiency (but is portable) Opportunities to better define surgical improvements to API for future stores/shims!
  113. Bolt-on Causal Consistency Modular, “bolt-on” architecture cleanly separates safety and

    liveness upgraded EC (all liveness) to causal consistency, preserving HA, low latency, liveness Challenges: overwrites, managing causal order
  114. Bolt-on Causal Consistency Modular, “bolt-on” architecture cleanly separates safety and

    liveness upgraded EC (all liveness) to causal consistency, preserving HA, low latency, liveness Challenges: overwrites, managing causal order large design space: took an extreme here, but: room for exploration in EC API bolt-on transactions?
  115. (Some) Related Work • S3 DB [SIGMOD 2008]: foundational prior

    work building on EC stores, not causally consistent, not HA (e.g., RYW implementation), AWS- dependent (e.g., assumes queues) • 28msec architecture [SIGMOD Record 2009]: like SIGMOD 2008, treat EC stores as cheap storage • Cloudy [VLDB 2010]: layered approach to data management, partitioning, load balancing, messaging in middleware; larger focus: extensible query model, storage format, routing, etc. • G-Store [SoCC 2010]: provide client and middleware implementation of entity-grouped linearizable transaction support • Bermbach et al. middleware [IC2E 2013]: provides read-your-writes guarantees with caching • Causal Consistency: Bayou [SOSP 1997], Lazy Replication [TOCS 1992], COPS [SOSP 2011], Eiger [NSDI 2013], ChainReaction [EuroSys 2013], Swift [INRIA] are all custom solutions for causal memory [Ga Tech 1993] (inspired by Lamport [CACM 1978])