4.1 Описание

Apache Cassandra - это распределенная система баз данных из класса NoSQL. Она создана для создания масштабируемых и надежных хранилищ данных, представленных в виде хэша.

Вначале проект был создан в Facebook и передан под контроль Apache Software Foundation в 2009 году. Эта организация продолжает развивать проект. На базе Cassandra были созданы промышленные решения для компаний, таких как Cisco, IBM, Cloudkick, Reddit, Digg, Rackspace, Huawei, Netflix, Apple, Instagram, GitHub, Twitter и Spotify. В 2011 году самый большой кластер серверов, управляющих одной базой данных, насчитывал более 400 машин и содержал данные объемом более 300 ТБ.

Java пишется для реализации распределенной хэш-системы, которая похожа на DynamoDB. Это обеспечивает практически линейную масштабируемость при росте количества данных. Она использует семейство столбцов для хранения данных, в отличие от подобных MemcacheDB, которые хранят только ключ-значение. Также есть возможность организовать хранение хэшей с несколькими уровнями вложенности.

Эта СУБД относится к категории отказоустойчивых. Данные в базу автоматически распределяются по нескольким узлам в сети или равномерно по нескольким дата-центрам. При сбое одного узла другие берут на себя его функции. Добавление и обновление узлов происходит без дополнительного вмешательства.

Java пишется для реализации распределенной хэш-системы, которая похожа на DynamoDB. Это обеспечивает практически линейную масштабируемость при росте количества данных. Она использует семейство столбцов для хранения данных, в отличие от подобных MemcacheDB, которые хранят только ключ-значение. Также есть возможность организовать хранение хэшей с несколькими уровнями вложенности.

Эта СУБД относится к категории отказоустойчивых. Данные в базу автоматически распределяются по нескольким узлам в сети или равномерно по нескольким дата-центрам. При сбое одного узла другие берут на себя его функции. Добавление и обновление узлов происходит без дополнительного вмешательства.

Рекомендуется перегенерировать ключи для всех узлов, даже если их количество увеличено несколько раз.

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

В кассандре приложение работает с областью ключей (keyspace), которая соответствует схеме базы данных (database schema) в реляционной модели. В этой области могут быть несколько колоночных семейств (column family), что соответствует таблице в реляционной модели.

Колоночные семейства содержат колонки (columns), которые объединяются при помощи ключа строки (row key) в записи (row). Каждая колонка состоит из трех частей: имени (column name), метки времени (timestamp) и значения (value). Колонки в пределах записи упорядочены. В отличие от реляционной БД, в кассандре нет ограничений на то, чтобы записи (строки) содержали колонки с одинаковыми именами.

В последних версиях кассандры появилась возможность использовать язык CQL для выполнения запросов определения и изменения данных (DDL, DML) и создания вторичных индексов (secondary indices).

В Кассандре хранится конкретное значение, которое можно идентифицировать.

  • пространством ключей — это связь с приложением (областью предмета). Она позволяет располагать данные разных приложений на одном кластере.
  • колоночным семейством — это связано с запросом;
  • ключом — это привязка к узлу кластера. Ключ определяет, какие узлы будут иметь доступ к сохраненным колонкам.
  • именем колонки — это привязка к атрибуту в записи, которая позволяет хранить несколько значений в одной записи.

Каждому значению соответствует метка времени, которую задает пользователь. Чем больше число, тем новее колонка. При сравнении старые колонки перетираются.

4.3 Типы данных

О типах данных: пространство ключей и колоночное семейство - это строки (имена); метка времени - это 64-битное число; а ключ, имя колонки и значение колонки - это массив байтов. Также Кассандра позволяет задавать типы данных (data type). Это может быть сделано при создании колоночного семейства.

Для имён колонок это называется сравнителем (comparator), а для значений и ключей — валидатором (validator). Сравнитель определяет, какие байтовые значения допустимы для имён колонок и как их упорядочить. Валидатор определяет, какие байтовые значения допустимы для значений колонок и ключей.

Если типы данных не указаны, то Кассандра хранит и сравнивает их как байтовые строки (BytesType), потому что это как они сохраняются внутри.

Типы данных бывают такими:

  • BytesType: любые байтовые строки (без валидации)
  • AsciiType: ASCII строка
  • UTF8Type: UTF-8 строка
  • IntegerType: число с произвольным размером
  • Int32Type: 4-байтовое число
  • LongType: 8-байтовое число
  • UUIDType: UUID 1-ого или 4-ого типа
  • TimeUUIDType: UUID 1-ого типа
  • DateType: 8-байтовое значение метки времени
  • BooleanType: два значения: true = 1 или false = 0
  • FloatType: 4-байтовое число с плавающей запятой
  • DoubleType: 8-байтовое число с плавающей запятой
  • DecimalType: число с произвольным размером и плавающей запятой
  • CounterColumnType: 8-байтовый счётчик

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

Запись в кассандру занимает меньше времени, чем чтение. Это означает, что проектировщики должны использовать иной подход. Если рассмотреть колоночное семейство из перспективы проектирования модели данных, то проще представить его как материализованное представление (materialized view) — структуру, которая представляет данные некоторого запроса, но хранит их на диске.

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

Количество колонок в записи ограничено до 2 миллиардов. Об этом более подробно можно прочитать в статье, посвященной техникам проектирования и оптимизации. Для начала давайте рассмотрим процесс сохранения и чтения данных из кассандры.