В чем разница между Cassandra и MongoDB?

Apache Cassandra и MongoDB – это две базы данных NoSQL, в которых данные хранятся в нетабличном формате. Cassandra – это ранняя база данных NoSQL с гибридным дизайном табличного хранилища и хранилища ключей и значений. Она предназначена для хранения данных для приложений, требующих высокой производительности чтения и записи. В отличие от нее, MongoDB – база данных документов, созданная для общего использования. Она имеет гибкую модель данных, которая позволяет хранить неструктурированные данные в оптимизированном формате JSON, называемом Binary JSON, или BSON. База данных MongoDB обеспечивает полную поддержку индексирования и репликации с помощью богатых и интуитивно понятных API.

Подробнее об Apache Cassandra »

Подробнее о MongoDB »

В чем сходство Cassandra и MongoDB?

И Apache Cassandra, и MongoDB принадлежат к группе баз данных NoSQL. Базы данных NoSQL могут хранить структурированные, неструктурированные и полуструктурированные данные без схемы базы данных.

Хранение данных в базах данных NoSQL не ограничено табличным форматом и связями между таблицами, в отличие от традиционной системы управления реляционными базами данных. Вы можете свободно распределять и реплицировать данные между несколькими узлами для эффективного масштабирования. 

Кроме того, Cassandra и ранние версии MongoDB имеют открытый исходный код. Это означает, что вы можете загрузить исходный код этих баз данных NoSQL и настроить их по своему усмотрению.

Команда Facebook разработала сервис Cassandra, а затем выпустила его как проект с открытым исходным кодом с Apache. MongoDB был разработан небольшой группой разработчиков под руководством MongoDB, Inc. Все версии MongoDB, выпущенные до 16 октября 2018 г., доступны под лицензией GNU Affero General Public License.

Подробнее о NoSQL »

Подробнее об открытом исходном коде »

Различия в моделях данных: Cassandra и MongoDB

Хотя MongoDB и Apache Cassandra являются базами данных NoSQL, они по-разному хранят данные и управляют ими.

Cassandra

Cassandra хранит данные в виде хранилищ ключей и значений. Сервис позволяет определять таблицы со строками и столбцами, но табличная структура не используется в реальном хранилище. Вместо этого используется модель базы данных, ориентированная на широкий столбец, поэтому каждая строка таблицы может содержать свой набор столбцов.

Столбцы можно сгруппировать в семейства столбцов в зависимости от типа данных или их использования. Каждая строка содержит первичный ключ, который можно использовать для быстрого чтения данных из Cassandra.

Структуру таблицы Apache Cassandra можно визуализировать в следующем примере.

Идентификатор клиента 1

Столбец – имя

Столбец – страна

 
 

Значение – Джон Доу

Значение – Соединенные Штаты

 
Идентификатор клиента 2

Столбец – имя 

Столбец – возраст

Столбец – электронная почта

 

Значение – Джейн Доу

Значение – 35

Значение – jane_doe@example.com

MongoDB

Напротив, MongoDB хранит данные без схемы, используя оптимизированный формат Binary JSON (BSON). Сервис может хранить несколько типов данных в одном документе, аналогично объектам JSON, а затем сериализовать их с помощью BSON.

MongoDB организует документы в наборы, которые могут содержать данные с различными структурами. Такая модель данных гибкая и может обрабатывать большие объемы неструктурированных данных.

Ниже приведен пример данных клиентов в MongoDB.

customers:[

{

  customer_id: "1",

  name: “John Doe”,

  country: "United States"

},

{

  customer_id: "2",

  age: “35”

  email: "jane_doe@example.com"

}]

Архитектурные различия: Cassandra и MongoDB

Из-за различий в моделях данных Cassandra и MongoDB по-разному реализуют несколько функций баз данных.

Базовая единица хранения

В Cassandra таблицы отсортированных строк (SSTable) являются основной единицей хранения данных, используемой для хранения данных на диске. SSTable – это файл, содержащий отсортированный набор пар «ключ-значение» для определенного семейства столбцов (таблицы) и раздела. Таблицы SSTable неизменяемы, а это значит, что после записи их нельзя изменить. 

