
Как Jepsen ломает распределённые базы: разбор бага в CockroachDB
badcasedaily1 35 минут назад Как Jepsen ломает распределённые базы: разбор бага в CockroachDB Сложный 8 мин 110 Блог компании OTUS Программирование * Распределённые системы * Тестирование IT-систем * Хранение данных *...
Anthropic — What company has the best second artificial intelligence model at the end of June?
Значимый прорыв формирует отрасль ИИ: badcasedaily1 35 минут назад Как Jepsen ломает распределённые базы: разбор бага в CockroachDB Сложный 8 мин 110 Блог компании OTUS Программирование * Распределённые системы * Тестирование IT-систем * Хранение данных * Кейс Распределённая база обещает строгую консистентность. Клиент пишет значение, запрос отваливается по таймауту, клиент решает, что запись не прошла. А через секунду читает тот же ключ — и там лежит ровно то «непрошедшее» значение.
Закоммиченное значение пришло из записи, которая отчиталась об ошибке. Это ровно тот класс багов, который ищет Jepsen, и именно такой баг его ночные прогоны нашли в CockroachDB. На этом задокументированном кейсе и разберём, как устроена проверка консистентности, что Jepsen реально поймал и почему путь от симптома до причины занял два месяца.
Технические детали
Из чего собран тест: нагрузка, немезида, checkerТест Jepsen складывается из трёх частей. Первая — нагрузка: набор клиентов, которые конкурентно дёргают систему и пишут журнал операций с метками времени. Каждая операция фиксируется как вызов, а потом как успех, отказ или неопределённый исход.
Самая простая нагрузка — register: один ключ, чтения и записи, проверка, что чтение видит последнее записанное. ; фрагмент истории Jepsen: журнал операций с метками времени {:process 3 :type :invoke :f :write :value 4} {:process 3 :type :fail :f :write :value 4} ; запись отчиталась об ошибке {:process 7 :type :invoke :f :read} {:process 7 :type :ok :f :read :value 4} ; а прочиталось всё равно 4Вторая часть — немезида: процесс, который впрыскивает отказы, потому что распределённые баги живут именно в сбоях. Сетевые разделения, паузы и убийства процессов, перекос часов, смена состава кластера, принудительные разбиения диапазонов — всё это немезида включает по ходу теста.
Третья часть — checker: он берёт записанную историю и модель консистентности и проверяет, есть ли допустимый порядок операций, который объясняет наблюдения. Для линеаризуемости это в общем случае NP‑трудно, и когда ни одного законного объяснения не находится, Jepsen печатает свою фирменную строку Analysis invalid! (ノಥ益ಥ)ノ ┻━┻ — это реальное нарушение.
Отраслевые последствия
Плюсом когда узел убивают посреди операции, клиент не знает, успела ли она закоммититься. Jepsen это понимает и при разборе истории держит в уме обе ветки: операция могла как пройти, так и нет, и история считается валидной, если хоть один расклад исходов укладывается в модель. Как раз на этом стыке баг и вылез.
Модели консистентности и чем их проверяютЧтобы понимать, что именно нарушено, Jepsen опирается на иерархию моделей, которую сам же во многом и прояснил для индустрии.
Событие, по словам экспертов, усилит конкуренцию в сфере ИИ.





