Официальный сайт
Jepsen.io
Проект тестирования распределённых систем на корректность.
Jepsen — это независимый проект анализа и тестирования распределённых систем, созданный Кайлом Кингсбери (Kyle Kingsbury, aka "Aphyr"). Проект выявил критические ошибки в десятках популярных баз данных и стал де-факто стандартом проверки заявлений вендоров о консистентности.
Фундамент
TCP протокол
Jepsen моделирует сетевые сбои и разделения на транспортном уровне.
Что такое Jepsen?
Инструмент тестирования
Jepsen — это Clojure-библиотека для тестирования распределённых систем. Она генерирует нагрузку, вносит сбои (network partitions, process crashes, clock skew) и проверяет, соблюдаются ли заявленные гарантии.
Серия отчётов
Каждый анализ публикуется как детальный отчёт: настройки тестирования, обнаруженные аномалии, реакция вендора. Отчёты стали обязательным чтением для архитекторов распределённых систем.
Связанная глава
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Недоступна при сетевых сбоях. Узлы приостанавливают операции для обеспечения безопасности.
Доступна на исправных узлах, если клиенты работают с теми же серверами.
Доступна на всех исправных узлах, даже при полном отказе сети.
Ключевой инсайт
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
| Система | Заявление | Реальность | Статус |
|---|---|---|---|
| MongoDB | Durable writes | Потеря подтверждённых записей | Fixed |
| Cassandra | LWT atomicity | Потерянные и дублирующиеся операции | Fixed |
| Redis Cluster | Consistency | Потеря данных без сбоев сети | By design |
| etcd | Linearizable | Подтверждено ✓ | Verified |
| CockroachDB | Serializable | Подтверждено ✓ | Verified |
| TiDB | Snapshot Isolation | Anomalies found | Fixed |
Полный список отчётов: jepsen.io/analyses
Как работает тестирование Jepsen
Setup
Развёртывание кластера на N узлах
Generate
Генерация операций (read, write, CAS)
Nemesis
Внесение сбоев (partitions, kills, clock skew)
Record
Запись истории всех операций
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. Если системы нет в списке, это не значит, что она надёжна — это значит, что её никто публично не проверял. Отсутствие доказательств багов ≠ доказательство отсутствия багов.