В MongoDB основной единицей хранения является документ. Документ – это набор пар «ключ-значение», где ключи представляют собой строки, а значения могут быть разных типов. Например, значениями могут быть другие документы, массивы, строки, числа, даты и логические значения. Документы хранятся в наборах.

Язык запросов

Язык запросов – это операторы, которые вы используете для вставки и извлечения данных из базы данных.

Язык запросов Cassandra (CQL) – это язык запросов, который вы используете в Cassandra. Хотя его синтаксис и структура аналогичны SQL, Apache разработал CQL для работы с моделью данных семейства столбцов.

С другой стороны, MongoDB использует язык запросов MongoDB (MQL), который содержит команды, аналогичные Node.js. MQL поддерживает операции создания, чтения, обновления и удаления (CRUD). Команды MQL можно писать в оболочке MongoDB.

Индексирование

Индексирование – это метод, используемый в базах данных для повышения скорости и эффективности операций извлечения данных. Он включает создание структуры данных, которая сопоставляет значения одного или нескольких столбцов таблицы базы данных с физическим расположением соответствующих данных на диске.

Cassandra поддерживает два типа индексов:

  • Вторичные индексы в отдельных столбцах
  • Вторичные индексы SSTable-Attached (SASI) на нескольких столбцах

Индексы SASI хранят данные индекса непосредственно в таблицах SSTable. Они поддерживают сложные запросы, такие как диапазон, префикс и полнотекстовый поиск по столбцам с большим количеством уникальных значений.

Напротив, MongoDB поддерживает индексацию на уровне набора и на уровне поля. Таким образом предоставляется несколько типов индексов, таких как индексы с одним полем, составные индексы и индексы с множественными ключами. Также предлагаются следующие индексы:

  • специализированный геопространственный индекс для географически распределенных данных
  • индекс текстового поиска для больших объемов текстовых данных
  • хэшированные и кластеризованные индексы для числовых данных

Параллельные операции

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

Cassandra обеспечивает параллельную роботу за счет согласованности проигрывателей и атомарности на уровне строк. Только один пользователь может работать с одной строкой одновременно.

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

Напротив, MongoDB поддерживает механизмы управления параллелизмом нескольких версий (MVCC). MVCC позволяет одновременно поддерживать несколько версий одного и того же документа данных. Каждый документ имеет уникальный идентификатор версии, который повышается при каждом обновлении. Блокирование на уровне документов и MVCC обеспечивают более надежную стратегию параллелизма.

Доступность

Доступность означает, что вы гарантируете отсутствие простоев данных даже во время простоя сервера. И Cassandra, и MongoDB обеспечивают доступность за счет репликации данных между несколькими серверными узлами.

В Apache Cassandra каждый узел кластера содержит реплики данных для других узлов. Координаты каждого узла считываются на нужный узел для записи или извлечения данных. Одновременно также восстанавливаются данные, которые не согласованы между узлами. Это может повлиять на производительность в любом масштабе.

Напротив, MongoDB использует репликацию на одном первичном узле для обеспечения высокой доступности данных. MongoDB реплицирует данные в наборы реплик. Только один первичный узел получает записи, а другие просто реплицируют данные с первичного узла. Однако первичный узел создает единую точку отказа.

<t1>Масштабируемость</t1>

И Cassandra, и MongoDB поддерживают сегментирование – метод горизонтального разделения данных между несколькими узлами кластера. Например, если у вас тысячи клиентов, вы разделяете данные так, чтобы на каждом узле была информация только о нескольких сотнях клиентов. Таким образом вы сможете масштабировать базу данных, не создавая ограничений пропускной способности.

Cassandra использует алгоритм распределенного хэширования, называемый последовательным хэшированием, чтобы определить, какой узел отвечает за определенное значение данных. Cassandra также поддерживает виртуальные узлы (vnodes), которые позволяют одному физическому узлу иметь несколько диапазонов данных.

Напротив, MongoDB использует ключи сегментирования, чтобы определить, куда может попасть значение данных. Администраторы баз данных могут определить ключи сегментирования для распределения данных на разделы. Данные можно разделить на основе таких факторов, как географическое положение, алфавитный порядок или любая другая система, наиболее эффективная для вашего набора данных.

