Markdown Editor

Distributed Key-Value Store System Design Template (Dynamo-Style)

Consistent hashing, vnodes, quorums (R+W>N), vector clocks vs LWW, hinted handoff, Merkle anti-entropy, gossip, LSM compaction, cache eviction, hot keys

Desain SistemLengkapDynamo (DeCandia et al., SOSP 2007)designdistributedstoremath

Cara menggunakan: Use it when designing a replicated key-value store or a shared cache tier. Decide what a stale or conflicting read costs first, then pick N, R, W and the conflict strategy. The main pitfall is treating R+W>N as strong consistency while sloppy quorums and concurrent writes still allow conflicts.

Pratinjau

System Design: [Key-value store name]

Reference design for a distributed key-value store that can also run as a cache. It covers partitioning with consistent hashing and virtual nodes, replication, quorum reads and writes, consistency models and conflict resolution (vector clocks versus last-write-wins), hinted handoff, anti-entropy with Merkle trees, gossip membership and failure detection, an LSM-tree storage engine with compaction, eviction policies for cache mode and hot-key handling. The concepts follow the Amazon Dynamo paper (DeCandia et al., SOSP 2007) and its open-source descendants. It follows the structure of the System Design Document template and is pre-filled with a worked design to adapt. Values marked Example are assumptions. Replace every [bracketed] value and every row marked Example.

Document control

FieldValue
Document ID[SDD-KV-001]
System / feature[Distributed key-value store]
Version[0.1]
Status[Draft / In review / Approved / Implemented / Superseded]
Author(s)[@author]
Reviewers[@reviewer-1], [@reviewer-2]
Last updatedYYYY-MM-DD
Classification[Internal]
Operating modes[Durable store / Cache / Both]
Related[Capacity estimation worksheet CAP-EST-nnn], [Database design], [ADR: conflict resolution]

Approvals

RoleNameDecisionDate
Tech lead[@name][Approved / Changes requested]YYYY-MM-DD
Staff / principal engineer[@name][Decision]YYYY-MM-DD
SRE / operations[@name][Decision]YYYY-MM-DD
Security[@name][Decision]YYYY-MM-DD
Main client team[@name][Decision]YYYY-MM-DD

Revision history

VersionDateAuthorChange summary
0.1YYYY-MM-DD[@name]First draft for design review
0.2YYYY-MM-DD[@name]Example: Default quorum changed from R=1, W=1 to R=2, W=2 after stale-read incident analysis
0.3YYYY-MM-DD[@name]Example: Added cache mode with LFU eviction
1.0YYYY-MM-DD[@name]Example: Approved

Contents

1. Overview

1.1 Problem statement

[Example: Session, cart and user-preference data live in a single relational primary that reaches 80% CPU at peak. Most access is by primary key, values are opaque blobs, and the business prefers accepting a write during a zone failure over rejecting it. Teams also run four separate cache clusters with different eviction settings and no shared operations.]

1.2 Proposed solution

[Example: A leaderless, replicated key-value store. Keys are placed on a consistent-hash ring with virtual nodes; each key is stored on three nodes in three zones. Any node can coordinate a request; reads and writes succeed when two of three replicas answer. Concurrent updates are detected with version vectors and returned to the client for merging, or resolved by last-write-wins for keyspaces that opt in. Temporary failures are covered by hinted handoff, permanent divergence by Merkle-tree anti-entropy, and membership by gossip with a phi accrual failure detector. Each node stores data in an LSM-tree engine. The same software runs as a cache with one replica, TTLs and LFU eviction.]

1.3 Decisions requested from reviewers

IDQuestionRecommended optionSection
Q-01Example: Leaderless quorums or leader per partition?Leaderless with N=3, R=2, W=27.3, 10
Q-02Example: Conflict resolution default?Version vectors with client merge; LWW opt-in per keyspace7.4
Q-03Example: Strict or sloppy quorum?Sloppy quorum with hinted handoff7.5
Q-04Example: Compaction strategy?Leveled for read-heavy keyspaces, size-tiered for write-heavy7.8
[Q-nn][Question][Option][Section]

2. Requirements

2.1 Functional requirements

IDRequirementPriority
FR-01Example: get, put and delete by key; values up to 1 MBMust
FR-02Example: Per-request consistency level (ONE, QUORUM, ALL)Must
FR-03Example: Return all concurrent versions with a context for mergeMust
FR-04Example: Optional TTL per keyMust
FR-05Example: Conditional put on version (compare-and-set within a replica set)Should
FR-06Example: Cache mode with eviction and no durability guaranteeShould
FR-07Example: Range scans over keysWon't (hash partitioning)
[FR-nn][Requirement][Must / Should / Could]

