Fork me on GitHub

Обзор NoSQL базы данных

Для 80-90% задач NoSQL не нужен.

  • Целостность данных важна всегда
  • Очень большие объёмы данных встречаются не часто
  • Реляционная модель достаточно гибкая
  • Используйте нужную базу данных для своей нагрузки
  • Не масштабируйте базу в отрыве от приложения
  • Если вы знаете, как решить свою проблему
  • NoSQL базой, значит вы знаете, как решить проблему и в RDBMS
  • Не ленитесь думать и читать

Сравнительная таблица из википедии

Data Model Performance Scalability Flexibility Complexity Functionality
Key–value Stores high high high none variable (none)
Column Store high high moderate low minimal
Document Store high variable (high) high low variable (low)
Graph Database variable variable high high graph theory
Relational Database variable variable low moderate relational algebra

Более понятная для понимания таблица 1

Сравнение возможностей I
  Модель данных API запросов Система хранения данных
Cassandra Семейства столбцов Thrift Memtable/SSTable
CouchDB Документы Map/Reduce Append-only-B-tree
Hbase Семейства столбцов Thrift, REST Memtable/SSTable on HDFS
MongoDB Документы Cursor B-tree
Neo4j Графы Graph On-disk linked lists
Riak Ключ/Значение Nested hashes, REST Hash

Более понятная для понимания таблица 2

Сравнение возможностей II
  Вторичные индексы MapReduce Произвольные запросы
Cassandra да нет CQL (no joins)
CouchDB да JavaScript временные представления
Hbase нет Hadoop слабая поддержка
MongoDB да JavaScript полный набор (no joins)
Neo4j да (с помощью Lucene) нет (графы и MapReduce?) обход графа, поиск
Riak да JavaScript, Erlang слабая поддержка, Lucene

Riak: преимущества:

  • Отказоустойчивость (кольцо)
  • Links (ссылки на другие ключи) + фильтры ключей
  • MapReduce (Erlang + JS)
  • REST
  • Подсистема поиска
  • Возможность настройки параметров согласованности и доступности на уровне отдельного запроса

Riak: недостатки:

  • Бедные возможности запросов
  • Нет ACID
  • Неполноценная поддержка JavaScript
  • Отсутствие поддержки структур данных

Mongo: преимущества:

  • Полноценный язык запросов Aggregation framework Mongo + Node.js + JS Хранение сложных денормализованных документов
  • Большой выбор индексов (Btree, 2d, 3d)
  • Репликация данных и сегментирование коллекций
  • Community

Mongo: недостатки:

  • Ограничение на размер результата (16 Мб)
  • Проблема четного числа узлов и сложные выборы
  • Опечатка стоит дорого
  • Над планированием кластера надо думать
  • Иногда навязывает воспроизведение схемы в коде (проверка типов и т.д.)

CouchDB: преимущества:

  • Функции-фильтры и как следствие “псевдошардинг”
  • Мобильная версия
  • Простота встраивания и резервного копирования
  • Функции-валидаторы, функции-представления, функции-фильтры сохраняются в текстовом виде в самой базе данных

CouchDB: недостатки:

  • Не всегда удобная система репликации ("все или ничего")
  • Неполноценный язык запросов, основанный на MapReduce операциях над представлениями
  • Нет нормального механизма сегментирования

HBase: преимущества:

  • Версионирование и сжатие
  • Горизонтальное масштабирование
  • Первое место по обработке трудоемких запросов
  • Быстрое восстановление после отказа
  • Отзывчивое community энтузиастов
  • Тесная интеграция с Hadoop

HBase: недостатки:

  • Суровая документация и высокий порог вхождения
  • Заимствованная терминология из мира SQL скорее мешает
  • Надо не менее 5 узлов
  • Нет средств сортировки и индексирования
  • Строгая согласованность без возможности изменений

Cassandra: преимущества:

  • Высокая доступность, восстановление на ходу
  • Нет центральной точки отказа
  • Datastax, Hector и все-все-все
  • CQL - SQL без join
  • Строка может динамически раcширяться до 2 миллиардов колонок
  • Резервное копирование не нужно

Cassandra: недостатки:

  • Непростая (по сравнению с Hbase) интеграция с Hadoop
  • Моделирование таблиц зависит от ваших запросов
  • Нет ACID, нет откатов
  • Сложность в моделировании (необходимо сильно поменять взгляд на моделирование данных)
  • Требовательная к RAM

Neo4j: преимущества:

  • Оптимальна для сильносвязанных сущностей
  • Вершины, ребра, атрибуты
  • Индексы на значения атрибутов
  • ACID
  • REST API + Cypher
  • Множество плагинов, включая 2d индекс

Neo4j: недостатки:

  • Нет полноценного горизонтального масштабирования
  • Плохо приспособлен для размещения на нескольких машинах
  • Для полноценного удаления приходится перезапускать сервер

Фаза исследования Эту фазу не стоит пропускать, ибо это единственная фаза, которая позволяет вам экономить деньги. До ее начала необходимо ответить себе на вопросы о характере ваших данных и сформулировать требования по их использованию. Первая развилка: связи В вашем приложении есть сеть данных, граф знаний, а самый популярный запрос связан с обходом сложной иерархии объектов? Вы готовы отказаться размещения на нескольких машинах? Neo4j спешит на помощь! Вторая развилка: BigData Данные о достаточно большом количестве объектов, изменяющихся во времени и пространстве (движения звезд, личная переписка, фотки в Instagram) Вторая развилка: BigData Придется попрощаться с SQL и наращиванием мощности одного сервера. Впрочем и Neo4j для этого не готов Третья развилка: простота Нужно лишь чтение/запись по ключу, безграничное масштабирование, отсутствие точек общего отказа Между данными почти нет связей. Riak оставляет всех позади себя, добавляя возможность MapReduce над вашими данными. Четвертая развилка: иерархия Структура данных отличается высокой изменчивостью и большой вложенностью. Связность отдельных сегментов данных невысока. Riak уходит, на сцену выходит Mongo DB, кружась в смертельном танго с CouchDB. Пятая развилка: отчеты Необходима обработка и сложная агрегация данных при помощи Hadoop. Данные довольно плоские. Hbase царствует безраздельно, но Cassandra наступает ей на пятки, предлагая ряд преимуществ.

NoSQL logo

http://www.slideshare.net/zaleslaw/nosql-29011549 https://youtu.be/ElQOHHayISI

http://cassandra.apache.org http://www.aerospike.com/russian/

Comments