Что такое консистентность данных в распределенных системах
Что проверяют
Различаете ли вы согласованность в ACID и в CAP и знаете ли, чем платят за строгие гарантии.
Как отвечать
Сначала разведите два разных понятия, их путают чаще всего:
- C в ACID это соблюдение ограничений целостности внутри одной базы: транзакция переводит её из корректного состояния в корректное;
- C в CAP это линеаризуемость: любое чтение видит последнюю подтверждённую запись, как будто система одна.
Теорема CAP говорит, что при разделении сети приходится выбирать между согласованностью и доступностью. Более полезна на практике PACELC: при разделении выбор между согласованностью и доступностью, а в обычной работе между согласованностью и задержкой. То есть платить приходится всегда, а не только в аварии.
Модели согласованности по убыванию строгости:
- линеаризуемость: как одна машина, дороже всего;
- последовательная: все видят один порядок операций, но не обязательно реальное время;
- причинная: связанные события видны в правильном порядке;
- в конечном счёте (eventual): реплики сойдутся, если записи прекратятся.
Отдельно стоит назвать гарантии для клиента, потому что они дешевле и часто достаточны: чтение своих записей (пользователь видит то, что сам только что сохранил) и монотонное чтение (данные не «едут назад»).
Инструменты в распределённой системе:
- кворумы: при условии, что число читающих и пишущих узлов в сумме больше числа реплик, чтение увидит свежую запись;
- распределённые транзакции двухфазным подтверждением: дают строгость, но блокируют участников и отказывают при падении координатора, поэтому в микросервисах их избегают;
- сага с компенсациями вместо них, ценой согласованности в конечном счёте;
- идемпотентность и транзакционный ящик исходящих: запись в базу и публикация события в одной транзакции, иначе они рано или поздно разойдутся;
- версионирование: номера версий, векторные часы, структуры данных, сходящиеся автоматически.
Где спотыкаются
Смешивают согласованность из ACID и из CAP.
Считают, что CAP заставляет выбирать два свойства из трёх постоянно, а не только при разделении сети.
Обещают строгую согласованность в системе, где данные разъезжаются по репликам.
Не знают, зачем нужна идемпотичность при повторной доставке события.