2.2 Non-functional requirements

IDQualityTargetMeasured as
NFR-01Read latencyExample: p99 at or below 10 ms at QUORUM within a regionClient timing
NFR-02Write latencyExample: p99 at or below 15 ms at QUORUMClient timing
NFR-03Write availabilityExample: Writes accepted during loss of one zoneZone failure game day
NFR-04DurabilityExample: No acknowledged QUORUM write lost with one zone lostFault injection with verification
NFR-05ConvergenceExample: Replicas converge within 1 h after a partition healsAnti-entropy metrics
NFR-06ElasticityExample: Add a node without downtime; rebalance under 4 hExpansion test
[NFR-nn][Quality][Target][Measurement]

2.3 Out of scope

  • [Example: multi-key transactions and secondary indexes]
  • [Example: cross-region synchronous replication (regions replicate asynchronously)]
  • [Example: SQL or query language]
  • [Item deferred, with the release that will take it]

3. Capacity estimation

3.1 Assumptions

InputSymbolValueSource
Items storedKKExample: 2 billionMigration inventory
Bytes per item on disk (key, value, metadata)ssExample: 1 200 BSample of production rows
Replication factorNNExample: 37.2
Space amplification of the engineaaExample: 1.3Benchmark with leveled compaction
Usable disk per node at target fill (2 TB at 50%)ddExample: 1 TBHardware standard
Peak client reads per secondQrQ_{r}Example: 300 000Current database metrics x growth
Peak client writes per secondQwQ_{w}Example: 60 000Current database metrics x growth
Read quorum, write quorumRR, WWExample: 2, 27.3
Replica operations per node at saturationccExample: 120 000/sBenchmark on target instance

3.2 Storage and node count

S=K×s×N×a=2×109×1 200 B×3×1.3=9.36 TBS = K \times s \times N \times a = 2 \times 10^{9} \times 1\,200 \ \text{B} \times 3 \times 1.3 = 9.36 \ \text{TB}
ndisk=⌈9.361⌉=10 nodesn_{disk} = \left\lceil \frac{9.36}{1} \right\rceil = 10 \ \text{nodes}

The cluster is set to 12 nodes (four per zone) so that each zone holds one full copy of the data and storage has room for one year of growth.

3.3 Replica operations

A coordinator sends each read to RR replicas and each write to all NN replicas (waiting for WW acknowledgements):

O=Qr×R+Qw×N=300 000×2+60 000×3=780 000 replica ops/sO = Q_{r} \times R + Q_{w} \times N = 300\,000 \times 2 + 60\,000 \times 3 = 780\,000 \ \text{replica ops/s}
per node=780 00012=65 000 (54% of c),one node lost=780 00011≈70 900 (59%)\text{per node} = \frac{780\,000}{12} = 65\,000 \ (54\% \text{ of } c), \qquad \text{one node lost} = \frac{780\,000}{11} \approx 70\,900 \ (59\%)

With a whole zone lost (eight nodes left) the load is 97 500 per node, 81% of saturation: the cluster survives but runs hot, so zone loss is a declared degraded mode that pauses compaction-heavy maintenance (9.1).

3.4 Network

Bw=60 000×1 200 B×3=216 MB/s,Br=300 000×1 200 B=360 MB/sB_{w} = 60\,000 \times 1\,200 \ \text{B} \times 3 = 216 \ \text{MB/s}, \qquad B_{r} = 300\,000 \times 1\,200 \ \text{B} = 360 \ \text{MB/s}

Reads fetch the full value from one replica and a digest from the other, so read bandwidth is close to one copy per read. About 576 MB/s across 12 nodes is under 50 MB/s per node, far below a 10 Gbit/s link.

3.5 Summary

QuantityEstimateDesign consequence
Data on disk9.36 TB with 3 replicas12 nodes of 2 TB, four per zone
Replica operations780 000/s at peak54% per node normally, 81% with a zone lost
Networkabout 576 MB/s cluster-wideNot a constraint
Ring tokens12 nodes x 256 virtual nodes = 3 072About 651 000 keys per token range

4. API design

4.1 Operations

