CAP теорема¶
Эвристическое утверждение о том, что в любой реализации распределённых вычислений возможно обеспечить не более двух из трёх следующих свойств:
Согласованность данных (consistency): Во всех вычислительных узлах в один момент времени данные не противоречат друг другу.
Целостность базы данных означает соответствие имеющейся в базе данных информации её внутренней логике, структуре и всем явно заданным правилам.
Каждое чтение даст вам самую последнюю запись.
Доступность (availability): Запросы ко всем не отказавшим узлам возвращают ответ
Любой запрос к распределённой системе завершается корректным откликом, однако без гарантии, что ответы всех узлов системы совпадают.
Т.е. Каждый узел (не упавший) всегда успешно выполняет запросы (на чтение и запись).
Устойчивость к разделению (partition tolerance): Даже если между узлами нет связи, они продолжают работать независимо друг от друга.
Расщепление распределённой системы на несколько изолированных секций не приводит к некорректности отклика от каждой из секций.
Т.е. Даже если связь в системе стала нестабильной (вплоть до разделения системы на куски), но узлы работают, то система в целом продолжает работать.
Возможные сочетания¶
- CA
Если мы хотим согласованность и доступность, то используем протокол двухфазного коммита: он гарантирует нам согласованное состояние глобально во всей системе и мы всегда можем обслуживать запросы (если только не упал узел с соответствующими данными).
Но если потерялась связь (а узлы не упали), то какие-то запросы нельзя обработать, потому что часть данных может быть в одной половине, а часть в другой. Каждый кусок всё ещё будет работать по отдельности, но глобальные транзакции выполнять мы не сможем.
- AP
Иногда нам не так важна согласованность и мы согласны на простую eventual consistency — это когда информация может быть доступна не сразу везде, а только через какое-то время, если система здорова
- CP
Если мы хотим согласованность и толерантность к разделению, то надо жертвовать доступностью. Например, при помощи Paxos мы можем хранить все данные сразу на всех узлах, но тогда узлы, оказавшиеся в меньшинстве, ничего сделать не могут.
