NoSQL базы данных: хранилища и доступность данных
Рассказываем о NoSQL системах баз данных: что это такое, где такие системы применяются и каких видов бывают. Рассмотрим различные виды хранилищ и 2 теоремы.
Что такое NoSQL базы данных и зачем они нужны
Традиционные системы управления реляционными базами данных предоставляют мощные механизмы для хранения данных и построения запросов к ним. За годы использования эти системы сильно развились и сейчас гарантируют стабильность работы и надежность транзакций.
Однако в последние годы в некоторых областях стало храниться слишком много полезных данных, использование и хранение которых традиционными методами становится затруднительно. К этим областям можно отнести пользовательский контент социальных сетей и данные, полученные из других обширных сетей (так называемые «большие данные» или попросту «бигдата»).
Для такого типа данных создаются и развиваются NoSQL решения, которые способны обеспечивать горизонтальную масштабируемость и большую отзывчивость, но жертвуют при этом надежностью транзакций.
Классификация высокоуровневых систем
Чтобы абстрагироваться от подробностей реализации отдельной NoSQL системы, для группирования похожих хранилищ данных могут быть использованы высокоуровневые критерии. Рассмотрим два наиболее известных подхода: модели данных и CAP.
Различные модели данных
Модели, которые мы будем рассматривать, можно категоризировать по тому, как они хранят и дают доступ к данным. Здесь можно выделить следующие типы хранилищ: ключ-значение, хранилище документов и хранилище с широким столбцом.
Ключ-значение
Хранилище вида ключ-значение состоит из наборов пар ключ-значение с уникальным ключом для каждого. Набор операций для такого хранилища ограничен простым CRUD (Create, Read, Update, Delete). Эти хранилища еще называют схематическими: все сведения о структуре хранимых данных неявно описываются в логике приложения (схема на чтение) и явно определяются языком определения данных (схема на запись).
Очевидное преимущество этой модели – ее простота. Простая структура хранилища дает системе базы данных высокую пропускную способность. Однако если потребуются более сложные операции запроса, например, запрос определенного диапазона, эта система окажется не так сильна.
На рисунке показано, как в ключе могут хранится данные и настройки учетной записи. Поскольку сложные операции запросов не поддерживаются, данные придется неэффективно анализировать в коде программы и тратить время на выделение нужных.
Хранилище документов
По структуре такое хранилище похоже на ключ-значение, но в значении могут храниться только структурированные документы, вроде JSON. Это ограничение обеспечивает большую гибкость при доступе к данным. Проще не только найти информацию по конкретному ключу, но и позже выделить ее из документа.
Хранилище с широким столбцом
Структура хранилища с широким столбцом отчасти похожа на традиционную реляционную базу данных. Однако технически такое хранилище больше напоминает распределенную многоуровневую сортированную карту: ключи первого уровня идентифицируют строки, которые, в свою очередь, состоят из пар ключ-значение. Ключи первого уровня называются ключами строк, ключи второго уровня называются ключами столбцов.
Такая схема хранения дает возможность создать таблицу с произвольным количеством столбцов. При этом она обеспечивает высокоэффективное сжатие данных при хранении.
Согласованность и доступность данных: CAP и PACELS
Другое определяющее свойство базы данных, кроме того, как данные хранятся, это уровень их согласованности. Одни базы создаются с учетом высокой согласованности и сериализации данных (ACID), другие делают упор на доступность данных (BASE). Этот компромисс присущ каждой распределенной системе баз данных, и большое число NoSQL баз показывает широкий спектр решений между этими двумя парадигмами. Рассмотрим две теоремы: CAP и PACELS, согласно которым системы баз данных можно классифицировать по их положению в этом спектре.
CAP
CAP описывает ограничения, накладываемые на систему базы данных. В этой теореме говорится, что последовательное чтение/запись не может быть реализовано в асинхронной системе. Другими словами, может быть реализовано не более двух из следующих трех свойств одновременно:
- Согласованность: чтение и запись выполняются атомарно и строго согласованы.
- Доступность: каждый неуправляемый узел в системе всегда может принимать запросы на чтение и запись от клиента клиентам и возвращать с содержательный ответ, то есть не сообщение об ошибке.
- Устойчивость к разделению: разделение распределённой системы на несколько изолированных секций не приводит к некорректности отклика от каждой из секций.
PACELC
Эта теорема расширяет теорему CAP. Она гласит, что в случае разделения сети, как и CAP, необходимо выбирать между доступностью и согласованностью. Но даже если разделения нет, нужно делать выбор между задержками и согласованностью.