Library / Blogs

Tumblr Engineering Blog

The engineering blog of Tumblr: posts on how it designs, builds and scales its systems.

By Tumblr engineers · Tumblr · Added 2026-10-12

Open original source

All content belongs to Tumblr engineers / Tumblr. We only link to it and give credit. Report a problem

Learn this article

About 37 min left. Your work is saved as you go.

What you are about to study

Tumblr wrote this to explain how they thought about a problem. You should know the basics: caching, queues and replication.

Ideas you will meet

Distributed Systems
Consensus, time, failure and the fundamentals of scale-out.

What we already know about this

Our own lessons on these ideas. Read them here before you start, so it makes sense.

  • Advanced Distributed Systems · 13 minWrite-ahead logs, B-trees and LSM-treesHow databases make writes durable and fast: the log first, then two ways of organising data on disk and the trade-offs between them.Read here

    Durability needs a log

    A database holds data in memory pages for speed, but memory is lost on a crash. To be durable it must put a record of every change on disk before it tells the client "committed". That record is the write-ahead log (WAL): an append-only file of changes.

    Figure SDA-ADS-02-1 · Write-ahead log flow · © forcsguy.com

    The same idea appears everywhere: databases, file systems (journaling), message brokers (the log is the data) and replication (followers replay the primary's log).

    Two ways to organise data on disk

    B-trees: update in place

    A B-tree keeps sorted keys in fixed-size pages arranged as a shallow tree. Finding a key takes a few page reads; changing a key updates a page in place (plus a WAL record for safety).

    • Strengths: predictable reads, efficient range scans, mature, used by most relational databases.
    • Costs: writes touch random pages (random I/O); page splits and fragmentation; every write is written twice (WAL and page).

    LSM-trees: append and merge

    A log-structured merge tree buffers writes in a sorted in-memory table (the memtable), also logged to a WAL. When full, it is flushed as an immutable sorted file (an SSTable). Background compaction merges files and discards overwritten and deleted values.

    Figure SDA-ADS-02-2 · LSM-tree write and read path · © forcsguy.com

    • Strengths: very fast sequential writes, good compression, high write throughput.
    • Costs: a read may check several files (helped by bloom filters and caches); background compaction creates write amplification and I/O spikes; deletes leave tombstones until compaction.

    Choosing

    QuestionB-treeLSM-tree
    Write-heavy ingestionSlowerFaster
    Point reads and range scansSteadyGood, depends on compaction
    Predictable latencyEasierCompaction can add tail latency
    Space usageSome fragmentationTemporary extra during compaction
    Typical usersPostgreSQL, MySQL (InnoDB)Cassandra, RocksDB, HBase, many time-series stores

    There is no winner: choose by workload, and measure. This lesson explains why a store behaves the way it does under load, which helps when diagnosing slow writes or sudden I/O spikes.

    • Checkpoints and snapshots bound recovery time.
    • Replication often ships the WAL to replicas.
    • Fsync policy (flush every write, or every few milliseconds) is a durability versus speed knob.
    • Bloom filters appear in the probabilistic-structures lesson of the core-concepts course.

    Real-world reading

    Open this lesson with its quiz and exercise

Go deeper on this

A path through videos, articles, other case studies and code on the same ideas as Tumblr Engineering Blog.

  1. Warm upGet the vocabulary first.

  2. WatchHow others solve the same problem, on video.

    Videos belong to their creators and play from YouTube. More on YouTube (opens in a new tab)

  3. ReadEngineers explain it in their own words.

  4. See it in another companyThe same ideas, a different system.

  5. Read the codeSee how it looks when it is real.

Keep learning

Loading community…