System Design Space

    Глава 89

    Обновлено: 9 февраля 2026 г. в 20:31

    Jepsen и модели консистентности

    Прогресс части0/21

    Проект тестирования распределённых систем: иерархия моделей консистентности, Serializable vs Linearizable, известные находки.

    Официальный сайт

    Jepsen.io

    Проект тестирования распределённых систем на корректность.

    Перейти на сайт

    Jepsen — это независимый проект анализа и тестирования распределённых систем, созданный Кайлом Кингсбери (Kyle Kingsbury, aka "Aphyr"). Проект выявил критические ошибки в десятках популярных баз данных и стал де-факто стандартом проверки заявлений вендоров о консистентности.

    Фундамент

    TCP протокол

    Jepsen моделирует сетевые сбои и разделения на транспортном уровне.

    Читать обзор

    Что такое Jepsen?

    Инструмент тестирования

    Jepsen — это Clojure-библиотека для тестирования распределённых систем. Она генерирует нагрузку, вносит сбои (network partitions, process crashes, clock skew) и проверяет, соблюдаются ли заявленные гарантии.

    ClojureOpen SourceBlack-box testing

    Серия отчётов

    Каждый анализ публикуется как детальный отчёт: настройки тестирования, обнаруженные аномалии, реакция вендора. Отчёты стали обязательным чтением для архитекторов распределённых систем.

    MongoDBPostgreSQLCassandraetcd+40 других

    Связанная глава

    CAP теорема

    Фундаментальное ограничение распределённых систем.

    Читать обзор

    Почему Jepsen важен?

    Разоблачение маркетинговых заявлений

    Многие базы данных заявляют о "strong consistency" или "ACID", но на практике не выполняют эти гарантии. Jepsen выявил, что MongoDB теряла подтверждённые записи, RethinkDB допускала dirty reads, а Redis Cluster мог потерять данные даже без сбоев.

    Стандартизация терминологии

    Проект создал чёткую иерархию моделей консистентности, устранив путаницу между терминами из мира RDBMS (isolation levels) и распределённых систем (linearizability).

    Улучшение качества систем

    После публикации отчётов вендоры исправляют баги. Например, CockroachDB, TiDB и YugabyteDB активно работали с Jepsen для достижения реальной сериализуемости.

    Источник

    Jepsen: Consistency Models

    Интерактивная диаграмма моделей консистентности.

    Перейти на сайт

    Иерархия моделей консистентности

    Jepsen создал полную иерархию моделей консистентности, показывающую как транзакционная изоляция (RDBMS) и линеаризуемость (распределённые системы) сходятся на вершине.

    Иерархия моделей консистентности

    Две параллельные ветки: Serializable (RDBMS) и Linearizable (distributed systems)

    Источник: Jepsen.io
    Strict Serializable
    Serializable
    Linearizable
    Repeatable Read
    Snapshot Isolation
    Sequential
    Cursor Stability
    Monotonic Atomic View
    Causal
    Read Committed
    PRAM
    Read Uncommitted
    Writes Follow Reads
    Monotonic Reads
    Monotonic Writes
    Read Your Writes
    RDBMS Isolation
    Distributed R/W
    Unavailable

    Недоступна при сетевых сбоях. Узлы приостанавливают операции для обеспечения безопасности.

    Sticky Available

    Доступна на исправных узлах, если клиенты работают с теми же серверами.

    Total Available

    Доступна на всех исправных узлах, даже при полном отказе сети.

    Ключевой инсайт

    Serializable — из мира транзакционных СУБД (изоляция транзакций). Linearizable — из мира распределённых систем (атомарные операции чтения/записи). Они сходятся на вершине в Strict Serializable — самой строгой модели консистентности.

    О Jepsen: Проект Jepsen проводит хардкорные тесты распределённых баз данных на устойчивость к сбоям и корректность гарантий консистентности. Многие популярные системы (Cassandra, MongoDB, CockroachDB, Redis) проходили через анализ Jepsen.

    Связанная глава

    PACELC теорема

    Компромиссы между задержкой и консистентностью.

    Читать обзор

    Две ветки консистентности

    Serializable (RDBMS)

    Происходит из мира реляционных СУБД. Описывает уровни изоляции транзакций: Read Uncommitted → Read Committed → Repeatable Read → Serializable.

    Фокус:

    Как транзакции взаимодействуют друг с другом. Какие аномалии допускаются (dirty reads, phantom reads и т.д.)

    Linearizable (Distributed)

    Происходит из мира распределённых систем. Описывает атомарность операцийчтения и записи на нескольких узлах.

    Фокус:

    Выглядит ли распределённая система как один узел? Операции мгновенны и атомарны в глобальном времени.

    Strict Serializable = Linearizable + Serializable

    На вершине иерархии — Strict Serializable. Это комбинация обеих моделей: транзакции выполняются сериализуемо И в реальном времени (linearizability). Системы вроде Google Spanner достигают этого через TrueTime.

    Ключевые модели консистентности

    Linearizable

    Unavailable during partition

    Каждая операция выглядит мгновенной между вызовом и ответом. Все наблюдатели видят одну и ту же последовательность операций. Самая строгая модель для одиночных операций.

    Serializable

    Unavailable during partition

    Транзакции выполняются как будто последовательно в каком-то порядке. Но этот порядок может не соответствовать реальному времени! Высший уровень изоляции в SQL.

    Causal Consistency

    Sticky Available

    Причинно-связанные операции видны в правильном порядке. Если A → B (A случилось до B), все видят их в этом порядке. Достижима в AP-системах.

    Eventual Consistency

    Total Available

    При отсутствии новых записей все реплики в конечном итоге сойдутся к одному значению. Не даёт гарантий о том, что вы прочитаете в конкретный момент. Самая слабая полезная модель.

    Известные находки Jepsen

    СистемаЗаявлениеРеальностьСтатус
    MongoDBDurable writesПотеря подтверждённых записейFixed
    CassandraLWT atomicityПотерянные и дублирующиеся операцииFixed
    Redis ClusterConsistencyПотеря данных без сбоев сетиBy design
    etcdLinearizableПодтверждено ✓Verified
    CockroachDBSerializableПодтверждено ✓Verified
    TiDBSnapshot IsolationAnomalies foundFixed

    Полный список отчётов: jepsen.io/analyses

    Как работает тестирование Jepsen

    1

    Setup

    Развёртывание кластера на N узлах

    2

    Generate

    Генерация операций (read, write, CAS)

    3

    Nemesis

    Внесение сбоев (partitions, kills, clock skew)

    4

    Record

    Запись истории всех операций

    5

    Check

    Проверка: соответствует ли история модели?

    Nemesis — ключевой компонент. Он имитирует реальные сбои: разрывает сеть между узлами, убивает процессы, сдвигает часы. Если система заявляет linearizability, она должна выдержать все эти сценарии.

    Практические выводы

    1. Не верьте маркетингу

    "Strongly consistent", "ACID", "linearizable" — это конкретные термины с точными определениями. Проверяйте отчёты Jepsen или документацию вендора на предмет конкретных гарантий и известных ограничений.

    2. Понимайте trade-offs

    Более строгие модели консистентности имеют цену: недоступность во время сбоев (CAP) или высокие задержки (PACELC). Выбирайте модель исходя из требований приложения.

    3. Тестируйте в условиях сбоев

    Корректность системы проверяется не в идеальных условиях, а при сбоях. Используйте chaos engineering инструменты (Jepsen, Chaos Monkey, Toxiproxy) для проверки поведения вашей системы.

    4. Отличайте isolation от consistency

    Serializable isolation (RDBMS) ≠ Linearizable consistency (distributed). Первое про транзакции, второе про отдельные операции. Для полной корректности нужны оба: Strict Serializable.

    Ресурсы для изучения

    Jepsen — ваш союзник

    Перед выбором базы данных для критичной системы — проверьте отчёты Jepsen. Если системы нет в списке, это не значит, что она надёжна — это значит, что её никто публично не проверял. Отсутствие доказательств багов ≠ доказательство отсутствия багов.