Когда использовать Cassandra, а когда – MongoDB

Высокое время безотказной работы и распределенная архитектура Cassandra делают этот сервис хорошим выбором для поддержания требований к высокой доступности. Благодаря способности MongoDB обрабатывать неструктурированные данные с помощью документоориентированного подхода этот сервис полезен для систем, где данные постоянно меняются. 

Далее указаны несколько факторов, которые следует учитывать при выборе между ними.

Формат данных

Apache Cassandra имеет более структурированную систему хранения данных, чем MongoDB. Если данные, с которыми вы работаете, имеют фиксированный формат, лучше подойдет Cassandra.

Если данные более динамичны и не имеют согласованной структуры, MongoDB будет более подходящим.

Доступность

В MongoDB есть первичный узел, а затем серия реплик. Если основной узел выходит из строя, MongoDB тратит несколько минут на выбор узла-реплики для замены. Это может привести к небольшому времени простоя.

Cassandra использует систему распределенных узлов с большим количеством главных узлов, что обеспечивает 100 % бесперебойную работу. 

<t1>Масштабируемость</t1>

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

Производительность Cassandra может немного снизиться в зависимости от значений данных.

Язык запросов

И язык запросов Cassandra (CQL), и язык запросов MongoDB (MQL) являются высокоэффективными языками запросов. Однако CQL гораздо больше похож на SQL, поэтому вы можете легко использовать CQL, если уже знакомы с SQL.

У MQL есть различные реализации и синтаксис, поэтому его изучение может оказаться более сложным.

Поддержка языков программирования

MongoDB поддерживает двенадцать языков программирования: C, C++, C#, Go, Java, Node.js, PHP, Python, Ruby, Rust, Scala и Swift.

Cassandra поддерживает меньшее количество языков, таких как Java, JavaScript, Perl, Ruby, Scala, C#, Erlang, PHP, Python и т. д.

Краткое изложение различий: Cassandra и MongoDB

 

Apache Cassandra

MongoDB

Модель данных

Cassandra использует модель данных с широкими столбцами, более близкую к реляционным базам данных. 

MongoDB полностью отходит от реляционной модели, храня данные в виде документов.

Базовая единица хранения

Таблицы отсортированных строк.

Сериализованные документы JSON.

Индексирование

Cassandra поддерживает вторичные индексы и SASI для индексации по одному или нескольким столбцам.

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

Язык запросов

Cassandra использует CQL.

MongoDB использует MQL.

Параллельные операции

Cassandra обеспечивает параллельную работу благодаря атомарности на уровне строк и согласованности проигрывателя. 

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

Доступность

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

MongoDB использует один первичный узел и несколько узлов-реплик. В сочетании с сегментированием MongoDB обеспечивает высокую доступность и масштабируемость. 

поддержка разделов;

Согласованный алгоритм хэширования, меньший контроль со стороны пользователей.

Пользователи определяют ключи сегментирования и имеют больший контроль над разбивкой на разделы.

Как AWS может поддержать ваши требования для Cassandra и MongoDB?

Amazon Web Services (AWS) предлагает два сервиса, которые поддерживают общие требования Apache Cassandra и MongoDB.

Amazon Keyspaces (для Apache Cassandra) – это высокодоступная управляемая база данных, позволяющая переносить рабочие нагрузки Cassandra в облако. Amazon Keyspaces – бессерверный сервис, поэтому автоматически масштабирует таблицы в нужном направлении в зависимости от трафика приложений, а вы платите только за используемые ресурсы. Можно создавать приложения практически с неограниченной пропускной способностью и хранилищем, обслуживающие тысячи запросов в секунду.

Amazon DocumentDB (совместимость с MongoDB) – это полностью управляемая собственная база данных документов JSON. Она упрощает эксплуатацию важнейших рабочих нагрузок по обработке документов практически в любых масштабах без необходимости в управлении инфраструктурой. Amazon DocumentDB упрощает архитектуру, заблаговременно реализуя рекомендации по безопасности, непрерывное резервное копирование и встроенные возможности интеграции с другими сервисами AWS.

Начните работу с управляемыми сервисами баз данных Apache Cassandra и MongoDB на AWS, создав аккаунт AWS уже сегодня.