OperationParametersReturnsNotes
getkey, consistency (ONE, QUORUM, ALL)One or more versions, each with value and contextMore than one version means a conflict to merge
putkey, value, context, consistency, ttlNew contextContext from the last get makes the write a descendant
deletekey, context, consistencyNew contextWrites a tombstone kept for the grace period
caskey, expected context, valueSuccess or current versionsOnly within one replica set; runs a consensus round (for example Paxos) among the replicas, so it is slower than put
batch_getup to 100 keysMap of resultsFan-out across coordinators

4.2 Request and response examples

The service exposes gRPC; the JSON below shows the same shape for readability:

{"op": "get", "keyspace": "carts", "key": "user:48213", "consistency": "QUORUM"}
{"versions": [{"value": "eyJpdGVtcyI6WzEyLDQ0XX0=", "context": "vv:A=4,B=2"}, {"value": "eyJpdGVtcyI6WzEyLDQ1XX0=", "context": "vv:A=3,C=1"}], "conflict": true}

The client merges the two carts, then writes with a context that dominates both versions:

{"op": "put", "keyspace": "carts", "key": "user:48213", "value": "eyJpdGVtcyI6WzEyLDQ0LDQ1XX0=", "context": "vv:A=4,B=2,C=1", "consistency": "QUORUM"}

4.3 Errors

ErrorMeaningClient action
UNAVAILABLE_QUORUMFewer than R or W replicas answered in timeRetry with backoff, or lower consistency if the keyspace allows
TIMEOUTCoordinator timed out; write may or may not be appliedRetry with the same context; a duplicate can surface as a sibling with the same value, which the next merge collapses
VALUE_TOO_LARGEValue above the configured limitStore large objects elsewhere and keep a pointer
CAS_FAILEDExpected context is not currentRead, merge, retry

5. Data model

5.1 Entities

Each stored record carries its version vector; ring metadata is small and gossiped to every node.

5.2 Keyspace settings

KeyspaceModeNDefault R / WConflict modeCompactionTTL
carts (Example)Durable32 / 2Version vectors, client mergeLeveled30 days
sessions (Example)Durable31 / 2Last-write-winsSize-tiered24 h
prefs (Example)Durable32 / 2Last-write-winsLeveledNone
page-cache (Example)Cache11 / 1Not applicableIn-memory only10 min

6. High-level design

ComponentResponsibilityScales by
Client libraryKey hashing, choose coordinator (token-aware), retries, merge callbackWith clients
CoordinatorFind replicas, send requests, wait for quorum, read repairEvery node can coordinate
Storage engineDurable local storage with WAL, memtable and SSTablesPer node disk
Gossip and failure detectorMembership, token ownership, livenessEvery node
Hint storeWrites held for an unreachable replicaPer node, bounded
Anti-entropyDetect and repair divergence between replicasBackground, throttled

7. Detailed design

7.1 Partitioning: consistent hashing with virtual nodes

Keys are hashed (for example with a 64-bit Murmur3 or xxHash) onto a ring. Each node owns many points on the ring, called virtual nodes or tokens; a key belongs to the first token clockwise from its hash. With plain consistent hashing, adding or removing a node moves only the keys of the ranges next to it, about 1/n1/n of the data.

Virtual nodes fix two problems of one-token-per-node rings: uneven range sizes and the fact that a joining or leaving node exchanges data with only two neighbours. With 256 tokens per node, a new node takes small ranges from every existing node, so rebalancing is spread across the cluster. Fewer tokens per node reduce metadata and repair overhead; more tokens reduce imbalance. Measure the load spread on your key distribution and record the choice.

7.2 Replication

The preference list for a key is the next NN distinct physical nodes clockwise from the key's position, skipping tokens of nodes already chosen and placing at most one replica per zone. With N=3N = 3 and three zones, each zone holds one copy of every key, so losing a zone leaves two copies.

7.3 Quorum reads and writes

A write succeeds when WW replicas acknowledge it; a read returns when RR replicas answer. If the read set and write set must overlap in at least one replica:

R+W>NR + W > N

With N=3N = 3, R=2R = 2, W=2W = 2 gives 2+2=4>32 + 2 = 4 > 3. Writes stay available with up to N−W=1N - W = 1 replica down; reads with up to N−R=1N - R = 1 down.

Setting (N=3)OverlapRead latencyWrite latencyTolerates for reads / writesUse for
R=1, W=3YesLowestHighest2 / 0 failuresRead-mostly config data
R=2, W=2YesMediumMedium1 / 1Default
R=3, W=1YesHighestLowest0 / 2Rare; one acknowledged copy risks loss
R=1, W=1NoLowestLowest2 / 2Data where stale reads are harmless

