День 2256. #ЗаметкиНаПолях
Теорема CAP: Сложности Выбора в Распределённых Системах
Теорема CAP, сформулированная Эриком Брюэром в 2000 году и позже доказанная формально, гласит, что в распределённой системе можно добиться только двух из следующих трёх гарантий:
1. Согласованность (Consistency) — каждое чтение получает самую последнюю запись или ошибку. Это означает, что данные одинаковы во всём кластере, поэтому вы можете читать или писать с любого узла и получать те же данные.
2. Доступность (Availability) — каждый запрос получает ответ, даже если это не самые последние данные. Т.е. система остаётся доступной даже в случае отказа одного или нескольких узлов.
3. Устойчивость к фрагментации (Partition tolerance) — система продолжает функционировать, даже если между узлами происходит фрагментация сети (разрыв связи). Кластер должен по-прежнему отвечать, даже если некоторые узлы не могут общаться.
Почему нельзя иметь всё?
Распределённая система по своей сути нуждается в устойчивости к фрагментации, поскольку сети могут выходить из строя, а узлы могут терять связь. Это оставляет нам два варианта:
- CP (согласованность + устойчивость к фрагментации): система жертвует доступностью. Если происходит разделение, узлы могут отклонять операции чтения/записи для поддержания согласованного состояния. Пример: MongoDB
- AP (доступность + устойчивость к фрагментации): система жертвует строгой согласованностью, то есть она может обслуживать устаревшие или несогласованные данные во время фрагментации. Пример: Cassandra
- CA (согласованность + доступность): возможно только в системе без фрагментаций — по сути, в базе данных с одним узлом. Пример: PostgreSQL
Почему устойчивость к фрагментации не подлежит обсуждению?
Разрывы сети будут происходить, поэтому мы всегда должны учитывать устойчивость к фрагментации (P). Поэтому реальный выбор — между согласованностью (CP) и доступностью (AP) во время фрагментации:
- AP, узлы остаются в сети, даже если они не могут взаимодействовать друг с другом. Они повторно синхронизируют данные после разрешения фрагментации, но данные между узлами могут быть несогласованными.
- CP, данные остаются согласованными между всеми узлами, но некоторые узлы могут стать недоступными во время фрагментации.
Система CA теоретически гарантирует согласованность и доступность, пока все узлы находятся в сети. Однако, если происходит фрагментация, это приведёт к несогласованности данных или простою. Поскольку сбои в сети неизбежны, системы CA не существуют на практике в распределённой среде.
За пределами CAP: теорема PACELC
CAP рассказывает нам о компромиссах во время фрагментации сети, но что происходит, когда её нет? PACELC гласит:
- Если есть фрагментация (P), система должна выбрать между доступностью (A) и согласованностью (C).
- В противном случае (Else) система должна выбирать между задержкой (L) и согласованностью (C).
Это расширяет CAP, учитывая производительность и объясняя, почему базы данных, такие как DynamoDB, предпочитают меньшую задержку строгой согласованности.
Выбор правильной БД для вашего варианта использования
- Нужна ли мне сильная согласованность (CP) или можно допустить некоторую несогласованность (AP)?
- Насколько критична доступность для приложения?
- Что произойдёт, если части системы временно отключатся?
В системе AP вы можете столкнуться с несогласованными конфликтами чтения и записи. Некоторые базы данных AP разрешают конфликты записи автоматически, в то время как другие требуют разрешения конфликтов на уровне приложения (пользователя).
В системе CP сетевые фрагментации могут привести к временному простою или снижению производительности.
Источник: https://dev.to/lovestaco/understanding-the-cap-theorem-choosing-your-battles-in-distributed-systems-26cl
>>Click here to continue<<