ВНЕДРЕНИЕ ИНТЕЛЛЕКТУАЛЬНЫХ БАЗ ДАННЫХ. РЫНОК ИНСТРУМЕНТОВ
Обзор NOSQL систем
В последние годы появилась целая серия решений альтернативных реляционным БД. Эти технологии известны как «NoSQL базы данных».
Основная проблема реляционных БД заключается в том, что они не могут справляться с быстрым анализом и поиском для Big data. Можно выделить три конкретные проблемные области:
- •горизонтальное масштабирование при больших объемах данных, например как в случае Digg (3 терабайта для зеленых значков, отображаемых, если ваш друг сделал dugg на статье) или Facebook (50 терабайт для поиска по входящим сообщениям) или eBay (2 петабайта в целом);
- • производительность каждого отдельного сервера;
- • негибкий дизайн логической структуры.
Многие компании нуждаются в нахождении новых путей для хранения и масштабирования огромных массивов данных. Рассмотрим так называемые NoSQL базы данных подробнее.
Термин NoSQL был придуман Эриком Эвансом (Eric Evan / Racker), когда Джоан Оскарсон (Johan Oskarsson) из Last.fm хотел организовать мероприятие для обсуждения распределенных баз данных с открытым исходным кодом.
Под термином NoSQL скрывается большое количество продуктов с абсолютно разными дизайнами. Однако используются три основных параметра для сравнения этих систем: масштабируемость; модель данных и запросов; система хранения данных. Проанализируем некоторые NoSQL БД.
Масштабируемость - автоматическое распределение данных между несколькими серверами (распределенные базы данных). К ним относятся СУБД Cassandra, HBase, Riak, Scalaris и Voldemort.
Особенности распределенных БД: поддержка нескольких датацентров и возможность добавления новых машин в работающий кластер прозрачно для приложений пользователей.
Прозрачное добавление машины в кластер |
Поддержка нескольких датацентров |
|
Cassandra |
X |
X |
HBase |
X |
|
Riak |
X |
X |
Scalaris |
X |
|
Voldemort |
Необходимо дописать часть кода |
Нераспределенные базы данных включают в себя CouchDB, MongoDB, Neo4j, Redis и Tokyo Cabinet. Эти системы могут служить прослойкой для хранения данных для распределенных систем; MongoDB предоставляет ограниченную поддержку шардинга (sharding), так же как и Lounge для CouchDB, и Tokyo Cabinet может использоваться как система хранения файлов для Voldemort.
Модель данных и запросов. Существует огромное многообразие моделей данных и API запросов в NoSQL базах данных.
Модель данных |
API запросов |
|
Cassandra |
Семейства столбцов |
Thrift |
CouchDB |
Документы |
Map/Reduce |
HBase |
Семейства столбцов |
Thrift, REST |
MongoDB |
Документы |
Cursor |
Neo4J |
Графы |
Graph |
Redis |
Коллекции |
Collection |
Riak |
Документы |
Nested hashes, REST |
Scalaris |
Ключ / Знач ение |
get/put |
Tokyo Cabinet |
Ключ / Знач ение |
get/put |
Voldemort |
Ключ / Знач ение |
get/put |
Система семейства столбцов (columnfamily) используется в Cassandra и HBase, и ее идея была привнесена в них из документов, описывающих устройство Google Bigtable. В обеих системах в БД есть строки и столбцы, как обычно, но количество строк невелико: каждая строка имеет больше или меньше столбцов, в зависимости от необходимости, и столбцы не должны быть определены заранее.
Система ключ/значения проста и несложна для реализации, но неэффективна, если вы заинтересованы только в запросе или обновлении части данных. Также трудно реализовать сложные структуры поверх распределенных систем.
Документо-ориентированные базы данных - это по существу следующий уровень систем ключ/значение, позволяющих связывать вложенные данные с каждым ключом. Поддержка таких запросов более эффективна, чем просто возвращение всего BLOB каждый раз.
Neo4J обладает уникальной моделью данных, храня объекты и связи в качестве узлов и ребер графа. Для запросов, которые соответствуют этой модели (например, иерархических данных), они могут быть в тысячу раз быстрее, чем альтернативные варианты.
Scalaris использует распределенные транзакции между несколькими ключами. При этом необходимо учитывать компромисс между последовательностью и наличием свободных мест при оценке в распределенных системах.
Система хранения данных - способ хранения данных внутри системы. Обеспечивает возможность «выдерживания» высоких нагрузок хранилищем.
Модель данных |
|
Cassandra |
Memtable / SSTable |
CouchDB |
Append-only B-Tree |
HBase |
Memtable / SSTable on HDFS |
MongoDB |
В-tree |
Neo4J |
On-disk linked lists |
Redis |
In-memory with background snapshots |
Riak |
Hash |
Scalaris |
In-memory only |
Tokyo Cabinet |
Hash or В-tree |
Voldemort |
Pluggable (primarily BDB MySQL) |
Базы данных хранящие данные в памяти, являются очень быстрыми (Redis может выполнять до 100 000 операций в секунду), но не могут работать с данными, превышающими размер доступной оперативной памяти. Долговечность (сохранение данных в случае сбоя на сервере или отключения питания) также может быть проблемой (в новых версиях будет поддержка append-only log). Количество данных, которые могут ожидать записи на диск, потенциально велико. Другая система с хранением данных в оперативной памяти — Scalaris, решает проблему долговечности с помощью репликации, но она не поддерживает масштабирования на несколько датацентров, так что потеря данных вероятна и тут — в случае отключения питания.
Memtables и SSTables буферизируют запросы на запись в памяти (memtable), после записи в commit лог для сохранности (см.подробнее http://wiki.apache.org/cassandra/ArchitectureOverview). После накопления достаточного количества записей, Memtable сортируется и записывается на диск, уже как SSTable. Это дает производительность, близкую к производительности памяти, в то же время система лишена проблем, актуальных при хранении только в памяти.
В-деревья используются в БД уже очень давно. Они обеспечивают надежную поддержку индексирования, но производительность очень низкая при использовании на машинах с жесткими дисками на магнитных дисках (которые по-прежнему наиболее экономически эффективны), так как происходит большое количество позиционирований головки при записи или чтении данных.
В CouchDB используют В-деревья с функцией добавления (append-only B-Trees — бинарное дерево, которое не нужно перестраивать при добавлении элементов), что позволяет получить неплохую производительность при записи данных на диск.