Проникновение Интернета во все сферы нашей жизни привело к взрывному росту числа источников данных, что привело к проблемам хранения, обработки и сложностям оперирования неструктурированной информацией. В результате коммерческие компании и сообщество Open Source начали разрабатывать новые инструменты — системы NoSQL или хранилища «ключ-значение», позволяющие строить многопользовательские сервисы, предоставляемые по требованию и упрощающие разработку и развертывание приложений. СУБД класса NoSQL необходимы для приложений, имеющих дело с очень большими объемами квазиструктурированных и неструктурированных данных [1, 2], и, по информации nosql-database.org, сегодня имеется уже как минимум 150 СУБД NoSQL, отвечающих требованиям разных типов пользователей. Репрезентативная выборка из 15 популярных баз данных позволяет получить представление об основных особенностях таких СУБД.
Системы NoSQL
В зависимости от степени их эластичности, базы NoSQL можно поделить на две группы. В первую входят истинно гибкие, позволяющие добавлять новые узлы к кластеру без прерывания обслуживания клиентских приложений. Во вторую входят СУБД типа BigTable, которые характеризуются значительными простоями при добавлении новых узлов к кластеру. Постоянная доступность данных при добавлении узлов к кластеру или их изъятии реализуется механизмами маршрутизации и алгоритмами оптимизации выбора времени переноса фрагментов данных; например, когда данные нужно перенести на вновь добавленные узлы, они доставляются из первоначального местонахождения, а когда на новом узле появляется актуальная версия данных, маршрутизирующий процесс начинает отправлять запросы уже к этому узлу [1].
Cassandra
СУБД Apache Cassandra обеспечивает хорошую масштабируемость и высокую готовность без деградации быстродействия. Отказоустойчивость при работе на стандартном оборудовании в облачных инфраструктурах и линейная масштабируемость делают эту СУБД оптимальной платформой для критически важных данных. Cassandra позволяет выполнять тиражирование между несколькими ЦОД и имеет средства обеспечения доступности данных при сбоях региональных систем. Информационная модель ColumnFamily, используемая в Cassandra, предоставляет удобные столбцовые индексы с механизмом журнально-структурированной (log structured) записи высокого быстродействия, мощную систему поддержки мгновенных снимков и развитый встроенный механизм кэширования.
Среди тех, кто использует СУБД Cassandra для опроса огромных активных интернет-баз, такие компании, как Netflix, Twitter, Cisco, OpenX, CloudKick, Ooyala, а самый крупный известный кластер Cassandra хранит сегодня более 300 Тбайт данных на 400 узлах.
BigTable
СУБД BigTable была разработана в Google и ставит произвольный массив байтов в соответствие строчному и столбцовому ключу, а также отметке времени. Структура СУБД представляет собой компактный, распределенный, многомерный отсортированный список соответствий. СУБД была создана с расчетом на масштабирование до петабайтного уровня и распределение между многочисленными машинами с возможностью простого добавления новых — система должна сама «подхватывать» на лету новые ресурсы без внешнего переконфигурирования. Когда размеры базы данных приближаются к заданному пределу, «таблеты» (tablets — структуры данных BigTable) сжимаются с помощью алгоритма BMDiff и библиотеки компрессии с открытым кодом Snappy (варианта алгоритма LZ77, не оптимизированного по степени сжатия, но выполняющегося быстрее оригинала). Для получения определенной строки из BigTable клиент должен соединиться со всеми уровнями дерева, и при этом информация, полученная на верхних уровнях, кэшируется, а дальнейшие запросы на хранимые в таблетах данные, к которым уже обращались, будут выполняться напрямую к последнему уровню дерева.
HBase
СУБД HBase с открытым кодом представляет собой распределенное столбцовое хранилище с поддержкой многоверсионности, созданное по образцу Google BigTable. По сути, это ее клон, реализующий структурированную базу данных реального времени поверх распределенной файловой системы Hadoop. HBase подходит для приложений, требующих оперативного произвольного доступа к большим массивам данных как для записи, так и чтения. СУБД рассчитана на хостинг очень больших таблиц с миллиардами строк и миллионами столбцов, размещаемых на кластерах стандартной архитектуры.
HBase обладает линейной и модульной масштабируемостью, поддерживает согласованные операции чтения и записи, автоматическое и конфигурируемое сегментирование таблиц (разбиение базы на горизонтальные разделы) и автоматическую балансировку нагрузки между региональными серверами при отказе. Кроме того, поддерживаются базовые классы для задач Hadoop/MapReduce, простой API для доступа Java-клиентов, блочный кэш и фильтры Блума (вероятностная структура данных, позволяющая компактно хранить множество элементов и проверять их принадлежность множеству) для поддержки запросов реального времени, а также предварительная обработка запросов посредством серверных фильтров. Система имеет расширяемую оболочку на базе JRuby и поддерживает возможность экспорта метрик в файлы посредством Java Management Extensions.
MongoDB
MongoDB — документоориентированная база NoSQL с открытым кодом, не использующая схемы. Эта отказоустойчивая высокопроизводительная СУБД с постоянным хранением поддерживает язык сложных запросов и имеет реализацию MapReduce. Особенности MongoDB:
- простой и мощный движок документоориентированного хранения (используется формат JSON и динамические схемы);
- полная поддержка индексации (может быть проиндексирован любой атрибут);
- доступность данных (поддерживается зеркалирование по локальной и глобальной сети);
- наличие механизма автоматического сегментирования, который горизонтально масштабируется без потери функциональности.
В СУБД поддерживаются также сложные запросы к документам, атомарные модификаторы, обеспечивающие бесконфликтность операций, гибкая агрегация и обработка данных, а также собственная файловая система GridFS, позволяющая сохранять файлы большого размера (больше 16 Мбайт) без усложнения стека.
Pnuts
Архитектура хранения данных в СУБД Pnuts |
СУБД Pnuts — массово-масштабируемая централизованно управляемая база данных с поддержкой одновременного доступа многих приложений (см. рисунок). Система используется в компании Yahoo для доставки данных веб-приложениям. Pnuts реализует управление данными в виде сервиса, что значительно сокращает время разработки приложений, поскольку программистам не нужно создавать собственные масштабируемые решения для управления данными. Подключение многих приложений к единому сервису дает возможность амортизировать операционные расходы и применять общие оптимальные методы управления данными. Кроме того, совместный сервис позволяет держать в резерве ресурсы (серверы, накопители и т. д.) и быстро выделять их приложениям в период их наибольшей востребованности.
Hypertable
Hypertable — распределенная облачная СУБД NoSQL высокого быстродействия с открытым кодом, разработанная для поддержки приложений, требующих максимального быстродействия, масштабируемости и надежности. Hypertable полезна для организаций, которым надо обрабатывать потоки данных для онлайн-приложений реального времени. Созданная по образцу BigTable, Hypertable рассчитана для исполнения на распределенных кластерах из стандартных серверов и характеризуется устойчивостью к сбоям компьютеров и комплектующих.
CouchDB
Apache CouchDB — документоориентированная база, написанная на функциональном языке программирования Erlang, оптимизированном для построения параллельных распределенных систем. СУБД CouchDB предоставляет возможность использования JavaScript для программирования задач MapReduce. Поддерживается инкрементальное тиражирование с двунаправленным распознаванием и разрешением конфликтов. CouchDB предоставляет REST-API с выдачей результатов в формате JSON, причем обращаться к интерфейсу программирования можно из любой системы, поддерживающей HTTP-запросы. Существует множество сторонних клиентских библиотек, облегчающих выбор языка программирования. Встроенная веб-консоль администрирования общается с базой напрямую с помощью HTTP-запросов.
Voldemort
СУБД Voldemort — это распределенное хранилище «ключ-значение». Каждый его узел независим, и нет центрального пункта координации и единой точки сбоя. Система создана как достаточно быстрое простое хранилище, позволяющее избежать потребности в кэширующем слое. Архитектура Voldemort состоит из нескольких уровней, вместе реализующих несложный интерфейс, состоящий из операций put, get и delete. Каждый уровень отвечает за определенную функцию — например, связь по TCP/IP, маршрутизацию или разрешение конфликтов.
При использовании Voldemort данные автоматически тиражируются на несколько серверов и секционируются, так что каждый сервер содержит только часть всех данных. Сбои серверов обрабатываются прозрачно для пользователя. Предусмотрен механизм подключаемых сериализаторов данных, благодаря чему можно использовать сложные ключи и значения, например списки и кортежи с именованными полями. В число поддерживаемых библиотек сериализации входят Protocol Buffers, Thrift, Avro и Java Serialization. Другие особенности системы:
- поддержка версионности элементов данных для сохранения целостности при сбоях без принесения в жертву готовности системы;
- способность одного узла выполнять по 10–20 тыс. операций в секунду в зависимости от компьютера, сети, дисковой подсистемы и загруженности выполнения операций тиражирования;
- возможность менять стратегию размещения данных — например, можно реализовать распределение между географически удаленными друг от друга ЦОД.
Voldemort применяется в сети LinkedIn для поддержки задач высокомасштабируемого хранения данных. Система пока находится в разработке, и нередки сообщения об ошибках. Исходный код СУБД доступен по лицензии Apache 2.0.
Infinispan
Infinispan — работающая в памяти платформа с открытым кодом, написанная на Java. СУБД отличается высокой масштабируемостью, готовностью и представляет собой хранилище «ключ-значение», оптимизированное для выполнения на современных многопроцессорных/многоядерных архитектурах. СУБД предоставляет собственный интерфейс кэширования, расширяющий java.util.Map, и позволяет пользоваться одноранговой сетевой архитектурой, обеспечивающей высокоэффективное распределение системы.
Dynomite
СУБД Dynomite реализует хранение и распределение данных, предлагая разработчикам простую модель «ключ-значение», обеспечивающую высокие готовность и масштабирование. Возможности механизмов распределения и масштабирования Dynomite можно комбинировать в разных сочетаниях, гибко варьируя модель данных. Dynomite разрабатывается на языке Erlang и представляет собой согласованное распределенное хранилище NoSQL, основанное на структуре СУБД Amazon Dynamo. Система реализует алгоритмы векторных часов, дерева Меркла и согласованного хэширования. Среди других особенностей: принятие решений по методу кворума (tunable quorum sensing), использование протокола «сплетен» (gossiping) для определения принадлежности к узлу и синхронизации разделов, подключаемые движки хранения, интерфейс быстрого доступа (thrift) и веб-консоль с поддержкой наглядного представления данных.
Redis
Redis (Remote Dictionary Server) — простая в использовании база данных «ключ-значение» с открытым кодом, хранящая все ключи в оперативной памяти. Эту СУБД называют сервером структур данных, так как ключи могут содержать строки, хэши, списки, множества и сортированные множества. Протокол обмена данными между узлами Redis двоичный, оптимизированный по пропускной способности. Значения в базе не могут занимать больше 512 Мбайт, а сама база не поддерживает использования виртуальной памяти операционной системы.
Xeround
СУБД Xeround предлагался собственный эластичный сервис баз данных на основе MySQL, хостинг которого осуществлялся в ЦОД Amazon Web Services в Европе и Северной Америке. Xeround не привязана к хостинг-сервису, поэтому ее можно было переносить между операторами облаков. Двухуровневая архитектура состоит из узлов доступа и узлов данных. Узлы доступа получают запросы от приложений, связываются с узлами данных, выполняют вычисления и выдают результаты, а узлы данных хранят информацию. Xeround хранила данные в виртуальных разделах, не привязанных к аппаратной инфраструктуре нижнего уровня. Каждый раздел тиражировался на разные узлы данных, размещенные на раздельных серверах, за счет чего обеспечивалась высокая готовность и полная отказоустойчивость. Версия Xeround Basic обслуживает записи размером до 500 Мбайт, поддерживает до 40 одновременных соединений (версия Pro — до 4,8 тыс. соединений) и обеспечивает максимальную пропускную способность до 8 Мбайт/с. Разработчики планировали предлагать свой сервис облачным провайдерам, включая GoGrid и Rackspace, однако в 2013 году развитие этой СУБД прекратилось.
SimpleDB
Amazon Web Services располагает собственным облачным сервисом баз данных SimpleDB, рассчитанным на типовые применения, и при минимальном объеме использования система бесплатна. Исходный код SimpleDB написан на Erlang, за счет чего обеспечиваются гибкость архитектуры, простота масштабируемости и расширяемость.
Dynamo
СУБД Amazon Dynamo помогает поддерживать работоспособность сервисов, предъявляющих высокие требования к надежности и нуждающихся в жестком контроле компромиссов между готовностью, согласованностью, экономической эффективностью и быстродействием. СУБД предоставляет простой, основанный только на первичном ключе интерфейс доступа. Для обеспечения масштабируемости и готовности используется сочетание проверенных технологий: данные абстрагируются и согласованно тиражируются с использованием многоверсионности объектов. Согласованность децентрализованных копий при обновлении достигается за счет протокола синхронизации, опирающегося на принцип кворума. Децентрализованная структура Dynamo позволяет свести к минимуму административные затраты — узлы хранения добавляются и изымаются автоматически, не требуя вмешательства администратора.
Dynamo является базовой для ряда ключевых сервисов платформы электронной коммерции Amazon. Система может масштабироваться в периоды пиковых нагрузок, не отключаясь, например, во время предпраздничного всплеска торговли; в частности, сервис, обслуживающий корзину покупателя, способен обслуживать миллионы запросов, обеспечивая поддержку за сутки свыше 3 млн покупок, а сервис, сохраняющий состояние сеанса, обслуживает тысячи одновременных активных сеансов.
ClearDB
СУБД ClearDB построена на реляционной базе данных на основе MySQL и отличается высокой готовностью, катастрофоустойчивостью и быстродействием. Система поддерживает мультирегиональное зеркалирование операций чтения/записи, обеспечивая высокую готовность при сбоях сетей и накопителей. Система универсальна по отношению к облакам — в гибридных конфигурациях она может охватывать несколько разных облаков и распределенных физических ЦОД.
Сравнение возможностей
Проведем сравнение перечисленных СУБД по двум основным характеристикам.
Методы обработки
СУБД BigTable и подобные системы, такие как Cassandra и HBase, при обновлениях выполняют ввод-вывод последовательно, чтобы избежать перезаписи на диске. Обновления записываются в буфер памяти, который затем целиком последовательно сохраняется на диске. Множественные обновления одной и той же записи могут быть сброшены на различные участки диска в разное время. В результате, чтобы прочитать запись, NoSQL-базы типа BigTable должны выполнить множество операций ввода-вывода для извлечеия и объединения различных обновлений. Так как запись выполняется последовательно, она происходит быстро, тогда как операции считывания, напротив, не оптимизированы.
Архитектура Pnuts, выполненная по традиционной схеме пула буферов, перезаписывает записи при их обновлении. Так как обновление требует произвольных операций ввода-вывода, оно выполняется несколько медленнее, чем в BigTable и подобных системах, но чтение данных происходит быстро, поскольку за одну операцию можно извлечь самую новую запись целиком.
В HBase есть возможность отключить ведение упреждающего журнала операций, что позволяет снизить задержку при обновлении данных. Эта возможность согласуется с главным назначением HBase — выполнением пакетного анализа данных без предоставления гарантий их целостности. В подобных системах надежность принесена в жертву высокой скорости считывания данных. В Pnuts журнал операций по умолчанию всегда ведется на диске, хотя есть возможность его отключить.
Cassandra и Pnuts поддерживают асинхронное тиражирование, то есть тиражирование на большие дистанции без создания серьезных задержек для процедур обновления базы. Эти системы позволяют выполнять запись в произвольном режиме, а конфликты операций разрешаются уже после их выполнения. В Hbase и Cassandra для обеспечения свежести копий используется синхронное тиражирование.
Хранение по столбцам дает преимущества приложениям, которым в каждом запросе нужно осуществлять доступ к известному подмножеству столбцов. В BigTable, HBase и Cassandra есть возможность объявления столбцовых групп или семейств, а также добавления новых столбцов. Каждая такая группа физически хранится отдельно от остальных. Но если при запросах чаще требуются целая строка данных или ее произвольное подмножество, то лучше использовать схему разбиения, при которой каждая строка физически занимает одну область памяти. В Pnuts это достигается за счет сохранения целых строк, а в Cassandra и других столбцовых хранилищах — путем использования единственной группы/семейства столбцов.
Короче говоря, функции get, put и delete лучше всего поддерживаются системами «ключ-значение», такими как Hypertable и Voldemort, тогда как агрегацию данных проще выполнять с помощью столбцовых NoSQL-систем (например, Cassandra или BigTable). В свою очередь, для сопоставления данных больше подходят документоориентированные базы NoSQL, такие как MongoDB.
Принципы биллинга
СУБД Cassandra позволяет клиенту при каждом вызове явно указывать, нужно ли выполнять запись в энергонезависимую область долгосрочного хранения, а Amazon DynamoDB дает возможность осуществлять бесшовное масштабирование. После создания новой таблицы система позволяет масштабировать средства обслуживания запросов без прерываний работы и снижения производительности. Сервис Amazon Elastic Compute Cloud дает пользователю доступ с административными привилегиями, но требует платить за его использование даже в период, когда вычисления не выполняются.
Пользователи Amazon SimpleDB не платят за первые 25 часов машинного времени каждого месяца и за первый гигабайт пространства хранения. Пользователи Amazon DynamoDB не платят за первые 100 Мбайт хранения, а также когда частота обращений не превышает пяти операций записи и десяти операций считывания в секунду.
Тарифы на MongoDB: базовая подписка стоит 2500 долл. за сервер, стандартная — 5 тыс., корпоративная — 7,5 тыс. долл.
Оперативная память — один из главных ресурсов, который интенсивно используется для повышения быстродействия. Системы NoSQL, задействующие память многих серверов, обеспечивают простоту горизонтального масштабирования, а также повышенную готовность и отказоустойчивость за счет дублирования. Многие СУБД NoSQL позволяют экономить деньги, так как разрабатываются в открытых кодах. В сущности, практически все перечисленные базы имеют либо открытый код, либо бесплатную версию с ограниченной функциональностью.
В организациях, где планируют внедрение баз NoSQL, помимо цены, нужно учитывать требования к пространству хранения и долгосрочные планы. Доводы в пользу перехода на NoSQL следующие: возможность обработки больших и растущих объемов неструктурированных, распределенных данных; отсутствие жестко заданной схемы; предпочтение быстродействия и готовности перед дублированием.
Еще один важный довод — экономическая эффективность, обусловленная применением кластеров из дешевых стандартных серверов, используемых для управления экспоненциально растущими объемами данных и транзакций.
В таблице приведены основные характеристики обсуждаемых СУБД.
При выборе той или иной СУБД следует учитывать два основных фактора:
- требования рабочих задач путем сравнения их выполнения на системах, оптимизированных для выполнения операций записи и чтения;
- компромисс между малой задержкой и надежностью (например, если разработчики знают, что допустима потеря доли операций записи, то тогда можно применять последовательную запись на диск без синхронизации).
Основные особенности СУБД систем NoSQL |
***
СУБД приобрели особую важность в эпоху колоссального роста количества источников данных и распространения мобильных устройств. Данные вышли из-под контроля департаментов ИТ, перейдя под власть облачных сервисов, мобильных устройств и сайтов социальных сетей. Распространение и развитие облаков обостряют потребность в надежных сервисах облачных баз данных. Из представленных в статье СУБД наибольшую популярность получили Cassandra, HBase и MongoDB, которые можно назвать самыми типичными представителями мира NoSQL. Следует отметить, что вместо традиционных принципов ACID (Atomicity — «атомарность», Consistency — «согласованность», Isolation — «изоляция», Durability — «долговечность хранения») многие облачные базы поддерживают принципы BASE (Basically Available, Soft State, Eventually consistent — базовая доступность, неустойчивое состояние, согласованность в конечном итоге).
Литература
- T. Dory. Study and Comparison of Elastic Cloud Databases: Myth or Reality? Master’s Thesis, Computer Eng. Dept., Universite Catholique de Louvain, 2011. URL: http://www.info.ucl.ac.be/~pvr/MemoireThibaultDory.pdf (дата обращения 22.05.2014).
- S. Sakr et al. A Survey of Large Scale Data Management Approaches in Cloud Environments. IEEE Communications Surveys & Tutorials, vol. 13, no. 3, 2011, P. 311–336.
Ганеш Чандра Дека (ganeshdeka2000@gmail.com) — заместитель директора по обучению, Министерство труда и занятости Индии.