Статьи

NoSQL и CAP-теорема

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-теореме.
Профильные статьи