Overlap is not linearizability. Concurrent writes can still conflict, a write that failed to reach WW may remain on some replicas and be read later, and sloppy quorums (7.5) let writes land on nodes outside the preference list. Use cas (4.1) or a separate consensus-based store when an operation needs a single serial order.

Read repair: when the coordinator sees replicas with older versions in a read, it writes the newest version back to them after answering the client.

7.4 Consistency models and conflict resolution

The default model is eventual consistency. When R+W>N holds and no sloppy-quorum fallback is in play, a read observes the latest acknowledged write; during failures and hinted handoff it may not, so clients must not assume read-your-writes.

Version vectors. Each version carries a list of (node, counter) pairs. A coordinator increments its own counter on each write. Version X descends from Y if every counter in X is at least the one in Y; otherwise they are concurrent and both are kept.

StepEventVersion vectorRelationship
1 (Example)Node A writes cart v1A=1Initial
2 (Example)Node A writes v2 using context of v1A=2Descends from v1, v1 discarded
3 (Example)During a partition, node B writes v3 from v2A=2, B=1Descends from v2
4 (Example)Node C writes v4 from v2A=2, C=1Concurrent with v3
5 (Example)Client reads v3 and v4, merges, writes via node AA=3, B=1, C=1Descends from both

Vectors grow with the number of coordinators; prune entries older than a threshold (for example keep the ten most recent) and accept that pruning can occasionally surface a false conflict.

Last-write-wins (LWW). Each write carries a timestamp and the highest wins. It needs no client merge, but clock skew silently drops writes: a node whose clock runs 200 ms fast wins against a real later write. Use LWW only where losing a concurrent update is acceptable (sessions, preferences), use hybrid logical clocks to limit skew effects, and monitor clock offset.

Alternatives: conflict-free replicated data types (counters, sets, registers) merge automatically and suit carts and counters; they constrain the value format.

7.5 Sloppy quorum and hinted handoff

When a replica in the preference list is unreachable, the coordinator sends the write to the next healthy node on the ring with a hint naming the intended owner. The fallback node stores the hint and replays it when gossip reports the owner alive again.

Hints are capped per target (for example 3 hours of writes); beyond that the hint is dropped and anti-entropy repairs the replica. A hinted write counts toward WW for availability, which is exactly why sloppy quorums weaken the overlap guarantee in 7.3.

7.6 Anti-entropy with Merkle trees

Each replica keeps a Merkle tree per token range: leaves are hashes of small key ranges, inner nodes hash their children. Two replicas compare roots; if they differ, they descend only into differing subtrees and stream the keys under differing leaves. With about 651 000 keys per token range and 215=32 7682^{15} = 32\,768 leaves, each leaf covers about 20 keys, so a repair moves little more than the divergent data.

Run repair on every range within the tombstone grace period (7.8); otherwise a replica that missed a delete can resurrect the deleted value.

7.7 Membership, gossip and failure detection

  • Gossip: every second each node exchanges its view (node, generation, heartbeat version, status, tokens) with one to three random peers. State spreads to all nodes in a number of rounds that grows with the logarithm of cluster size.
  • Seeds: a small list of seed nodes bootstraps new members and prevents logical partitions of the gossip graph.
  • Failure detection: a phi accrual detector turns inter-arrival times of heartbeats into a suspicion level ϕ\phi; a node is marked down for routing when ϕ\phi exceeds a threshold (Example: 8). Marking down is local and reversible; removing a node from the ring is an explicit operator action, so a flapping network never triggers mass data movement.

7.8 Storage engine: LSM tree and compaction

Writes go to a write-ahead log (fsync policy per keyspace) and an in-memory memtable. Full memtables flush to immutable sorted files (SSTables) with a Bloom filter and a sparse index. Reads check the memtable, then SSTables from newest to oldest, skipping files whose Bloom filter excludes the key. Deletes write tombstones that remain for a grace period (Example: 10 days) before compaction can drop them.

StrategyHow it mergesWrite amplificationRead amplificationSpace amplificationUse for
Size-tieredMerge files of similar sizeLowHigher (more files per key)High during merges (up to 2x temporarily)Write-heavy, TTL data
LeveledKeep levels of non-overlapping files, each about 10x largerHigherLow (about one file per level)Low (about 1.1x)Read-heavy, updates
Time-windowGroup files by write time; drop whole windows on expiryLowLow for recent dataLowTime series with TTL

