Synthesis — Operational Databases
The evolving thesis. Spun out of the hub _inbox databases-beyond-olap cluster on 2026-07-16, once
a third source cohered: an embedded OLTP engine (turso, parked 2026-06-23), a general DB-tooling
catalog (awesome-db-tools, parked 2026-06-24), and a distributed-SQL sharding explainer
(planetscale-768-servers, the trigger). Both prior park notes had predicted that a third general-DB
source would trip this spin-out; the human chose a new spoke over broadening the OLAP-only
../analytical-databases-wiki, keeping that spoke's columnar identity sharp.
Current thesis
This spoke owns OLTP / operational databases — the row-oriented,
transactional stores in an application's request path — as the deliberate sibling to the OLAP
columnar stores in ../analytical-databases-wiki. That spoke explicitly carves out "transactional/OLTP
databases"; this is the spoke that fills the carve-out. The boundary is engineering-real: the columnar
scan that makes OLAP fast is the wrong layout for the single-row update OLTP does all day.
The founding trio traces one axis — how far a single logical database stretches — plus the tooling that keeps it running:
- Database-as-a-library — turso collapses the OLTP engine into the process: an in-process, SQLite-compatible store (a Rust rewrite of SQLite) that adds MVCC concurrent writes, async I/O, CDC, and vector/FTS. The embedded pole.
- Database-as-a-fleet — planetscale-768-servers explodes the OLTP engine across machines: sharding 768 servers behind a Vitess/Neki proxy router so they present as one database. The distributed pole.
- The tooling around them — awesome-db-tools catalogs ~200+ tools for working with
databases (clients, migration, backup, monitoring, HA) — the operational layer between "it runs" and
"it runs in production." Sharpened 2026-08-20: that layer has a governing principle, not just a
population. The engine ships the mechanism and declines the policy — replication without an
opinion about who leads (patroni), a WAL without an archiver
(pgbackrest), a process per connection without a multiplexer (pgbouncer),
SKIP LOCKEDwithout a queue (pgmq). Each tool is a declined decision, made by somebody else.
So the two engines are the same job (serve transactional SQL) at opposite scales, and the axis between them — embedded ↔ distributed — is the spoke's founding spine. It deliberately mirrors the sibling analytical spoke's own embedded↔distributed axis (duckdb ↔ clickhouse), one line down in the OLTP register.
The shape of the field (early)
- Scaling an OLTP database goes two opposite ways. Shrink it until the server disappears (turso), or shard it until one server becomes hundreds (database-sharding). Both keep the one logical database interface; they differ in where the complexity goes (into the library vs. into a proxy router).
- Why replicas aren't the answer. planetscale-768-servers's framing — single-writer WAL, replicas duplicate-not-distribute, multi-day backups — is the general case for why write-scaling forces sharding, not just more replicas. It's the clearest "why distribute at all" argument in the founding corpus.
- OLTP is reaching toward agents. turso ships an MCP server in its CLI; the seam to
../agentic-tooling-wiki(cf. seekdb, an "AI-native state store for agents" coming from the other direction) is worth watching as agent memory and operational stores converge.
The axis has a third pole: the client
The founding spine was embedded ↔ distributed, bracketed by turso (database-as-a-library) and planetscale-768-servers (database-as-a-fleet). rethinking-data-client-event-sourcing extends the embedded end past the server: in a local-first app the OLTP store runs in the user's process, serves every read and write locally, and the server becomes a sync log. So the axis now runs client → process → fleet, and the same question ("how far does one logical database stretch?") gets a third answer.
Two consequences for how this spoke reads its own subject:
The interesting component stops being the database. Local-first stacks are built on plain SQLite; the engineering has moved to the sync engine, and the field has three competing answers about what should travel over the wire — an event log (livestore), a mutable auto-merging structure (CRDTs: Automerge, Yjs, Loro), or query-scoped rows (ElectricSQL, PowerSync, Zero). This is the corpus's first real material on replication and merge semantics, which the open questions below had flagged as the top gap — arriving from the client end rather than the NewSQL end that was expected.
Consistency becomes an explicit product trade, not a default. planetscale-768-servers shards to preserve one consistent logical database; local-first gives up global consistency on purpose to buy responsiveness and offline capability. Schickling draws the line himself: financial systems and social graphs are the wrong fit. Both poles are OLTP, and they disagree about what OLTP is for — the first genuine tension in the corpus, and a useful one.
Adjacent claim worth keeping: data ownership falls out of the architecture, since the user can hold the event log or the materialized SQLite file. The spoke's other engines treat export as a feature.
The limits the mechanisms were built against
Everything this spoke held past the embedded pole described mechanism — hash routing, proxy aggregation, scatter-gather, failover — and nothing described the results that say which mechanisms are possible. podc-lecture-notes (Wattenhofer, ETH Zürich, T1) supplies them, and closes the spoke's #1 growth edge from the theory side rather than the engine side the edge asked for.
Three results reframe what the corpus already had.
Consensus is impossible in the general case, and every system is a way of dodging that. FLP, stated exactly: "There is no deterministic algorithm which always achieves consensus in the asynchronous model, with f > 0." One crash-faulty node and no timing assumptions is enough. So a store that commits across shards is not solving consensus — it is buying an assumption, either partial synchrony (which is what a timeout is) or randomisation. When a distributed database claims consensus, the question the corpus can now ask is which premise did you weaken, and what happens when it does not hold (consensus).
Arbitrary failure has a price in nodes. Byzantine agreement needs f < n/3 — the origin of the 3f+1 replica counts — and authentication moves the bound, which is why signatures get their own chapter rather than being an implementation detail.
The primary source landed 2026-08-10 (byzantine-generals-problem, Lamport, Shostak and Pease, ACM TOPLAS 1982), and it corrects the summary in one place and deepens it in two. Authentication does not move the bound, it removes it: with unforgeable signatures the paper's SM(m) works for any number of nodes and any number of faults, at the weakest connectivity that keeps the correct nodes connected. The 3f+1 count buys exactly one thing — protection against a node telling different lies to different peers — and a signature buys it outright. Both claims are the paper's own theorems.
The paper is also honest about what its assumptions cost, in a way secondary accounts drop. Detecting an absent message needs synchronized clocks, and synchronizing clocks under faults is "as difficult a problem as the Byzantine Generals Problem itself" — the assumption is the problem again. And an unforgeable signature is only probabilistically unforgeable; against a malicious operator rather than a random malfunction it becomes a cryptography problem, cited to Diffie–Hellman. Byzantine fault tolerance and adversarial security separate at that line, which is the distinction most modern uses of the word "byzantine" blur.
And the closing sentence generalises past its own subject: "The only way to reduce the cost is to make assumptions about the type of failure that may occur." Every engine in this spoke takes that discount by assuming crash-stop. Raft and Paxos are affordable because a node is assumed to die rather than lie. That is a purchase, and it is the wrong one when a node is corrupted rather than dead.
CAP is a theorem with a model, not a slogan. Introduced by Fox and Brewer (1999), proven by Gilbert and Lynch (2002) for the asynchronous model, and relaxable under partial synchrony to keep availability and partition tolerance. That kills the pick-two framing and replaces it with the real engineering move: weaken consistency by a named amount (consistency-models). Causal consistency is the name the spoke was missing when rethinking-data-client-event-sourcing arrived arguing merge semantics from an event-sourcing maintainer's position with no neutral treatment behind it.
Lamport, twice, an hour apart
part-time-parliament arrived directly after byzantine-generals-problem, and the pair is worth more than either alone because they are the two sides of one trade, made by the same author sixteen years apart.
1982 prices the general case: tolerating components that fail arbitrarily costs 3f+1 nodes, message paths of length f+1, and factorial message counts — and its closing sentence says the only way to reduce that is to assume something about how things fail. 1998 takes that discount explicitly. Paxos "does not tolerate arbitrary, malicious failures, nor does it guarantee bounded-time response. However, consistency is maintained despite the (benign) failure of any number of processes and communication paths."
That is the whole reason production databases can afford consensus at all. Crash-stop is not a simplification, it is the purchase, and it is why Raft-backed and Paxos-backed engines carry no 3f+1 replica count — they are defending against absence, not against lies. The corresponding exposure is now nameable: a node that is corrupted rather than dead is outside the model every store in this spoke runs on.
Paxos also answers a question the spoke had been using without asking. Why majorities? Because quorum intersection is the mechanism (condition B2), and any two majorities of a set share a member; that member is what carries a decided value into every later ballot (B3). Majority is the cheapest quorum system, not the principle.
And the FLP framing above is confirmed from the primary source rather than inferred: the paper states that any protocol meeting its progress condition "must involve measuring the passage of time," footnoted to Fischer, Lynch and Paterson. Safety needs no clock; only termination does. The paper is candid that leader selection — the part production systems find hardest — is the part it declines to specify, ending that section with the note that no record of the presidential selection protocol survives.
And then the implementation showed up
chubby-lock-service (Burrows, OSDI 2006) arrived third, an hour after the two Lamport papers, and it changes the shape of the theory block rather than adding to it. This is a system, not a result — Paxos running at Google with an outage budget attached — and it is the production witness consensus had been asking for since 2026-08-08.
Three things it contributes that no theory paper can.
The master lease, which is how consensus becomes affordable to read from. A master wins a majority plus promises that nobody will elect a rival for a few seconds, and can then serve reads alone, because the promise proves no other master exists. Writes still cost a majority. That asymmetry — cheap reads bought with a time-bounded promise rather than a quorum — is the single most reusable idea in the paper, and it is invisible from the algorithm.
Consensus as a rented service rather than a library. Google had the Paxos library and shipped a central lock service anyway. The stated reason is organisational — applications acquire high availability after they have users, and a lock is a two-statement change where a replicated state machine is a rewrite — but the load-bearing reason is structural: a consensus library needs a quorum of the application's own servers to make progress, while a lock service lets a single client proceed safely. The quorum is relocated, not removed. Read beside part-time-parliament, that is the same trade one level up: 1998 makes agreement affordable by assuming benign failure; 2006 makes it affordable by making it somebody else's service.
What actually breaks. 61 outages over 700 cell-days, most under 15s. Six data losses in a few dozen cell-years: four database software bugs, two operator errors, none from hardware — and the operator errors happened during upgrades intended to fix the software bugs. In a system built for reliability, redundancy handled the failure mode it was designed for and every loss came from the code or the people. This spoke should hold that against any future engine that sells replication as a data-safety story.
One correction to its own premise, worth keeping. Chubby was designed as a lock service and its most popular use is naming — 60% of open files — because consistent caching with explicit invalidation beats DNS's time-based TTL when polling is expensive. Locks are 31 ppm of its RPC traffic; KeepAlives are 93%. A system's dominant use was not the one it was built for, and the paper says so plainly.
This also weakens the split case below. Chubby is an operational system, not theory — it belongs to a spoke about running databases more comfortably than to a hypothetical theory spoke.
The same algorithm, told twice, and the second telling is what worked
paxos-made-simple arrived fourth. It is not new territory — it is part-time-parliament again, with the island removed — and that is what makes it useful.
It derives rather than asserts. The 1998 paper states conditions B1–B3 and proves them; the 2001 paper builds them, P1 → P2 → P2a → P2b → P2c, each strengthening forced by a counterexample against the last. Reading them in order shows a result and then the reasoning that makes it inevitable, and the spoke now has both.
It is the source of the working vocabulary. Proposers, acceptors, learners; prepare/promise and accept/accepted. Every implementation in the field speaks this paper's language, not the 1998 one's. The algorithm now has its own page, paxos, because three sources cover it from three angles.
Two ideas worth keeping loose from Paxos. First: when you cannot observe the future, forbid it — a proposer cannot know what acceptors will accept, so phase 1 extracts a promise that they will not. Chubby's master lease is the same trick with a clock on it. Second, stated flatly where the 1998 paper only implies it: a failed or contested leader election costs availability and never correctness. That is the licence every leader-based system in this spoke operates under, and it is why a brief two-leader window is survivable.
And a fact about how ideas travel, not about consensus. Lamport published a rewrite of his own
paper with the content unchanged and only the exposition fixed, and the rewrite is the one the field
learned from. The idea was complete in 1998 and did not spread until 2001. That belongs to
../research-wiki's diffusion-and-adoption cluster more than here; noted, not argued.
The routing caveat got a second data point. The byzantine paper routed here on 2026-08-10 over
../research-wiki (which owns Lamport's tla-plus and the formal-methods lineage) because this spoke
holds consensus. Three theory sources now — Wattenhofer's notes, the 1982 byzantine paper and the 1998 Paxos paper —
all in a spoke defined by operational databases. The trigger the earlier note set has been reached and
is recorded as a live question for the hub rather than settled here.
The fourth source argued against the split. chubby-lock-service is a production system with an
outage budget, not a theorem, and it makes the block look less like stray theory and more like a
consensus stratum this spoke was always going to need: the mechanism, its limits, and one system that
runs it. The case for a distributed-systems-theory spoke is weaker at four sources than it was at
three. Left open, and paxos-made-simple does not move it: a second telling of an algorithm the spoke
already holds deepens one page rather than widening the footprint. The trigger stays what it was — a
source opening new distributed-systems territory with no system attached.
A routing caveat worth keeping visible. Fifteen of the book's twenty-two chapters — graph colouring,
distributed sorting, wireless protocols, self-stabilisation, game theory — are outside this spoke and are
recorded rather than paged. The source's centre of gravity sits outside the spoke that holds it. If more
distributed-systems theory arrives, a distributed-systems-theory spoke is the natural home and this
routing should be revisited rather than defended.
The base case, written down at last
The spoke spent a month describing departures from a thing it had never described. postgresql and mysql are now here from their own documentation, and two details do work immediately.
Postgres forks a process per connection. Not a thread — an OS process, with the supervisor staying up to accept the next one. That single fact is behind connection pooling being mandatory rather than an optimisation, and it marks how far turso moves at the embedded end (no server process exists) and vitess at the distributed end (the process you connect to is a proxy that speaks the MySQL wire protocol).
InnoDB's clustered index makes the shard key and the primary key one decision. Table data lives inside the primary key index, and secondary index entries carry the primary key rather than a row pointer, so a non-primary-key lookup is two traversals. cross-shard-queries describes the same choice one level up, where the wrong key turns a query into a scatter. The cost structure that decides a query's fate on one node is the cost structure that decides whether a fleet can route it — vitess's vindexes are that decision made twice.
And both engines run MVCC, reached independently, with different bills: Postgres writes new heap versions and pays in bloat and vacuum, InnoDB keeps an undo log and pays under long transactions. The shared guarantee — reading never blocks writing, writing never blocks reading — is the single-node version of the question consistency-models asks of distributed systems. On one node a snapshot is exact and cheap. The moment there is more than one node, "as it was some time ago" needs a clock nobody gets for free, and you are back in consensus.
The router moved inside the engine
citus arrived 2026-08-20 and it rearranges the distributed end rather than adding to it. Everything this wiki knew about scaling a transactional database across machines came from planetscale-768-servers and vitess-query-serving-docs, and both describe the same shape: a proxy in front of the engine, holding topology metadata, parsing SQL, routing by a vindex, merging what it could not route. Citus does the identical job from the opposite side of the process boundary — it is a Postgres extension, the coordinator is a Postgres server, and every shard is an ordinary Postgres table on an ordinary Postgres worker.
The consequence is a capability claim rather than a performance one. A proxy can only route what it can parse and only merge what it can compute, so every engine feature it wants to support across shards has to be reimplemented in the proxy. An extension inherits the whole engine: PostGIS, JSONB, lateral joins, HyperLogLog and time partitioning keep working on a distributed table because the thing executing the fragment is Postgres. The bill comes due elsewhere — Citus is welded to one engine and one major-version cadence, which is why it maintains three release branches simultaneously, and it is AGPL-3.0 where the proxy vendors are not.
What both agree on is more useful than where they differ. cross-shard-queries now holds the same rule from two independent systems: push as much as possible into the underlying engine, fan out and merge only what you must, and make the routable path cover your real queries. Vitess's lever for that is the vindex; Citus's is shard-colocation — same distribution column, same node, therefore local joins, foreign keys and transactions. Two vocabularies, one instruction to the application developer. And neither source prices the fallback: two engines now describe scatter-gather and not one of them measures it.
Then the part the vendor does not advertise. Citus does not implement its own high availability. It defers to Patroni 3.0, which models the cluster as one replication group per shard group, each with a Postgres leader and sync standby. So the failover story is per-group streaming replication, not a cluster-wide consensus protocol — there is no Raft or Paxos anywhere in this system's own account of itself. The spoke spent two ingests establishing what consensus costs (podc-lecture-notes, paxos) and the first production distributed store it pages turns out to route around the question by decomposing into independent Postgres pairs. That is a real design position, and it is also the reason the README says nothing about cross-shard transaction commit — Citus distributes the data plane and borrows the control plane.
Where the consensus actually was, and the shape of everything around the engine
(added 2026-08-20, second ingest of the day — the awesome-postgres catalog, mined for four primary sources)
The citus ingest that morning ended on a negative: a production distributed Postgres that ships no failover of its own and hands the job to Patroni. Following that thread is what this batch did, and it resolves a question the spoke has carried since podc-lecture-notes — not by finding the consensus algorithm inside a database, but by finding out that it is nowhere near one.
patroni implements no consensus either. It holds a leader lock with a TTL in an external
distributed configuration store — etcd, Consul, ZooKeeper, or the Kubernetes API — and derives its
entire failover policy from three integers and the inequality binding them:
loop_wait + 2 * retry_timeout <= ttl. The primary renews the key; if it cannot, the key expires and
someone else takes it. So the stack is: Postgres has no opinion about who is primary. Patroni
decides, but only by asking. The quorum, the election and the replicated log all live one layer
further down, in a system nobody in this corpus has yet read. Raft has finally been located —
Patroni's own repository topics list it beside etcd, consul and zookeeper — and it is still
unread, which is now a sharper statement of growth edge 4 than "no engine's own account exists."
That relocation makes chubby-lock-service retroactively the most load-bearing source here. Its argument was that a lock service beats a Paxos library because a library needs a quorum of your servers while a lock service lets one client proceed. Patroni is that argument instantiated for Postgres eighteen years later: one primary, not a quorum member, made safe by a lease held in somebody else's quorum.
And Patroni adds the thing the theory does not cover. Consensus can decide who should lead; it cannot make a demoted primary stop accepting commits. Patroni's answer is a hardware watchdog armed to expire five seconds before the TTL — if the process cannot shut Postgres down cleanly, the kernel reboots the machine. Fencing is where distributed-systems theory hands off to a device file, and no source here had said so before.
The second finding is about the ecosystem's shape and it is a ratio. awesome-postgres holds several hundred entries, and five of them are an alternative server. Everything else runs inside a stock Postgres or beside it. postgresql-extensions writes that up: a distributed database (citus), a time-series database, a spatial database, several search engines, a GPU executor, a message queue (pgmq) and an entire storage engine are all shipped as extensions rather than forks. Citus argued from one vendor's side that the extension seam was wide enough; the catalog is the population-scale version of the same claim. The cost is visible in the same sources — a C extension is compiled against a server version (citus maintains three release branches for it), and loading code into a server is a privilege managed platforms withhold, which is why pgmq ships a second SQL-only install path for "someplace that does not natively support" the extension.
The third is the one the tooling half of the domain was always promising. Read together,
patroni, pgbackrest, pgbouncer and pgmq describe one pattern: the engine ships the
mechanism and declines the policy. Postgres has streaming replication and no opinion about who
should be primary; a WAL and no archiver; one forked backend per connection
and no multiplexer; SKIP LOCKED and no queue. Each of those four tools is a declined decision, made
by somebody else and shipped separately. That is what "and the tooling around them" in this spoke's
domain line turns out to mean, and it is a better answer than the founding corpus's — which was
simply that tools exist.
The commit protocol, and the catalog read to the end
(added 2026-08-20, third pass — the curator asked for the rest of the catalog's items, so awesome-postgres was mined to completion: eleven subjects at their primary source, every remaining entry recorded in fourteen coverage pages)
Growth edge 1 closes here, and it took a fork to close it. yugabytedb is the first source in
this corpus that describes a distributed store's own commit protocol. Tablets are Raft groups; a write
is durable when "replicated to a majority of tablet-peers and successfully persisted on the
majority"; fault tolerance is stated as RF >= 2f + 1, which is the quorum bound
part-time-parliament proves and podc-lecture-notes derives, restated as a config parameter.
Cross-shard transactions write provisional records that are "invisible to readers until the
transaction commits", coordinated through a transaction status table that is "just another
sharded table in the system", with the commit timestamp "chosen as the current hybrid time at the
transaction status tablet at the moment of appending the transaction committed entry to its Raft
log." Two-phase commit whose coordinator decision is made durable by a Raft append, with coordinator
failure handled by provisional-record expiry rather than by blocking.
So the spoke now holds three positions on distributing a transactional SQL database, not two: extension (citus — inherits Postgres's replication, therefore no consensus of its own), proxy (vitess/planetscale — engine-agnostic, reimplements what it needs), and reimplementation below the SQL layer (yugabytedb — the only one that gets per-shard consensus, at the price of no longer being Postgres beneath the parser).
That third position is also the limit of the extension thesis. postgresql-extensions argues from the catalog that Postgres grows by extension; postgres-forks-and-derivatives enumerates the five exceptions and asks what each needed. YugabyteDB's answer is exact: an extension can add a table access method, a router, a queue, even a storage engine, but it cannot replace WAL-and-streaming replication with a Raft quorum, because Postgres exposes no such seam. The two claims fit; the fork count stays at five, and ferretdb turns out not to be one of them.
Raft is now attested twice and still unread. patroni rents it from an external store,
yugabytedb runs it as its own replication layer. What the corpus does not have is any account of
the algorithm — leader election, log matching, membership change. Growth edge 4 narrows to the paper
itself, and paging a raft concept from two second-hand product descriptions would be the exact
mistake ../HUB.md warns about.
Growth edge 9 closes too, from the engine's documentation.
postgresql-planner-statistics supplies the mechanism under the number pev2 ranks by. The
planner estimates selectivity per column from pg_statistic's MCV list and histogram — statistics
that "are always approximate even when freshly updated" — and then "assumes that the conditions are
independent, and so it multiplies their selectivities." The docs' own worked example: two identical
columns, WHERE a = 1 AND b = 1 estimated at 1 row, actual 100, "two orders of magnitude"
out. That is why estimate_factor errors skew toward underestimation — multiplying selectivities
can only shrink the estimate — and it is why a nested loop gets chosen for a join that will run
400,000 times. CREATE STATISTICS fixes it in three flavours, all opt-in per column pair, which is
what makes hypopg's what-if testing and pev2's ranking the practical entry points rather than
the catalog views.
And the spoke finally paged its own standard of evidence. pgbench exists in this corpus because of a refrain: turso unverified, planetscale-768-servers a vendor blog, citus' adaptive-executor claim unbenchmarked, pgmq silent on throughput. The instrument's documentation turns out to be mostly warnings — "never believe any test that runs for only a few seconds", scale factor must exceed client count "else you'll mostly be measuring update contention", results drift with dead-tuple accumulation and autovacuum, and the tool "can itself become the bottleneck." None of the vendor claims recorded in this spoke state any of those conditions. That does not make them false. It means the spoke's habit of marking performance claims unverified is now backed by the engine's own account of what verification costs.
Open questions
- Does the tooling member cohere with the engines? awesome-db-tools spans OLTP+OLAP+NoSQL, so it
is broader than this spoke's OLTP-engine core. It sits here because its center of gravity (clients,
migration, backup, HA) is operational and the analytical spoke is OLAP-only — but if a second tooling
source lands, "database tooling" may deserve its own corner rather than being the odd member out.
The second source landed 2026-08-13, and the answer is no corner — keep it here. pev2 is not
another broad directory; it is one deep tool for Postgres, an engine this spoke already
pages, and it reads the artifact (the execution plan) that the spoke's
distributed material was already discussing from the other end (cross-shard-queries's
VEXPLAIN TRACE). So tooling is not an odd member sitting beside the engines — the second instance binds two existing pages together. What the question was really tracking is now visible: the loose member isawesome-db-toolsspecifically, because it is a directory spanning three database families, not because it is about tools. Reframed, not closed: a third tooling source that is again a broad catalogue would reopen it. It arrived 2026-08-20 — awesome-postgres, 12k★, several hundred entries — and the reopening answers the question rather than restating it. The catalog was not ingested as content. It was mined: four subjects pulled from four of its sections and each written from its own repository or documentation (patroni, pgbackrest, pgbouncer, pgmq), plus a concept page (postgresql-extensions) whose evidence is the catalog's own section sizes. So a broad directory's role here is now settled and it is not membership by topic — a directory earns its place as a lead generator, and the pages it generates are what belongs to the spoke.awesome-db-toolshas been sitting here for a month without being mined that way, which is the outstanding item this answer creates. Treat this bullet as closed on the coherence question and reopened as a work item. - Where's the distributed-consistency substance? The founding corpus names sharding mechanics
(hash routing, proxy aggregation) but not the hard part — cross-shard transactions, consistency
models, replication/consensus. A NewSQL / distributed-SQL source (CockroachDB, Spanner, Vitess
internals, Citus) is the top gap. Partly opened 2026-07-29 from the other direction:
rethinking-data-client-event-sourcing supplies merge semantics (event-sourcing vs CRDTs vs
query sync) for the client case. The server-side consensus story is still missing.
A named candidate arrived 2026-08-20 and answered less than expected. citus was one of the four
systems this bullet asked for, and its first-party README turns out to document the architecture
(coordinator/worker, metadata sync to every node, shard-colocation) and to delegate the
consistency machinery entirely — high availability to Patroni's per-group Postgres replication,
cross-shard transaction commit to text it does not write. So the bullet stands, and now stands more
precisely: what is missing is not "a distributed-SQL source" but a distributed store's own account
of its commit protocol and failover path. Citus's engineering docs, or CockroachDB/Spanner, would
supply it; the vendor README does not.
Half of it answered the same day, from below. patroni is a production system's own account
of a real failover path — leader lock, TTL,
loop_wait + 2 * retry_timeout <= ttl,maximum_lag_on_failoveras a durability floor in bytes of WAL,synchronous_moderestricting the leader race to sync replicas, and a watchdog to fence the loser. What it establishes is that the consensus is rented from the DCS, not implemented in the database layer at all. So the bullet now splits cleanly: the failover half is answered, the commit-protocol half (cross-shard two-phase commit, distributed deadlock detection, snapshot semantics across nodes) is untouched by anything here. CLOSED later the same day by yugabytedb. Tablets as Raft groups,RF >= 2f + 1, provisional records invisible until commit, a transaction status table that is itself a sharded table, and a commit timestamp taken at the moment the committed entry is appended to that tablet's Raft log — two-phase commit with a consensus-backed coordinator, and coordinator failure resolved by expiry rather than blocking. This is precisely the "distributed store's own account of its commit protocol and failover path" the bullet had been asking for since founding. What survives: hybrid logical clocks are used throughout that protocol and defined nowhere here, which is the piece that decides whether YugabyteDB's commit timestamps mean what Spanner's TrueTime means. That, and the read-path relaxations it offers, are the remainder. - Which sync mechanism actually holds up? The event-sourcing-beats-CRDTs claim arrives from a person who maintains an event-sourcing framework, with no benchmark or comparative study. A CRDT-side source (Automerge, Yjs, Loro) or a neutral evaluation would make this a real comparison rather than one advocate's position. Same shape as the vendor-blog caution below. Partly answered 2026-09-28 by eg-walker (Gentle & Kleppmann, EuroSys 2025, T1), the CRDT side's own paper. For collaborative text, the fastest design it measures is a persisted event log with a CRDT used only during merges: 1–2 orders of magnitude less steady-state memory than stored CRDTs, much faster loads, and comparable merge cost. So the framing "event sourcing or CRDTs" is too simple. The paper covers plain text only, not the schema-changing data Schickling's claim was about, and its numbers are the authors' own.
- What does a query cost when the shard key can't route it? (added 2026-08-03) The corpus
described routing by hash of a shard key and then hand-waved the rest: cross-shard
ORDER BY,COUNT(*), and deep pagination all force a scatter-gather where every shard answers and the proxy merges. sharded-pagination-interview-post posed the sharpest version (page 100,000 across 256 shards) and is paywalled, so it arrived as a question with no answer attached. Mechanism answered the same day by the substitute route the human called for: vitess-query-serving-docs states the planning rule — push work down to MySQL where the vindex routes it, "collect input from multiple sources and merge the results" where it doesn't — and defines scatter precisely as a sharded keyspace addressed without a vindex (cross-shard-queries). It also supplies the instrument the corpus lacked:VEXPLAIN TRACEreportsShardsQueriedper operator, andVEXPLAIN KEYSnames the columns that would have to become the vindex for a query to stop scattering. Still open, and narrower than before: no source here gives a cost model for deep offsets, and none states the keyset/cursor remedy — the wiki holds the mechanism and deliberately declines to write the fix it cannot cite. This remains the read-path twin of the distributed-consistency gap above. - HTAP — the seam with the sibling.
None sourced yet.One landed 2026-08-20. citus is a distributed row store with a columnar access method (USING columnar) and an executor its own docs call adaptive — "designed to handle both query types at the same time on the same system under high concurrency." Home decided by centre of gravity: here, because it is a transactional Postgres you scaled out, and because its columnar tables refuseUPDATE,DELETEand foreign keys and want batch loads only. That restriction is the finding — Citus's columnar is an archival tier under time partitioning (old partitions compressed 26× in the README's own example, 651 MB → 25 MB), not a competitor to clickhouse or duckdb. Reframed, not closed: the HTAP claim itself is unbenchmarked here, and the SIGMOD '21 paper that would substantiate it is cited by the README and unread. A store whose OLAP side is not write-once would reopen the placement question properly. That store arrived 2026-09-23: matrixone keeps all data as immutable columnar objects in an LSM tree on S3 and still takes row-level updates, as tombstones plus new objects, under MVCC. So its analytical format is not an archival tier. Placed here anyway, and the reason is now explicit: it is sold as a MySQL replacement, and its distinctive feature (branch, diff and merge of tables) rests on primary keys and atomic commits. The two HTAP designs held so far go in opposite directions. Citus adds a columnar tier to a row store. MatrixOne builds a transactional engine out of the columnar parts. Its HTAP claim is still unbenchmarked. The paper measures only version-control operations, against the authors' own SQL.
Growth edges
Ranked; each names the kind of source that would close it (see ../QUALITY.md → Growth edges).
The distributed-consistency substance.Partly CLOSED 2026-08-08 by podc-lecture-notes — consensus, FLP, byzantine bounds, quorum systems, CAP and the weak-consistency vocabulary (consensus, consistency-models). The engine half stands: no production system's own account is here — Spanner's TrueTime, CockroachDB on Raft, Vitess's failover path — and Raft itself, the algorithm most of them run, appears in neither the book nor this wiki. — needs: an engine-internals doc or the Raft paper. Sharpened 2026-08-20: citus is a production distributed store and its README supplies no such account — it defers HA to Patroni and never mentions commit protocol. The edge needs an internals document specifically, not another product page. Relocated 2026-08-20 by patroni: the consensus this stack depends on is real and lives in the DCS — etcd, Consul, ZooKeeper — one layer below the database. The internals document this edge wants may not be a database's at all. — now needs: etcd's or Consul's own account of its Raft implementation, or the Raft paper. CLOSED 2026-08-20 by yugabytedb, which supplies the internals document from inside a database rather than beside one. Superseded by edge 4 (the algorithm itself) and by the new edge 12 (hybrid logical clocks).- A CRDT-side source. The event-sourcing-beats-CRDTs claim comes from someone who maintains an event-sourcing framework, with no benchmark. — needs: T1/T2 from Automerge/Yjs/Loro, or a neutral comparison. HALF CLOSED 2026-09-28 (research pass) by eg-walker — the CRDT side, measured, but for text only. Successor, edge 2a: a measured comparison of sync mechanisms on structured, schema-changing application data, which is where the event-sourcing claim was made. — needs: a T1/T2 benchmark or engine account covering Automerge/Loro/Yjs maps or a sync engine against an event log on app data.
- What a non-routable query costs. Opened 2026-08-03 and still unanswered after a second engine: scatter-gather cost when the shard key cannot route. citus (2026-08-20) describes parallel fan-out in the same terms vitess does and prices it no better. — needs: a measurement or an engine doc that states the penalty.
- Raft, and an engine's own account. (new 2026-08-08) podc-lecture-notes gives Paxos and the
impossibility result; the algorithm most production stores actually run is in neither the book nor
this wiki. — needs: the Raft paper, or an engine-internals doc describing a real failover path.
Half closed 2026-08-20. patroni supplies the real failover path, in first-party detail.
Raft is located — Patroni's repo topics name it, and its DCS options are consensus systems — and
still unread. This edge is now specifically the Raft paper (or etcd's implementation notes),
and nothing else will close it. Attested a second time the same day — yugabytedb runs Raft
per tablet — which raises the count of production systems in this corpus using Raft to two and the
count of sources explaining it to zero. The edge is unchanged and now conspicuous.
CLOSED 2026-08-22 (research pass) by raft-paper — Ongaro & Ousterhout's extended tech
report, read in full. Two production systems here run it and now one page explains it: strong
leader, randomized election timers, joint consensus for membership change, five safety properties,
and the availability inequality broadcastTime ≪ electionTimeout ≪ MTBF that patroni's
loop_wait + 2 * retry_timeout <= ttlis a configuration form of. Successor, edge 16: every number in it — 287 ms median failover, 35 ms at a 12–24 ms timeout — comes from the authors' own five-node implementation, and the understandability claim rests on a 43-student quiz the authors wrote and graded. No database in this corpus has published what Raft costs it. — needs: an operator's or engine's own measurement of Raft failover and commit latency in production.
Coverage edges (added 2026-08-08, at the curator's request for a wider backlog). These widen what the spoke covers instead of answering an open question above; one ordinary solid source closes any.
-
The two engines everyone actually runs.CLOSED 2026-08-09 (research pass) — postgresql and mysql written from the projects' own documentation (both T1), plus multiversion-concurrency-control as the mechanism they share. Successor: the write path. Both pages stop where the interesting operational failures start — WAL/redo, checkpointing, crash recovery, and replication, which is exactly what planetscale-768-servers describes hitting. — needs: the engines' internals docs on WAL and replication, or a chapter on write-ahead logging. The WAL half CLOSED 2026-08-20 — write-ahead-logging written from the Postgres documentation (T1): the ordering rule, REDO/roll-forward recovery, the sequential-append-versus- random-flush bargain, and "onefsyncof the WAL file may suffice to commit many transactions" as the arithmetic under OLTP throughput. pgbackrest supplies the operational half — physical backup plus archived segments is what PITR consists of. Still open: replication itself (streaming, logical, lag) and checkpoints / full-page writes, which the intro doc does not reach and which patroni configures without describing. -
Storage-engine mechanics — the durability half closed 2026-08-30. MVCC was defined from two engines' docs on 2026-08-09 (multiversion-concurrency-control), the write-ahead log on 2026-08-20 (write-ahead-logging), and on 2026-08-30 the four things that page listed as undefined — checkpoints, full-page writes and torn pages, the
synchronous_commitdurability levels, and WAL write amplification — from postgres-wal-configuration and postgres-wal-reliability (both T1). What that pass established is that write amplification and recovery time are one dial: checkpointing more often shortens replay and enlarges the log, because each page re-pays its full 8 kB image on the far side of every checkpoint. B-trees and LSM trees are still undefined, and the LSM half matters most — it is the design the spoke's OLAP siblings and every embedded key-value store use, and nothing here states the read/write-amplification trade against the B-tree. — needs: a textbook chapter or an engine's internals docs. -
Isolation levels, stated properly. consistency-models covers the distributed side; the single-node side (read committed, repeatable read, snapshot isolation, the anomalies each allows) is unwritten. — needs: the ANSI definitions plus a critique such as the Berenson et al. paper.
-
The document and key-value neighbours. MongoDB and Redis are operational stores by any reading of the domain and appear nowhere. — needs: first-party documentation, one page each. Partly opened 2026-08-20, and the distinction matters. ferretdb is a source about reproducing MongoDB's wire protocol on Postgres — including the licensing argument that produced it, MongoDB's move to SSPL — and not a source about how a document store is designed. Storage engine, indexing, and consistency model for the document family are still unpaged, and Redis is still absent entirely. The edge narrows rather than closes.
-
How the planner estimates, and how the estimates go wrong. (added 2026-08-13) pev2 and query-execution-plan give the spoke the symptom —
estimate_factor, the planner's guess against the actual row count, over or under — and the instruments for spotting it. Neither says where the guess comes from. Missing: table statistics and how they are collected, histograms and n-distinct, the independence assumption that makes correlated predicates blow up, extended statistics as the remedy, and autovacuum's role in letting them go stale. This is the mechanism under the one number both new pages treat as the main diagnostic. — needs: the Postgres planner/statistics documentation, or a query-optimizer chapter. CLOSED 2026-08-20 by postgresql-planner-statistics, written from the documentation this bullet asked for:pg_statistic/pg_stats, MCV lists and histograms,default_statistics_target, the admission that estimates "are always approximate even when freshly updated", the independence assumption with the docs' own two-orders-of-magnitude worked example, andCREATE STATISTICSin three flavours. Paired with hypopg for the what-if side. Two named pieces survive: autovacuum's role in letting statistics go stale, and whatANALYZEsampling costs on a large table. Carried into edge 13. -
The queue-as-database question, unmeasured. (new 2026-08-20) pgmq gives the spoke its first "Postgres instead of a dedicated system" subject, and neither its README nor this wiki has a single throughput number, a comparison against a real broker, or any account of what continuous
UPDATEchurn does to a heap under MVCC vacuum pressure. The same silence covers the whole extension ecosystem's performance claims. — needs: a benchmark, or a production write-up from one of the named users (Supabase, Tembo). -
The unmined catalogs. (new 2026-08-20) Two broad directories now sit in this spoke and only one has been mined. awesome-postgres' densest untouched sections are Monitoring (20 entries) and Optimization (14) — the latter aimed straight at growth edge 9, since
pgtune,PoWAandPgHeroare about the statistics pev2 can only show the symptom of. awesome-db-tools has never been mined at all. — needs: nothing new; this is work, not a gap. awesome-postgres DONE the same day, at the curator's instruction to ingest all of it: eleven subjects read at primary sources and every remaining entry recorded across fourteen coverage pages (postgres-ha-tooling, postgres-backup-tooling, postgres-monitoring-tooling, postgres-query-optimization-tooling, postgres-gui-clients, postgres-cli-tooling, postgres-schema-migration, postgres-work-queues, postgres-data-movement, postgres-client-libraries, postgres-managed-services, postgres-kubernetes-operators, postgres-forks-and-derivatives, postgres-learning-resources), plus the Extensions roster on postgresql-extensions. awesome-db-tools remains unmined — that is what is left of this edge. -
Hybrid logical clocks. (new 2026-08-20) yugabytedb's commit protocol rests on them at every step — provisional records carry a hybrid time, the commit timestamp is the status tablet's current hybrid time — and no source here defines what one is or what it guarantees without synchronised clocks. This is the piece that decides whether that commit timestamp means what Spanner's TrueTime means. — needs: the HLC paper, or Spanner's.
-
Autovacuum, and the cost of being wrong about it. (new 2026-08-20) Three separate pages now end on it. postgresql-planner-statistics leaves autovacuum's role in stale statistics as its named remainder. pgbench quotes the docs saying autovacuum "can result in unpredictable changes in measured performance." pgmq's update-per-read design makes vacuum pressure its unmeasured risk, and the catalog's
pg_squeezeexists to fight bloat with minimal locking. It is the same mechanism wearing three costumes and the corpus has no page for it. — needs: the routine-vacuuming documentation, or an internals write-up. -
A cross-shard benchmark. (new 2026-08-20, successor to edge 3) pgbench gives the spoke a measurement standard and a single-node OLTP transaction. Growth edge 3 asks what a query costs when the shard key cannot route it, which pgbench cannot answer at all. — needs: a distributed benchmark, or an engine's published scatter-gather numbers.
-
The coverage pages' own next reads. (new 2026-08-20) The fourteen T3 coverage pages each end by naming their highest-value unread entry. Ranked across all of them: aqo (feedback-driven query optimization — the deepest available answer to what is left of edge 9), AgensGraph vs AGE (the same capability shipped once as a fork and once as an extension — a direct measurement of the seam), pgroll (two live schema versions for zero-downtime migration), OrioleDB (a storage engine as an extension), Spock or BDR (multi-master conflict resolution), PostgREST (row-level security as the authorization layer), and CloudNativePG (failover implemented against the Kubernetes API rather than embedding patroni).
-
What Raft costs in production. (new 2026-08-22, successor to edge 4) raft-paper supplies the algorithm and every number in it is the authors' own: a five-node cluster of unstated hardware, 287 ms median failover, and an understandability claim resting on a 43-student quiz the authors wrote and graded. yugabytedb and the DCS under patroni both run Raft in production and neither publishes a failover or commit-latency figure. — needs: an engine's or operator's own measurement of Raft failover and commit latency under load.
-
Atomicity across shards. (new 2026-09-19, from the-architecture-of-neki) The spoke now holds two sharded-SQL systems in architectural detail, vitess and neki, and neither source says what happens to a transaction that writes to two shards. Neki's durability policies (async / sync / cross-zone sync) are per shard and describe replication, not distributed commit. This is the first question consistency-models asks of any sharded OLTP store, the spoke has the vocabulary for it (consensus, paxos, raft-paper, byzantine-generals-problem) and no source that applies it here. — needs: Vitess's or Neki's own documentation on two-phase commit and cross-shard transaction semantics, or an independent evaluation.
-
Does Neki work? (new 2026-09-19) the-architecture-of-neki carries no number at all — no latency, no throughput, no shard count, no Vitess comparison — and the product is in Platform Preview. The architecture is described and the behaviour is unknown, which is edge 14's problem on a specific system. — needs: PlanetScale's own published figures once it reaches GA, or a third-party evaluation.
The algorithm two of these systems run was designed to be understood (added 2026-08-22)
raft-paper closes the spoke's most conspicuous gap — two production systems here run Raft and nothing explained it — and the interesting part is not the mechanism.
The design target was a property of readers. Ongaro and Ousterhout set out to define consensus "in a way that is significantly easier to learn than Paxos," and the techniques are restrictions: only the leader appends, elections are settled by randomized timers, membership changes go through overlapping majorities. Nothing here is more powerful than paxos; it is less general on purpose. No other design in this corpus argues for itself that way, and it is the reason Raft is what yugabytedb and the DCS under patroni actually run.
The timing rule was already in this spoke as a config file. Raft states availability as
broadcastTime ≪ electionTimeout ≪ MTBF, safety independent of all of it. patroni's
loop_wait + 2 * retry_timeout <= ttl is that inequality with the constants filled in — the spoke had
the operational form six weeks before the theory, which is the reverse of how it usually reads
sources.
And the evidence is thinner than the algorithm's standing suggests. 287 ms median failover comes from the authors' own five-node implementation on unstated hardware; the understandability claim rests on a 43-student quiz written and graded by the authors, measuring quiz scores rather than anyone's ability to build a correct system. It is more evidence than any competitor offers and it is still one course-sized sample. Recorded as edge 16 rather than as a caveat, because two databases in this corpus could answer it and neither has.
The router is not engine-agnostic (2026-09-19)
neki has been a name in this wiki since July — vitess said so on its own page — and the-architecture-of-neki finally describes it. The useful finding is not that PlanetScale built a Postgres sharder. It is how much of the architecture the engine dictated.
The topology is Vitess's, and the post's denial of that is the weakest thing on it. Router↔VTGate, Sidecar↔VTTablet, a control plane, an operator — and the reshaping workflows keep Vitess's exact names: MoveTables, Reshard, OnlineDDL. harshit-gangal wrote the post and a top-five share of Vitess's commits. "Not a MySQL sharding idea wearing a Postgres label" overstates the distance.
The mechanisms are Postgres's, and that is where the real content is:
- OIDs force a cluster-wide singleton. Postgres identifies objects by numeric OID; a client reads a column's type OID off the wire and caches it. Independent shards assign a custom type different OIDs, so one shard is designated authoritative and translates every other shard's OIDs on the way out. MySQL has nothing to reconcile here. This wiki has discussed sharding as a routing-and-merging problem for two months; this is the first case where the engine's own identifier scheme puts a mandatory single point into a design built to avoid them.
- Session advisory locks force a third pooling tier. pgbouncer exposes session/transaction/ statement pooling as a deployment-wide choice an operator makes once. Neki's Sidecar makes it per query, because a session-scoped advisory lock must outlive its transaction and cannot share a backend — and the Router, not the Sidecar, decides which tier applies. Same trade, relocated upstream.
pg_rewindis on the failover path, and logical-replication decoding is the data-movement primitive under all three reshaping workflows. Both are Postgres facilities, not Neki inventions.
One design divergence from Vitess, understated by both pages. vitess is credited here with not becoming a distributed query engine — push down to MySQL, merge only what cannot be pushed. Neki's Router executes genuine cross-shard joins itself, choosing between nested-loop, hash and merge on cost estimates. That is a planner. Whether it stays one modest step further or becomes the thing Vitess avoided being is the interesting question, and nothing in the source answers it.
What the wiki still lacks, and should say plainly. No number of any kind: no latency, no throughput, no shard count, no comparison. Platform Preview, not GA. And — the gap that matters most for consistency-models — the source describes durability within a shard in three policies and says nothing about atomicity across shards. A sharded OLTP system's hardest question is whether a transaction touching two shards commits or aborts as one, and this corpus cannot answer it for the system it just described in seven components.
Contradictions / tensions
One live tension since 2026-07-29: planetscale-768-servers shards precisely to keep one globally consistent logical database, while local-first-architecture gives up global consistency on purpose to put the store in the client. Not a factual contradiction — both are right about their own workloads — but the two ends of this spoke now hold opposite views on whether consistency or responsiveness is the property an OLTP store exists to protect. Recorded, not resolved.
A second tension, recorded 2026-08-20 and not a contradiction either. citus and planetscale-768-servers solve one problem — make a fleet look like one transactional database — with designs that cannot both be the right general answer: routing inside the engine as an extension, or routing in front of it as a proxy. Each vendor states only its own side's advantages, and no source here compares them. What can be said from the two documents is narrow and worth keeping separate from the marketing: the extension keeps the engine's full feature surface and inherits its version cadence; the proxy is engine-agnostic and reimplements what it needs. Which cost dominates is unmeasured here.
The founding trio remain complementary (embedded engine / distributed engine / tooling) rather than competing. The standing external caution: planetscale-768-servers is a vendor blog (T2, product to sell) and turso is pre-1.0 with self-described incomplete SQLite compatibility — neither performance nor maturity claims are independently verified here. citus joins that list on a different axis: it is T1 first-party and technically detailed, but its README is stale against its own releases — the banner and both install snippets still name Citus 13.0 on Postgres 17 while 14.2.0 shipped 2026-08-06. The architecture prose is unaffected; the commands are not to be copied, and the version numbers on the page come from the releases API rather than the README.
Its performance and named-customer claims (Algolia, MixRank's "well over a petabyte" of time series, Salesloft, ConvertFlow, HSL) are the vendor's own and unverified here.
A third caution, recorded 2026-08-20, about how a claim is worded. pgmq advertises
"guaranteed 'exactly once' delivery of messages to a consumer within a visibility timeout." Read
whole, the qualifier is the claim: within the window, exactly once; past it, the message returns and
another consumer gets it. That is at-least-once with a redelivery clock, and the schema concedes
it — read_ct counts redeliveries, a column that would be meaningless under a true exactly-once
guarantee. The project is not being dishonest; it reproduces SQS's contract faithfully, including the
part readers routinely drop. Recorded because it is the second time in this corpus that the precise
reading of a vendor's sentence was the whole finding, after citus's "no HA of its own."
And a structural tension the ecosystem carries. postgresql-extensions establishes that Postgres grows by extension rather than by fork — while awesome-postgres' own PaaS section lists eighteen managed services, each of which decides for itself which extensions may load. An open ecosystem of a thousand modules meets a closed per-vendor allowlist at deployment. pgmq's SQL-only install path exists because of it. No source here states the tension; both halves of it are sourced.
A fourth caution, and this one is about the corpus rather than a source. pgbench's documentation states what a credible Postgres measurement requires: a multi-minute run, scale factor above client count, tracked vacuum activity, and a load generator that is not itself the bottleneck. No performance claim recorded anywhere in this spoke states any of those conditions — not turso's, not planetscale-768-servers', not citus', and pgmq states no number at all. Recorded as a standing property of the corpus: this wiki holds many performance claims and zero measurements, and now has the engine's own document explaining why that distinction is not pedantry.
Cross-spoke adjacency
../analytical-databases-wiki— the defining sibling. It owns OLAP/columnar engines (analytical-databases, clickhouse, duckdb, tinybird); this owns OLTP/row stores. The OLTP vs OLAP line is the boundary; HTAP is the seam. Cross-link, never duplicate. The seam is occupied since 2026-08-20: citus has columnar storage and an analytics pitch and still lives here, because its columnar tables are a write-once archival tier under time partitioning rather than an OLAP engine. That reasoning is the precedent for the next HTAP placement.../agentic-tooling-wiki— the agent-memory seam: turso's MCP server and seekdb (an agent state store) are the two sides of operational-store ↔ agent convergence.../platform-ops-wiki— owns the SRE/ops practice of running prod systems; a database's architecture (sharding, replication) is here, the operating of it cross-links there.../cloud-wiki— managed-DB pricing/hosting cross-links there; the engine as subject is here.
Index — Operational Databases Wiki
Catalog of every page, grouped by schema.org
@type. Spine: synthesis (thesis),log.md(history), this file (catalog). Spun out of the hub_inboxdatabases-beyond-olapcluster on 2026-07-16 (3 sources). Some wiki-links resolve to sibling../analytical-databases-wikinodes (intentional cross-wiki links).
DefinedTerm (concepts)
-
query-execution-plan — the tree of operations an engine chose, plus what it actually cost; the only place a declarative query becomes an observable procedure. Estimate-versus-actual row counts are the whole diagnostic — the planner picks for the estimate and pays for the reality. The engines emit complete, unranked output; the tooling layer's job is triage. Instruments at both ends of the spoke's axis:
EXPLAIN ANALYZEvia pev2,VEXPLAIN TRACE/KEYSvia vitess · mechanism -
paxos — the algorithm itself, split out 2026-08-10 once three sources covered it: safety unconditionally, liveness only with an elected leader; quorum intersection and the phase-1 promise that forbids the future it cannot observe. Plus what production adds — the master lease and one-leader-across-all-slots amortisation · algorithm
-
postgresql-planner-statistics — where the planner's row estimate comes from and why it is usually too low: MCV lists + histograms from a sample that is "always approximate even when freshly updated", then selectivities multiplied under an independence assumption — the docs' own example estimates 1 row where 100 exist. The mechanism under pev2's
estimate_factor;CREATE STATISTICSis the fix, opt-in per column pair · mechanism -
logical-replication — decode WAL into row changes keyed by replica identity, instead of shipping disk blocks: publish/subscribe, snapshot-then-stream, transactional consistency within a single subscription. What physical replication cannot do — cross-major-version, subsets, and both ends writing (the multi-master entries) — and it does not replicate DDL · mechanism
-
write-ahead-logging — WAL: log the change before making it, so a crash can always be explained and redone (REDO). The bargain is one sequential append instead of a scatter of random flushes, and "one
fsync… may suffice to commit many transactions" — the arithmetic under OLTP throughput. Everything downstream is a WAL reader: PITR (pgbackrest), replication and lag-in-bytes (patroni), and the per-primary bottleneck planetscale-768-servers sharded around · mechanism -
postgresql-extensions — the ecosystem's structural fact: awesome-postgres holds five alternative servers against many hundreds of things running inside a stock one. A distributed database, a storage engine, a GPU executor, search engines and a queue all ship as extensions rather than forks — with two costs the sources show and don't argue: compile-against-a-version coupling, and managed platforms' per-provider allowlists · mechanism
-
operational-databases — umbrella: transactional/OLTP databases + their tooling, across the embedded↔distributed spectrum; the operational sibling to OLAP · domain
-
online-transaction-processing — OLTP: many small transactional reads/writes on current data, row-oriented; the OLTP-vs-OLAP boundary that defines the spoke · concept
-
database-sharding — distributing data + writes across many primaries so a fleet looks like one DB (proxy router + hash shard key + cross-shard aggregation); the distributed end · concept
-
cross-shard-queries — what happens to a query the shard key can't route: push down to MySQL where a vindex routes it, fan out and merge at the proxy where it doesn't; scatter defined as sharded keyspace without a vindex, and why a deep
OFFSETmakes every shard return offset+limit rows · mechanism -
shard-colocation — give two distributed tables the same distribution column and matching values land on the same node, so joins, foreign keys and transactions scoped to one key never leave it; the precondition for a sharded schema rather than a sharded table, and the design lever whose absence is scatter · mechanism
-
local-first-architecture — the OLTP store moves into the client (local SQLite serves every read/write; server becomes a sync log); the third pole past embedded, trading global consistency for responsiveness · concept
-
event-sourcing — state as an append-only immutable event log, current state materialized by replay; doubles as the local-first sync protocol, and the live argument against CRDTs · concept
-
multiversion-concurrency-control — MVCC: keep several row versions so a statement reads a snapshot — "reading never blocks writing and writing never blocks reading." Postgres (new heap versions + vacuum) vs InnoDB (undo log) reach the same guarantee at different costs; the single-node answer to what consistency-models asks of distributed ones · mechanism
-
consensus — agreeing on one value when nodes fail. FLP (Thm 16.14): no deterministic algorithm always achieves consensus in the asynchronous model with f > 0 — so every working system buys out via partial synchrony (timeouts) or randomness. Byzantine agreement needs f < n/3; authentication changes the bound · concept
-
consistency-models — when a write becomes visible and in what order. CAP with its model attached (Fox & Brewer 1999, proven by Gilbert & Lynch 2002 for the asynchronous model; relaxable under partial synchrony), plus eventual and causal consistency, and quorum systems as the way a promise becomes a per-operation cost · concept
-
checkpoint — the point past which recovery never has to replay. The dial that trades crash-recovery time against steady-state I/O and log volume: checkpointing more often shortens replay and enlarges the WAL, because every page re-pays its full 8 kB image after each one
SoftwareApplication (engines / sources)
-
neki — planetscale's sharding system for unmodified Postgres, described here since 2026-09-19: seven components (Router, Sidecar, PostgresManager, Replicator, Admin, Operator, etcd), three connection-pool lifetimes set per query by the Router, three durability policies enforced by Postgres's own sync replication, and cross-shard joins planned in the Router across nested-loop/hash/merge. The finding is OID reconciliation — Postgres object identity forces one cluster-wide authoritative shard, which MySQL never would. Topology from vitess, mechanisms from Postgres. Platform Preview, and the source carries no number at all
-
pev2 — Dalibo's Postgres Explain Visualizer 2: a Vue 3 component rendering an
EXPLAINplan as a ranked diagram (3.6k★, PostgreSQL licence, active since 2019 — a rewrite of Tatiyants' abandonedpev). Its six-metric enum is its thesis — time, rows, cost, buffers, estimate_factor, io — andestimate_factor(planner estimate vs actual, over/under) is the number Postgres prints but never ranks. Also derives I/O speeds Postgres doesn't report, and ships as a single offline HTML file so plans need not leave the building ·source· T1 · github.com/dalibo -
yugabytedb — distributed SQL on a Postgres fork (Apache 2.0 core, 10.5k★): tablets as Raft groups,
RF >= 2f + 1(the quorum bound from part-time-parliament as a config parameter), writes durable on a majority. The commit protocol the spoke asked for since founding — provisional records "invisible to readers until the transaction commits", a transaction status table that is "just another sharded table", commit timestamp taken when the committed entry hits that tablet's Raft log, coordinator failure resolved by expiry not blocking. Forked because no extension can replace WAL replication with a quorum ·source· T1 · docs.yugabyte.com -
matrixone — MatrixOrigin's MySQL-compatible HTAP engine (Go, Apache-2.0, ~2.0k★, v4.2.4): Raft LogService + one transaction node + stateless compute, data as immutable columnar objects in an LSM tree on S3. Git for data falls out of that — a snapshot is a metadata directory; clone of 600M-row
lineitem0.20 s / 314 KB vs 114.6 s / 34 GB by copy; row-level three-way merge, SKIP/ACCEPT only. The paper's "no other database" priority claim is wrong (Dolt, 2019) ·source· T1 (benchmarks maker-run, flagged) -
ferretdb — "a truly Open Source MongoDB alternative" (Go, Apache 2.0, 11k★): converts the MongoDB 5.0+ wire protocol to SQL over Postgres + the DocumentDB extension. Built because MongoDB "abandoned its open-source roots; changing the license to SSPL" — engineering downstream of a licence change. Filed by the catalog as an alternative server while being neither a fork nor a server ·
source· T1 · github.com/FerretDB -
pg-stat-statements — the contrib module the whole Monitoring section wraps: normalized query text with literals replaced by
$1and aqueryidhash, plus calls/time/rows, buffer accounting, andwal_bytesper statement — the number tying a badUPDATEto replication lag and archive backlog. Fixed-size (max5000, evictions counted indealloc), and needsshared_preload_libraries+ a restart ·source· T1 · postgresql.org -
pgbench — the benchmark shipped with Postgres, paged for its caveats: "never believe any test that runs for only a few seconds", scale factor must exceed client count "else you'll mostly be measuring update contention", dead-tuple accumulation and autovacuum make runs unrepeatable, and the tool "can itself become the bottleneck." The spoke's standard of evidence, against which no vendor claim in this corpus qualifies ·
source· T1 · postgresql.org -
hypopg — hypothetical indexes: "an index that doesn't really exist, and thus doesn't cost CPU, disk or any resource to create" (1.7k★). Session-local, and
EXPLAINwithoutANALYZEonly — so it tells you which index the planner would pick and cannot tell you whether the plan would be fast, since it is costed on the same estimates postgresql-planner-statistics shows going wrong ·source· T1 · github.com/HypoPG -
patroni — "a Python template for building PostgreSQL high availability clusters" (MIT, 8.7k★, PG 9.3–18; moved from
zalando/to its own org). It implements no consensus — it rents it: a TTL'd leader lock in etcd/Consul/ZooKeeper/Kubernetes, with the whole failover policy as three integers bound byloop_wait + 2*retry_timeout <= ttl.maximum_lag_on_failoveris a durability floor in bytes of WAL;synchronous_mode_strictblocks all writes rather than lose the promise. Plus the part theory omits — a hardware watchdog armed 5s before TTL to fence a primary that won't stop ·source· T1 · github.com/patroni -
pgbackrest — "Reliable PostgreSQL Backup & Restore" (C, MIT, 4.3k★, David Steele + PGDG since 2013). A WAL tool named as a backup tool: parallel async WAL push/get because a serial archive_command falls behind a busy primary, block-level incrementals, resumable backups, checksums rechecked on restore — and page-checksum validation that makes the nightly backup the only routine full-cluster corruption scan ·
source· T1 · pgbackrest.org -
pgbouncer — "lightweight connection pooler" (C, ISC, 4.3k★, Marko Kreen / Skype 2007, still shipping). Three modes, and the docs price the useful one themselves: transaction pooling "breaks a few session-based features" —
SET,LISTEN,PREPARE,WITH HOLDcursors, session advisory locks. Connection density bought with session state; the proxy that changes nothing about where data lives, against vitess' proxy that changes everything ·source· T1 · pgbouncer.org -
pgmq — "like AWS SQS and RSMQ but on Postgres" (PostgreSQL licence, 5.1k★; Supabase, Tembo). Read from the SQL source: one statement — available rows by
vt <= clock_timestamp(),FOR UPDATE … SKIP LOCKED, thenUPDATEthe visibility timeout, with a code-commented "final guard to avoid duplicate reads under races."SKIP LOCKEDis the whole idea; the real prize is enqueue in the same transaction as the write that caused it. "Exactly once within a visibility timeout" is at-least-once, andread_ctadmits it ·source· T1 · github.com/pgmq -
postgresql — the single-node OLTP base case: client/server with one forked backend process per connection, MVCC snapshots so reads and writes never block each other, serializability via SSI. First-party docs ·
source· T1 · postgresql.org -
citus — distributed PostgreSQL as an extension, not a proxy: coordinator + workers where every shard is an ordinary Postgres table, so PostGIS/JSONB/partitioning survive the trip. Distributed + reference + co-located + columnar tables; schema-based sharding since 12.0 (schema = shard, routed by
search_path); columnar compresses 651 MB → 25 MB but forbidsUPDATE/DELETE/FK, so it is an archival tier. Ships no HA of its own — defers to Patroni's per-group replication, no Raft or Paxos anywhere. AGPL-3.0, 12.7k★, v14.2.0 (2026-08-06) with three branches maintained in parallel; README stale at 13.0/PG17 ·source· T1 · github.com/citusdata -
mysql — the engine vitess shards, finally described in its own terms: InnoDB as default storage engine — ACID + crash recovery, row-level locking with Oracle-style consistent reads, clustered index on the primary key (which is why shard key and primary key are one decision), foreign keys, 64TB limit ·
source· T1 · dev.mysql.com -
vitess — planetscale's MySQL sharding system: VTGate proxy speaking the MySQL wire protocol, VTTablet per instance, VSchema + vindexes as the routing metadata, VEXPLAIN as the plan/trace tool; the distributed end's actual machinery · engine
-
turso — in-process, SQLite-compatible OLTP engine; a Rust rewrite of SQLite (MVCC concurrent writes, io_uring, CDC, vector/FTS, MCP server); the embedded end ·
source· T1 · github.com/tursodatabase -
livestore — reactive client-side SQLite with an event-sourcing sync engine (Schickling / Schiefer / Litt); the local-first artifact — log travels, database is the materialized view · entity
TechArticle (sources)
- the-architecture-of-neki — Harshit Gangal, PlanetScale engineering, 2026-09-18: the component walkthrough that turned neki from a name into a described system — a hole vitess had recorded on its own page. T1 by the artifact's-own-facts rule: architecture, no benchmark, nothing to discount. What it leaves out is what the spoke now wants — nothing on atomicity across shards, and no performance figure of any kind ·
source· T1 · planetscale.com - postgres-wal-configuration — PostgreSQL docs ch. 28.5: the WAL dials.
checkpoint_timeout5 min /max_wal_size1 GB defaults,checkpoint_completion_target0.9, full-page writes as the source of WAL write amplification, the fivesynchronous_commitlevels, andcommit_delaygroup commit with a measured starting value ·source· T1 · postgresql.org - postgres-wal-reliability — PostgreSQL docs ch. 28.1: why the full images exist. An 8192-byte page is 16 sectors of 512 bytes and a power cut can land between any two, leaving a page no delta can repair; write-back disk caches are volatile, hence
wal_sync_method·source· T1 · postgresql.org - sharded-pagination-interview-post — stub, paywalled: Medium interview-prep post asking how to serve page 100,000 from an order table across many shards. Establishes the question and the
LIMIT 1000000, 10anti-pattern; the body (keyset vs offset, scatter-gather merge, cursor encoding) was unreadable via WebFetch and Firecrawl ·source· T4 · medium.com - vitess-query-serving-docs — Vitess 23.0 reference (Execution Plans, VTGate, VEXPLAIN, Sharding): the planner pushes work down to MySQL and merges only what it must; scatter = sharded keyspace with no vindex;
VEXPLAIN TRACEreportsShardsQueried,KEYSproposes sharding-key candidates. Pulled as the readable substitute for the paywalled pagination article; still silent on deep-OFFSETcost ·source· T1 · vitess.io - planetscale-768-servers — PlanetScale: sharding a transactional SQL DB so 768 servers (256 shards × 3) look like one; WAL/replica/backup bottlenecks + Vitess/Neki proxy routing; the distributed end ·
source· T2 · planetscale.com
ScholarlyArticle (sources)
- raft-paper — Ongaro & Ousterhout, In Search of an Understandable Consensus Algorithm (Stanford, extended tech report, 20 May 2014); the algorithm yugabytedb and the DCS under patroni actually run, and the spoke's first source to say so. Strong leader (entries flow only outward), randomized election timers, joint consensus for membership change, five always-true safety properties, and availability as broadcastTime ≪ electionTimeout ≪ MTBF with safety independent of timing. Measured on the authors' own five servers: no randomness → elections over 10 s; 5 ms of randomness → 287 ms median failover; 12–24 ms timeouts → 35 ms average. Understandability tested on 43 students (33 scored higher on Raft; means 25.7 vs 20.8 of 60) — the authors' materials, the authors' rubric · T1 · raft.github.io
- paxos-made-simple — Lamport, 2001 (14pp): the author rewriting himself because "the original presentation was Greek to many readers." Derives P1→P2→P2a→P2b→P2c instead of asserting them, names proposers/acceptors/learners and the prepare/accept phases everyone now uses, and spells out the dueling-proposer livelock. Its principle: a bad leader election costs availability, never correctness ·
source· T1 · microsoft.com - chubby-lock-service — Mike Burrows, Google, OSDI 2006 (16pp): Paxos in production. Five replicas, a master lease that lets reads be served by the master alone, and the argument for a lock service over a Paxos library — a library needs a quorum of your servers, a lock service lets one client proceed. Designed as a lock service, 60% of its open files are naming; DNS at 3k processes and a 60s TTL would need 150k lookups/s. Six data losses in dozens of cell-years, none from hardware ·
source· T1 · research.google - part-time-parliament — Lamport, ACM TOCS May 1998 (33pp): Paxos, told as archaeology on a Greek island. Safety is three conditions and no clock — unique ballot numbers, any two quorums intersect, and a new ballot adopts the latest earlier vote; that intersection is why consensus counts majorities. Progress needs timers, footnoted to FLP. Its §4 states the trade the 1982 paper predicted: no malicious-failure tolerance, no bounded time, but consistency under benign failure of any number of nodes and links ·
source· T1 · microsoft.com - byzantine-generals-problem — Lamport, Shostak & Pease, ACM TOPLAS July 1982 (20pp): the primary source for consensus's f < n/3. The bound belongs to the problem, not to any algorithm — and signatures delete it, SM(m) solving for any n and any number of faults at the weakest connectivity. Its two admissions are the valuable part: detecting an absent message needs clock sync, itself "as difficult a problem as the Byzantine Generals Problem", and unforgeable signatures are only probabilistic. The generals are avionics and missile-defence voting hardware, and "traitor" never meant malice ·
source· T1 · lamport.azurewebsites.net - eg-walker — Gentle & Kleppmann, EuroSys 2025: keep an event graph, build a CRDT only to merge; 1–2 orders of magnitude less steady-state memory than Automerge/Yjs, OT's 1-hour merge in 24 ms; plain text only ·
source· T1 · arxiv.org
Book (sources)
- podc-lecture-notes — Wattenhofer, Principles of Distributed Computing (ETH Zürich, 2016, 321pp, free): the spoke's first T1 theory text. Seven chapters are its subject — Paxos, consensus and the impossibility proof, byzantine and authenticated agreement, quorum systems, eventual consistency and CAP, distributed storage. Fifteen chapters are out of scope (graph algorithms, wireless, game theory, self-stabilisation) and recorded as such; the book's centre of gravity sits outside the spoke holding it ·
source· T1 · disco.ethz.ch
Collection (sources)
- Catalog coverage pages — every remaining awesome-postgres entry, section by section, at the catalog's word (T3, unverified) with the next-read candidate named on each: postgres-ha-tooling (13) · postgres-backup-tooling (14) · postgres-monitoring-tooling (20) · postgres-query-optimization-tooling (14+1) · postgres-gui-clients (~40) · postgres-cli-tooling (13) · postgres-schema-migration (~25, assembled across three sections) · postgres-work-queues (7) · postgres-data-movement (~45) · postgres-client-libraries (17 languages) · postgres-managed-services (24) · postgres-kubernetes-operators (9) · postgres-forks-and-derivatives (5) · postgres-learning-resources (~55) · category
- awesome-postgres — Asad Dhamani's PostgreSQL catalog (12k★, CC0, since 2015; last pushed 2026-05-21). The ratio is the finding: ~30 sections, several hundred entries, and only five are an alternative server — everything else runs inside a stock Postgres or beside it. Ingested as a mining index, not as content: patroni, pgbackrest, pgbouncer and pgmq pulled from four sections and written from their own primaries. Its one staleness marker in the entire list is the word "obsolete" on
wal-e·source· T3 · dhamaniasad.github.io - awesome-db-tools — mgramin's curated catalog of ~200+ tools for working with databases (OLTP+OLAP+NoSQL); the tooling member, not engines ·
source· T3 · github.com/mgramin
PodcastEpisode (sources)
- rethinking-data-client-event-sourcing — InfoQ (2026-07-27), Olimpiu Pop × johannes-schickling: drop the three-tier stack for client-side SQLite synced by an event log; "data is the bottleneck," event sourcing vs CRDTs vs query-sync engines, and where local-first is the wrong call ·
source· T2 · infoq.com
Organization (entities)
- eth-zurich —
CollegeOrUniversity: publishes the DISCO course notes openly, which is why a 321-page graduate text is readable here · institution - planetscale — the DB company maintaining Vitess (MySQL sharding) + Neki (Postgres); the distributed-SQL/sharding vendor stratum · entity
- citus-data — citus's maker, acquired by microsoft and still shipping under its own name (managed as Azure Cosmos DB for PostgreSQL). A Postgres-extension house —
pg_cron, HLL, TopN,pg_auto_failover— which is the same bet Citus itself is; the in-engine counterpart to planetscale's proxy · entity
Person (entities)
- harshit-gangal — PlanetScale engineer, author of the-architecture-of-neki; a top-five contributor to
vitessio/vitessby commit count (checked). The shared authorship is why Neki's topology and workflow names are Vitess's unchanged, and why the post's disclaimer that it is "not a MySQL sharding idea wearing a Postgres label" overstates the distance · author - diego-ongaro — co-author of Raft; the algorithm was his doctoral work at stanford-university · entity
- john-ousterhout — Stanford professor, co-author of Raft; also the creator of Tcl/Tk · entity
- leslie-lamport — author of both byzantine-generals-problem (SRI, 1982) and part-time-parliament (DEC, 1998), and later of tla-plus in
../research-wiki. Canonical node for all three, and the seam between this spoke's consensus theory and that spoke's formal methods · author - roger-wattenhofer — ETH Zürich; leads the DISCO group, author of the course text · author
- johannes-schickling — Prisma founder; livestore + Overtone; the corpus's advocate for event sourcing over CRDTs (and maintainer of the framework that implements it) · entity
Synthesis
- synthesis — the thesis: OLTP databases across the embedded↔distributed spectrum, bracketed by Turso (database-as-a-library) and PlanetScale (database-as-a-fleet)
Notes
- Founding entities: planetscale paged as the article's owner. The Turso maker-org and awesome-db-tools' author (@mgramin) are deferred — thin at founding; page them when one recurs.
Bridge nodes (live in sibling wikis, linked cross-wiki)
analytical-databases · clickhouse · duckdb (../analytical-databases-wiki — the OLAP siblings) ·
seekdb (../agentic-tooling-wiki — agent state-store, the OLTP-reaches-for-agents seam) ·
microsoft (../agentic-tooling-wiki — citus-data's owner) ·
azure (../cloud-wiki — where the managed Citus is sold)