Нереляционные БД

(материал с курса с Яндекс Практикума)

Нереляционные (NoSQL) БД обеспечивают высокую доступность, быстро работают и хорошо масштабируются. Однако зачастую это достигается за счет ограничения транзакционных возможностей, которыми славятся реляционные базы.

MongoDB

MongoDB — это масштабируемая документоориентированная СУБД с открытым исходным кодом, самая популярная NoSQL БД в мире. Данные в MongoDB не организуются в таблицы, как в реляционных БД, а хранятся в документах, которые группируются в коллекции. Это позволяет работать с данными с разными наборами полей: такие данные плохо укладываются в жёсткую структуру таблицы.

MongoDB позволяет размещать части БД на разных хостах (это называется шардированием), так что её легко масштабировать.

СУБД хранит данные в документах схожего с JSON формата, поэтому хорошо сочетается с JavaScript-фреймворками и широко применяется при разработке JavaScript-совместимых серверной и клиентской частей приложений. MongoDB входит в стек технологий MEAN (MongoDB, Express.js, Angular.js, Node.js).

MongoDB удобно использовать, например, для хранения каталога товаров или в системах управления контентом.

Redis

Redis (Remote Dictionary Server) — хранилище данных типа key-value (ключ-значение) с открытым исходным кодом.

В key-value хранилище хранятся пары ключей и значений. Ключ в паре — это идентификатор, а значение — любые данные: число, строка или сложный объект.

В Redis вместо SQL в запросах используются скрипты на языке Lua. В отличие от других подобных хранилищ, Redis поддерживает больше типов данных (строки, списки, хеш-таблицы, упорядоченные и неупорядоченные множества, битовые массивы и др.) и операций с ними.

Redis хранит данные в оперативной памяти и благодаря этому обеспечивает очень высокую производительность — миллионы операций в секунду. Это же порождает два принципиальных ограничения. Первое: объём хранимых данных не может превышать размера оперативной памяти. Второе: при сбое сервера всё, что ещё не сохранилось на диск, безвозвратно пропадёт. Так что не стоит использовать Redis в качестве основного хранилища данных.

Эти особенности и определяют задачи, подходящие для Redis: хранение данных сессий в веб-приложениях, кеширование, генерирование таблиц результатов в многопользовательских играх.

ClickHouse

ClickHouse — это столбцовая СУБД для онлайн-обработки аналитических запросов.

Данные в ClickHouse организованы в таблицах и жестко структурированы. Но в отличие от реляционных БД, которые хранят на диске рядом друг с другом значения всех свойств одного объекта (строку таблицы), в столбцовых СУБД рядом хранятся значения одного свойства всех объектов (столбец).

Благодаря такому способу хранения можно очень быстро выполнять запросы, в которых исследуются не все свойства объекта, а только некоторые из них. При поиске в строковых БД требуется просканировать всю таблицу, а строки читаются с диска или из памяти целиком, даже если из них нужно взять лишь одну ячейку. В столбцовых БД поиск идет по столбцам, извлекаются только нужные значения.

Выигрыш в скорости особенно заметен на больших объемах данных — СУБД ClickHouse способна читать сотни миллионов записей в секунду. БД горизонтально масштабируется, что позволяет работать с базой размером в несколько петабайт. Язык запросов в ней близок к стандартному SQL.

Ещё одна особенность ClickHouse: эта СУБД не поддерживает транзакции и точечное изменение или удаление записей (данные в базе изменяются и удаляются большими порциями).

Клиенты в вебе:

  • tabbix

  • lighthouse

Elasticsearch

Elasticsearch — это нереляционное хранилище данных с широким набором функций полнотекстового поиска.

Данные в Elasticsearch хранятся в виде документов в формате JSON. Они автоматически индексируются, размер индекса составляет от 20 до 30% размера БД. Благодаря этому достигается скорость чтения в сотни миллионов записей в секунду. Для взаимодействия с БД используются JSON-запросы в RESTful API, а в качестве языка запросов — Querydsl.

Elasticsearch хорошо масштабируется, что позволяет работать с большими объёмами данных. При этом она не обеспечивает транзакционную целостность, а запись данных в БД и их удаление не отличаются высокой производительностью.

Основное назначение Elasticsearch — полнотекстовый поиск в большом объёме документов. Эта СУБД широко применяется для аналитической обработки больших массивов данных, анализа логов и журналов работы приложений, функций автозавершения и умного ввода текста.

YDB

YDB — это разработанная Яндексом распределённая СУБД. Она относится к типу NewSQL: основана на реляционной модели, но обеспечивает отказоустойчивость, доступность и масштабируемость на уровне NoSQL-решений.

В YDB данные организуются в таблицы, обеспечивается их транзакционное изменение и строгая консистентность, запросы пишутся на диалекте SQL.

При этом YDB изначально разрабатывалась для так называемых OLTP-сценариев (On-Line Transaction Processing). Это задачи, где СУБД должна поддерживать транзакции и консистентность данных, как это делают классические реляционные СУБД, но при этом надёжно и быстро работать с объёмными БД (т.е. иметь возможность масштабироваться) и с большим числом одновременных запросов на чтение и на запись.

YDB может использоваться в двух режимах: режиме бессерверных вычислений и режиме с выделенными виртуальными машинами. Первый режим подходит для небольших систем с незначительной нагрузкой, когда держать виртуальные машины с БД невыгодно с финансовой точки зрения.

Apache Kafka

Apache Kafka — разработка компании LinkedIn, сочетание распределённой БД и очереди сообщений. Формально Apache Kafka определяется как распределённая стриминговая платформа, т. е. система, управляющая потоками данных между сервисами.

Дело в том, что серверные приложения часто состоят из множества сервисов. Одни из них генерируют, а другие получают данные. Важно, чтобы даже сотни тысяч сообщений в секунду передавались надёжно.

Для таких задач и используются очереди сообщений. Одни сервисы генерируют сообщения и отправляют их Apache Kafka, а другие считывают сообщения тогда, когда удобно, и тем самым снижают нагрузку на систему. До доставки сообщения хранятся в БД, которая размещается на нескольких хостах.

Last updated