Throttle compaction so it never takes more than a set share of disk bandwidth at peak, and alert when pending compaction bytes keep growing.

7.9 Cache mode and eviction policies

In cache mode a keyspace runs with N=1N = 1 (or 2 for hot data), no WAL, an in-memory engine and mandatory TTLs. When memory reaches the limit, the eviction policy picks victims:

PolicyEvictsStrengthWeakness
LRULeast recently usedSimple, good for recency-driven accessA single scan flushes the hot set
LFU (with decay)Least frequently usedKeeps stable hot keysSlow to adapt without decay
TinyLFU-style admission plus LRUAdmits a new key only if it is likely more popular than the victimScan resistant, high hit ratioMore complex, sketch memory
TTL-firstKeys closest to expiryPredictableIgnores popularity
RandomAny keyCheapestLower hit ratio

Example: the page cache holds a hot set of 240 GB on six nodes with 48 GB usable each (288 GB, 83% full), LFU with decay, TTL 10 minutes. Cache misses fall through to the owning service, which must survive a cold cache; see 9.1.

7.10 Hot keys

Detect hot keys with a per-node top-k sketch (count-min sketch plus heap) exported every 10 s. Mitigate in order:

  1. Client-side near cache with a short TTL (1 to 5 s) for read-hot keys.
  2. Read from any replica (R=1) for keyspaces that accept staleness, which spreads a hot key over three nodes.
  3. Split write-hot counters into mm sub-keys (key#0 to key#m-1) and sum on read.
  4. Request coalescing at the coordinator so concurrent misses on the same key cause one storage read.

8. Scalability and performance

ConcernApproachLimit before redesign
ThroughputAdd nodes; tokens rebalance across the clusterExample: load per node above 60% at peak
StorageAdd nodes; leveled compaction keeps space amplification lowDisk fill above 50%
Large valuesLimit 1 MB; larger objects go to object storageValues above 100 KB hurt tail latency
Hot keys7.10One key above a single node's capacity even after splitting
Wide fan-out batchesToken-aware batching per replica setBatches above 100 keys

Latency budget for a QUORUM read (target p99 10 ms):

StepBudget
Client to coordinator (token-aware, same zone)0.5 ms
Coordinator to second-fastest replica, cross-zone round trip2 ms
Storage read (memtable or one to two SSTables, block cache)3 ms
Merge versions, build response0.2 ms
Headroom (compaction, garbage collection, queueing)4.3 ms

9. Reliability, security and operations

9.1 Failure modes

FailureImpactDetectionMitigation
One node downWrites go to fallbacks with hintsGossip, ϕ\phi above thresholdHinted handoff; repair after hint window
One zone downTwo replicas remain; load 81% per nodeZone healthDeclared degraded mode; pause repair and major compaction
Network partitionBoth sides accept writes at sloppy quorumGossip views disagreeVersion vectors surface conflicts; merge on read
Disk failureNode loses dataDisk errorsReplace node, stream from replicas, run repair
Clock skewLWW keyspaces drop writesClock offset metric above 50 msNTP or PTP monitoring; vector-clock keyspaces unaffected
Cold cache after restartBackend overloadHit ratio dropWarm from snapshot; rate-limit misses to the backend
[Failure][Impact][Signal][Mitigation]

9.2 Security

ThreatControl
Unauthenticated accessmTLS between clients and nodes and between nodes; per-keyspace credentials
Data exposure at restDisk encryption; keys in a key management service
Rogue node joining the ringNode certificates checked before gossip admission
Noisy tenantPer-keyspace request quotas and size limits
[Threat][Control]

9.3 Observability

SignalMetric or logAlert threshold
Latencyp99 get and put per keyspaceAbove NFR-01 or NFR-02 for 10 min
Quorum failuresUNAVAILABLE_QUORUM rateAbove 0.01% for 5 min
Hints pendingBytes per target nodeGrowing for more than 1 h
Repair progressRanges repaired within grace periodAny range older than grace period minus 2 days
CompactionPending compaction bytesGrowing for more than 6 h
ConflictsVersions returned per getSudden rise (partition or client bug)

9.4 Cost estimate

ItemUnit costQuantityMonthly cost
Storage nodes[USD per node-month]Example: 12[USD]
Cache nodes[USD per node-month]Example: 6[USD]
Cross-zone traffic[USD per GB]Replication and reads across zones[USD]
Backups (snapshots to object storage)[USD per TB-month]9.36 TB[USD]
Total[USD]

10. Trade-offs and alternatives

DecisionOptionsChosenWhyWhat we give up
Replication modelLeader per partition (Raft); leaderless quorumsLeaderlessWrites available during zone loss without electionNo single serial order; conflicts possible
PartitioningRange; hash with vnodesHash with vnodesEven spread, simple rebalancingNo range scans
Conflict resolutionLWW; version vectors; CRDTsVersion vectors default, LWW opt-inNo silent loss where it mattersClient merge code
Quorum typeStrict; sloppySloppy with hintsHigher write availabilityWeaker overlap during failures
EngineB-tree; LSM treeLSM treeHigh write throughput, compressionCompaction overhead, read amplification
Build or buyManaged service; open-source; build[Choice][Reason][Cost]
[Decision][Options][Chosen][Why][Cost]

11. Delivery plan and risks

11.1 Milestones

MilestoneScopeExit criterionTarget date
M1Cluster of 12 nodes, prefs keyspace in shadow writesFault injection suite passes (node, zone, partition)YYYY-MM-DD
M2sessions keyspace livep99 targets met for 14 daysYYYY-MM-DD
M3carts keyspace with client mergeConflict merge tested with recorded partitionsYYYY-MM-DD
M4Cache mode replaces team cache clustersHit ratio at or above previous clustersYYYY-MM-DD

11.2 Rollout and rollback

[Example: Dual-write from the relational database to the new store, compare reads in shadow mode, then switch reads per keyspace behind a flag. Rollback switches reads back; dual writes continue until the keyspace has run 30 days without discrepancy.]

11.3 Risks

IDRiskLikelihoodImpactMitigationOwner
R-01Example: Client teams ignore conflicts and drop versionsMediumHighLibrary forces a merge callback; tests in client CI[@name]
R-02Example: Repair falls behind, deleted data resurrectsMediumHighRepair scheduler with alerts before the grace period ends[@name]
R-03Example: Zone loss pushes nodes above saturationLowHighCapacity review at 50% growth; add a node per zone[@name]
[R-nn][Risk][L / M / H][L / M / H][Mitigation][@name]

12. Appendices

12.1 Open questions

IDQuestionOwnerDue
OQ-01Example: Do any keyspaces need cross-region active-active writes?[@name]YYYY-MM-DD
OQ-02Example: Is a CRDT library acceptable for carts instead of client merge?[@name]YYYY-MM-DD
[OQ-nn][Question][@name]YYYY-MM-DD

12.2 Glossary

TermMeaning
Consistent hashingPlacement where adding or removing a node moves only nearby key ranges
Virtual node (token)One of many ring positions owned by a physical node
Preference listThe N nodes responsible for a key
QuorumMinimum number of replicas that must answer (R for reads, W for writes)
Sloppy quorumQuorum counted on the first healthy nodes, not only the preference list
Hinted handoffHolding a write for an unreachable replica and replaying it later
Version vectorPer-node counters attached to a value to detect concurrent updates
Merkle treeTree of hashes used to find differing key ranges cheaply
TombstoneMarker recording a delete until all replicas have seen it
[Term][Meaning]

12.3 References

ReferenceUse
G. DeCandia et al., "Dynamo: Amazon's Highly Available Key-value Store", SOSP 2007Ring, preference lists, sloppy quorum, hinted handoff, vector clocks, Merkle-tree anti-entropy, gossip
D. Karger et al., "Consistent Hashing and Random Trees", STOC 1997Consistent hashing
P. O'Neil et al., "The Log-Structured Merge-Tree (LSM-Tree)", Acta Informatica, 1996Storage engine in 7.8
N. Hayashibara et al., "The phi Accrual Failure Detector", SRDS 2004Failure detection in 7.7
Database design (architecture/database-design)Data modelling for the services that use the store
Capacity estimation worksheet (system-design/back-of-envelope-estimation)Method for section 3

Standard and licence note

Based on the published Dynamo paper (DeCandia et al., 2007) and the other papers listed in 12.3, used as concept sources only, and on common industry practice for distributed key-value stores. This is a reference design to adapt, with illustrative numbers. Original text written for this collection; no text from the cited papers is reproduced. Check the documentation of the store you build on for its current behaviour and defaults. Template licence: MIT.

Templat terkait