CAP-теорема была предложена Эриком Брюером в 2000 году. Она утверждает, что система распределенного хранения данных может обладать, максимум, двумя из следующих трех свойств:
C — Согласованность (Consistency): Все узлы в системе видят одни и те же данные в один и тот же момент времени. Если какое-то изменение данных произошло, оно будет видимо всем узлам одновременно.
A — Доступность (Availability): Каждый запрос к системе получает ответ в любой момент времени, без гарантии того, что данные актуальны (то есть они могут быть устаревшими).
P — Устойчивость к разделению сети (Partition tolerance): Система продолжает функционировать даже в условиях сетевых разделений, когда узлы не могут общаться друг с другом.
Самая частая аналогия, применяющаяся к CAP-теореме: «Быстро, Качественно, Дешево». И CAP-теорема утверждает, что невозможно создать систему, которая одновременно могла бы сочетать в себе все три свойства. На практике большинство современных распределенных систем обеспечивают согласованность и устойчивость к разделению (CP) или доступность и устойчивость к разделению (AP).
Традиционные реляционные базы данных (SQL хранилища) обычно фокусируются на обеспечении согласованности и доступности (CA) в рамках одного централизованного сервера или кластера. Однако эти хранилища могут сталкиваться с проблемами при масштабировании на уровне распределенной системы, особенно когда возникают сетевые разделения (partition tolerance).
Нереляционные (NoSQL) же занимают бóльшую часть этой диаграммы, и в отличие от РБД они не только предлагают сочетания AP, CP, но и различные реализации подходов к организации структуры данных. Проще говоря, вы можете использовать CP key-value хранилище, а можете AP key-value, или AP документо-ориентированное, или AP колоночное, в общем практически что угодно и в каких угодно сочетаниях, и всё это будет NoSQL. Он предлагает множество решений с различными свойствами, и с таким их количеством вы точно сможете выбрать подходящее вашим требованиям.
Рассмотрим некоторые популярные NoSQL базы данных и их характеристики относительно CAP-теоремы:
Cassandra:
AP (Доступность и Устойчивость к разделению сети)
Основана на модели данных основанной на столбцах. Предоставляет высокую доступность и масштабируемость, жертвуя строгой согласованностью.
MongoDB:
CP (Согласованность и Устойчивость к разделению сети) при использовании режима replica sets. Однако в режиме sharded clusters она может быть ближе к AP.
Документо-ориентированная база данных. В основном предоставляет согласованность на уровне отдельного документа.
Riak:
AP (Доступность и Устойчивость к разделению сети)
База данных на основе ключ-значение. Она спроектирована так, чтобы быть высокодоступной, даже когда часть узлов выходит из строя.
HBase:
CP (Согласованность и Устойчивость к разделению сети)
Основана на модели данных основанной на столбцах и обычно работает на top of Hadoop. Ценит согласованность и устойчивость к разделению выше доступности.
Redis:
CP (Согласованность и Устойчивость к разделению сети), когда рассматривается как одноузловая система или в режиме sentinel. Однако в режиме кластеризации может показывать черты AP.
База данных на основе ключ-значение. Известна своей производительностью и поддержкой различных структур данных.
CouchDB:
AP (Доступность и Устойчивость к разделению сети)
Документо-ориентированная база данных. Использует модель «eventual consistency», что позволяет ей обеспечивать высокую доступность.
Neo4j:
CP (Согласованность и Устойчивость к разделению сети)
Графовая база данных. Фокусируется на предоставлении согласованных запросов к графу.
Также существует категория SQL Like хранилищ, вроде Vertica и BigQuery. Они по своим характеристикам находятся ближе к обычным РБД, но с некоторыми оговорками. Их не стоит путать с классическими NoSQL, однако справедливости ради стоит сказать, что сделать это достаточно сложно.
BigQuery, как и все РБД, нацелен на обеспечение свойств CA для большинства операций, но из-за своей бессерверной и масштабируемой архитектуры он также проявляет характеристики устойчивости к разделению сети, что выливается в некоторое противоречие. И здесь мы подходим к определенному выводу.
Необходимо понимать, что свойства CAP не являются строгими метками, и реальное поведение системы может варьироваться в зависимости от конфигурации, настроек и условий работы. Теорема служит лишь общим руководством для понимания компромиссов, с которыми сталкиваются разработчики при создании распределенных систем хранения данных. Для того чтобы начать работать с NoSQL хранилищами требуется знать не только их основные виды и популярные реализации, но и специфику использования, которая также включает в себя отношение различных хранилищ к CAP-теореме.
C — Согласованность (Consistency): Все узлы в системе видят одни и те же данные в один и тот же момент времени. Если какое-то изменение данных произошло, оно будет видимо всем узлам одновременно.
A — Доступность (Availability): Каждый запрос к системе получает ответ в любой момент времени, без гарантии того, что данные актуальны (то есть они могут быть устаревшими).
P — Устойчивость к разделению сети (Partition tolerance): Система продолжает функционировать даже в условиях сетевых разделений, когда узлы не могут общаться друг с другом.
Самая частая аналогия, применяющаяся к CAP-теореме: «Быстро, Качественно, Дешево». И CAP-теорема утверждает, что невозможно создать систему, которая одновременно могла бы сочетать в себе все три свойства. На практике большинство современных распределенных систем обеспечивают согласованность и устойчивость к разделению (CP) или доступность и устойчивость к разделению (AP).
Традиционные реляционные базы данных (SQL хранилища) обычно фокусируются на обеспечении согласованности и доступности (CA) в рамках одного централизованного сервера или кластера. Однако эти хранилища могут сталкиваться с проблемами при масштабировании на уровне распределенной системы, особенно когда возникают сетевые разделения (partition tolerance).
Нереляционные (NoSQL) же занимают бóльшую часть этой диаграммы, и в отличие от РБД они не только предлагают сочетания AP, CP, но и различные реализации подходов к организации структуры данных. Проще говоря, вы можете использовать CP key-value хранилище, а можете AP key-value, или AP документо-ориентированное, или AP колоночное, в общем практически что угодно и в каких угодно сочетаниях, и всё это будет NoSQL. Он предлагает множество решений с различными свойствами, и с таким их количеством вы точно сможете выбрать подходящее вашим требованиям.
Рассмотрим некоторые популярные NoSQL базы данных и их характеристики относительно CAP-теоремы:
Cassandra:
AP (Доступность и Устойчивость к разделению сети)
Основана на модели данных основанной на столбцах. Предоставляет высокую доступность и масштабируемость, жертвуя строгой согласованностью.
MongoDB:
CP (Согласованность и Устойчивость к разделению сети) при использовании режима replica sets. Однако в режиме sharded clusters она может быть ближе к AP.
Документо-ориентированная база данных. В основном предоставляет согласованность на уровне отдельного документа.
Riak:
AP (Доступность и Устойчивость к разделению сети)
База данных на основе ключ-значение. Она спроектирована так, чтобы быть высокодоступной, даже когда часть узлов выходит из строя.
HBase:
CP (Согласованность и Устойчивость к разделению сети)
Основана на модели данных основанной на столбцах и обычно работает на top of Hadoop. Ценит согласованность и устойчивость к разделению выше доступности.
Redis:
CP (Согласованность и Устойчивость к разделению сети), когда рассматривается как одноузловая система или в режиме sentinel. Однако в режиме кластеризации может показывать черты AP.
База данных на основе ключ-значение. Известна своей производительностью и поддержкой различных структур данных.
CouchDB:
AP (Доступность и Устойчивость к разделению сети)
Документо-ориентированная база данных. Использует модель «eventual consistency», что позволяет ей обеспечивать высокую доступность.
Neo4j:
CP (Согласованность и Устойчивость к разделению сети)
Графовая база данных. Фокусируется на предоставлении согласованных запросов к графу.
Также существует категория SQL Like хранилищ, вроде Vertica и BigQuery. Они по своим характеристикам находятся ближе к обычным РБД, но с некоторыми оговорками. Их не стоит путать с классическими NoSQL, однако справедливости ради стоит сказать, что сделать это достаточно сложно.
BigQuery, как и все РБД, нацелен на обеспечение свойств CA для большинства операций, но из-за своей бессерверной и масштабируемой архитектуры он также проявляет характеристики устойчивости к разделению сети, что выливается в некоторое противоречие. И здесь мы подходим к определенному выводу.
Необходимо понимать, что свойства CAP не являются строгими метками, и реальное поведение системы может варьироваться в зависимости от конфигурации, настроек и условий работы. Теорема служит лишь общим руководством для понимания компромиссов, с которыми сталкиваются разработчики при создании распределенных систем хранения данных. Для того чтобы начать работать с NoSQL хранилищами требуется знать не только их основные виды и популярные реализации, но и специфику использования, которая также включает в себя отношение различных хранилищ к CAP-теореме.