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

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

Одни из самых популярных колоночных баз данных – Apache Cassandra и Apache HBase.

https://bi-insider.com/business-intelligence/column-and-row-based-database-storage/

Зачем вообще кому-то могут понадобиться колоночные базы данных?

Они быстрее:

  • Более быстрый поиск и извлечение столбцов: В колоночной базе данных каждый столбец хранится в виде отдельного файла, который можно сжать и оптимизировать с целью более эффективного хранения и извлечения данных. Такой подход позволяет повысить производительность запросов, поскольку мы оперируем только теми столбцами, которые необходимы в рамках конкретного запроса.

  • Уплотненные ввод-вывод: Колоночные базы данных могут значительно сократить ввод-вывод, считывая только те столбцы, которые необходимы в рамках конкретного запроса. Как следствие время ответа на запрос сокращается и ресурсы используются более эффективно.

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

Они эффективнее:

  • Более эффективны с точки зрения потребления памяти: Колоночные базы данных могут быть более эффективными с точки зрения использования памяти, поскольку данные в столбцах, как правило, имеют схожие типы данных и значения, из-за чего их можно сжать более эффективно, чем данные в строках.

  • Более эффективное сжатие данных: Колоночные базы данных могут достигать более высоких коэффициентов сжатия, чем традиционные базы данных. Как следствие, мы можем добиться значительной экономии памяти.

  • Гибкая схема: Колоночным базам данных намного легче обрабатывать гибкие и динамические изменения схемы, чем их традиционным собратьям, группирующим данные по строкам. Это делает их более подходящим кандидатами для широкого спектра вариантов использования, включая работу с данными временных рядов, систем обмена сообщениями и многого другого.

Что из себя представляет Cassandra?

Cassandra — это популярная колоночная база данных, оптимизированная для обработки больших объемов данных на множестве commodity-серверов.

  1. Высокая масштабируемость: Cassandra обладает высокой масштабируемостью и может легко обрабатывать большие объемы данных на нескольких узлах. Вы можете добавлять дополнительные узлы в свой кластер по мере роста ваших информационных потребностей.

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

  3. Высокая производительность: Cassandra разработана для обеспечения высокой производительности с низкой задержкой и высокой пропускной способностью. Она оптимизирована для рабочих нагрузок с большим количеством операций записи – она может обрабатывать миллионы операций записи в секунду.

  4. Распределенная архитектура: Cassandra — это распределенная база данных, что означает, что ее можно развернуть сразу в нескольких центрах обработки данных в разных регионах. Это позволяет реплицировать данные для аварийного восстановления и сократить время ожидания для пользователей в разных географических точках.

Простой пример работы с Cassandra

from cassandra.cluster import Cluster
# Подключаемся к кластеру Cassandra
# Мы подключаемся к кластеру Cassandra посредством создания объекта Cluster с адресами узлов в кластере.
cluster = Cluster(['<cassandra-node-1>', '<cassandra-node-2>', '<cassandra-node-3>'])
# Затем мы создаем объект Session с именем пространства ключей, которое мы хотим использовать.
session = cluster.connect('<keyspace>')
# Create a table
session.execute("""
    CREATE TABLE IF NOT EXISTS users (
        id int PRIMARY KEY,
        name text,
        email text
    )
""")
# Заполняем таблицу данными
session.execute("""
    INSERT INTO users (id, name, email)
    VALUES (%s, %s, %s)
""", (1, 'Alice', 'alice@example.com'))
# Запрашиваем данные из таблицы
rows = session.execute("SELECT * FROM users")
for row in rows:
    print(row.id, row.name, row.email)
# Обновляем данные в таблице
session.execute("""
    UPDATE users
    SET email = %s
    WHERE id = %s
""", ('new-email@example.com', 1))
# Удаляем данные из таблицы
session.execute("""
    DELETE FROM users
    WHERE id = %s
""", (1,))
# Закрываем соединение с кластером Cassandra
cluster.shutdown()

В каких сценариях следует использовать Cassandra? Юзкейсы, альтернативы и недостатки

Как определить, какая именно колоночная база данных вам нужна?

Факторы, которые следует учитывать при выборе колоночной базы данных:

  1. Тип рабочей нагрузки и шаблоны запросов: Для рабочих нагрузок, предполагающих сложных запросов, агрегирования и хранения данных, такие колоночные базы данных, как Vertica или ClickHouse, скорее всего, будут лучшим выбором, нежели Cassandra.

  2. Требования к согласованности: Cassandra больше ориентирована на доступность и устойчивость к разделению сети, нежели на согласованность, что делает ее более подходящей для приложений, для которых подходит “согласованность в конечном счете” (eventual consistency). При более жестких требованиях к согласованности Hbase или Bigtable подойдут лучше.

  3. Объемы данных: Если ваш набор данных относительно невелик и может уместиться на одной машине, более простая и легковесная база данных [например, Mysql] может быть лучшим выбором, нежели Cassandra.

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

  5. Производительность, доступность и отказоустойчивость: Также важно понимать, насколько быстро база данных может выполнять операции чтения и может ли она обрабатывать данные в реальном времени. Учитывайте, как база данных справляется с аппаратными сбоями или перебоями в работе сети, а также предоставляет ли она функционал для репликации и обеспечения избыточности данных. Cassandra, например, разработана с упором на обеспечение высокой доступности.

  6. Стоимость: Разные колоночные базы данных имеют разные модели лицензирования и структуры ценообразования. Вам нужно учитывать стоимость базы данных, не забыв о лицензионных сборах и расходах на инфраструктуру и обслуживание.

  7. Поддержка сообщества: Очень важными факторами являются размер и активность сообщества разработчиков и пользователей, а также доступность ресурсов и поддержки. Например, Cassandra, HBase, Bigtable — самые популярные колоночные базы данных.

Альтернативы Cassandra

Апач HBase: Apache HBase — это распределенная клоночная база данных с открытым исходным кодом, построенная поверх Hadoop. Существует несколько сценариев, в которых HBase может оказаться лучшей альтернативой Cassandra.

  1. Ad-hoc запросы: HBase предоставляет более гибкую модель данных, чем Cassandra, что делает его хорошим выбором для приложений, предполагающих ad-hoc запросы и исследование данных.

  2. Сложные типы данных: HBase поддерживает сложные типы данных, такие как массивы, map’ы и вложенные структуры, что делает его хорошим выбором для приложений, требующих более сложного моделирования данных.

  3. Интеграция с Hadoop: HBase интегрирован с экосистемой Hadoop, что делает его хорошим выбором для приложений, требующих обработки данных с помощью таких инструментов, как Apache Spark и Apache Hive.

  4. Строгая согласованность: HBase обеспечивает строгую согласованность (strong consistency), что означает, что данные всегда непротиворечивы и актуальны на всех узлах в кластере.

Bigtable: Google Cloud Bigtable — это полностью управляемый сервис NoSQL базы данных, предназначенный для обработки огромных объемов данных в режиме реального времени.

  1. Интеграция с Google Cloud Platform: Он особенно хорошо подходит для сценариев, требующих интеграции с другими сервисами Google Cloud.

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

  3. Управляемый сервис: Bigtable — это полностью управляемый сервис на GCP, что означает, что Google берет на себя заботу о инфраструктуре, обслуживании и масштабировании базы данных. Если вы считаете, что управляемый сервис поможет вам сэкономить на операционных издержках, Bigtable скорее всего будет лучшим выбором.

ScyllaDB: ScyllaDB — это распределенная NoSQL база данных с открытым исходным кодом, которая позиционируется как “убийца Cassandra”.

  1. Производительность: Может обрабатывать больше транзакций в секунду (TPS) с меньшей задержкой по сравнению с Cassandra.

  2. Лучше в использовании оборудования: В сравнении с Cassandra ScyllaDB оптимальнее использует такие аппаратные ресурсы, как процессор и память, что может помочь вам сэкономить на затратах на оборудование.

  3. Имеет встроенную поддержку аналитики в реальном времени благодаря своей фиче Materialized Views, которую можно использовать для создания вторичных индексов для более быстрого доступа к данным.

Так в чем же Cassandra выделяется на фоне остальных колоночных баз данных?

  1. Распределенная архитектура, обеспечивающая высокую доступность и отказоустойчивость: Как и другие колоночные базы данных, Cassandra рассчитана на горизонтальное масштабирование за счет добавления дополнительных узлов в кластер. Однако, в отличие от других колоночных баз данных, распределенная архитектура Cassandra обеспечивает высокую доступность и отказоустойчивость, что упрощает масштабирование до громадных кластеров, состоящих из тысяч узлов.

  2. Настраиваемая согласованность: Настраиваемая модель согласованности Cassandra позволяет пользователям изменять уровень согласованности для повышения доступности, что значительно упрощает масштабирование приложений в больших кластерах. Другие колоночные базы данных обычно обеспечивают более строгие гарантии согласованности, что может стать помехой для масштабирования до больших кластеров.

  3. Легко масштабируется: Cassandra реализует децентрализованную (peer-to-peer) архитектуру, которая позволяет каждому узлу в кластере взаимодействовать со всеми остальными узлами. Это делает возможным добавление или удаление узлов из кластера без нарушения работы системы. Cassandra использует модель распределения данных, известную как последовательное хеширование (consistent hashing), которая обеспечивает равномерное распределение данных по узлам в кластере. Это упрощает масштабирование операций чтения и записи в больших кластерах.

  4. Более низкая стоимость: Cassandra — это база данных с открытым исходным кодом, которую можно использовать бесплатно без каких-либо затрат на лицензирование.

Недостатки Cassandra

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

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

  3. Накладные расходы на хранение: Cassandra реализует модель wide column store (буквально “широкие столбцы”), а это означает, что при хранении данных с разными значениями столбцов возникают некоторые накладные расходы. Это может стать причиной повышенных требований к хранилищу по сравнению с другими системами баз данных.

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

  5. Ограниченные возможности формирования запросов: Язык запросов Cassandra (CQL) имеет ограниченную поддержку расширенных операций запросов, таких как подзапросы (subqueries) и полнотекстовый поиск (full-text search). Cassandra оптимизирована под простые запросы и может работать не лучшим образом со сложными запросами, требующими объединения или агрегирования.

  6. Ограничения модели данных: Модель данных Cassandra оптимизирована для колоночных данных и может быть менее пригодной для транзакционных данных со сложными отношениями. Она также не поддерживает join’ы и ограничения ссылочной целостности.


Каждый инженер слышал о масштабировании. А вот вопрос, известный уже не каждому — сколько измерений масштабирования принято рассматривать? В 2007 году авторы книги "The Art of Scalability" ввели термин "The Scale Cube" и три измерения масштабирования.

Приглашаем на открытое занятие, на котором рассмотрим Scale Cube на примерах и поговорим о двух видах шардирования — горизонтальном и вертикальном. Также познакомимся с примерами СУБД, которые поддерживают те или иные виды шардирования.

Занятие пройдет в преддверии старта онлайн-курса "Highload Architect". Зарегистрироваться на открытый урок можно по ссылке.

Комментарии (15)


  1. ivankudryavtsev
    18.04.2023 16:33

    Что-то прям не доверяю я фразе про то, что C* - одна из самых популярных колоночных СУБД. Вещь очень нишевая и применяется сегодня редко, потому что хоть и писать в нее легко, но читать из нее и сделать правильную схему - это рокет сайнс. С появлением Clickhouse, а до этого с Vertica, кажется, что C* вообще нафиг никому не надо сегодня...

    А код из "Простой пример работы с Cassandra" - это прямо живой антипаттерн.

    rows = session.execute("SELECT * FROM users")
    for row in rows:
        print(row.id, row.name, row.email)

    Вот это сделает "кря" на реальной БД как пить дать в C*. А все потому, что C* только притворяется СУБД с поддержкой SQL, а по факту это просто Redis с кучей скрытого в тени под типа CQL.


    1. Soupbreak
      18.04.2023 16:33

      С появлением Clickhouse, а до этого с Vertica, кажется, что C* вообще нафиг никому не надо сегодня...

      Только одна ОЛАП а другая ОЛТП


      1. ivankudryavtsev
        18.04.2023 16:33

        Ну я так и пишу - kv store, а код из примера - антипаттерн.


    1. creker
      18.04.2023 16:33

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

      На redis это мало похоже хотя бы потому, что оно скейлится действительно и отказоустойчиво в отличии от. Сравнивать с CH и Vertica тоже некорректно, ибо принципиально разные базы для совершенно разных нагрузок и объемов данных.

      А популярность касандры сложно оспаривать. Повсюду она в применении. Читать из нее и сделать нормальную схему ничего сложного не представляет. У нее очень простые правила хранения данных и того, как выполняются запросы. Намного проще, чем в реляционных базах. Все предсказуемо и понятно. От того, не каждый тип запросов можно вообще реализовать на ней.


      1. ivankudryavtsev
        18.04.2023 16:33

        Не знаю не знаю. По таймауту свалится, насколько я помню без сужения через partition key, cluster key и т.п.


        1. creker
          18.04.2023 16:33
          +1

          Не свалится. Это не реляционная база. Постранично запрашивайте сколько влезет и все будет ок.


          1. ivankudryavtsev
            18.04.2023 16:33

            Я не специалист в С*, сразу оговорюсь.

            Но, давайте честно говорить, что C* - это KV-store. Если с ней работать не как с KVS - будет больно. Особенно больно будет операциям записи, которые после commit log-а начнут пытаться партиционироваться и столкнутся лбом с операциями чтения.

            В общем, мы использовали успешно C* только как KVS, причем со связкой через Kafka. Для всего, что связано с "запросами", которые C* пытается исполнять, делая вид, что умеет SQL, все это перестает работать быстро и прогнозируемо.

            Если вытаскивать данные по ключу, без сканирования непонятных объемов данных - не вопрос, C* можно.

            Ну и куча антипаттернов. TTL есть, но использовать для реализации очереди - антипаттерн. Уж по мне, проще на связке Kafka + RocksDB, без плясок с этими чудесными кольцами C*.


            1. creker
              18.04.2023 16:33
              +1

              Вот уж операциям записи вообще не больно будет. Будет больно как раз таки чтению, оно самое проблемное в касандре. При жирных партициях и частых обновлениях будет полно тамбстоунов, которые при чтении придется пропускать. Записи же вообще пофиг. В коммит лог и memtable записал и забыл.

              Оно все же больше, чем просто KV хранилище. Именно за счет кластерных ключей и алгоритмов распределения данных. Не говоря уже о материализованных представлениях, вторичных индексах, транзакциях, CDC и прочих плюшках. За счет всего этого поверх нее можно сделать очень многое, если не требуется строгая консистентность между таблицами. Хоть основной OLTP сторандж, хоть OLAP, хоть data lake.

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


              1. ivankudryavtsev
                18.04.2023 16:33

                Ну Kafka, Redis не притворяется что они кто-то другой, "типа SQL", например, а C* притворяется, что она типа СУБД и все будет по лайту, а на самом деле не будет. Вот и вся моя претензия.


                1. creker
                  18.04.2023 16:33
                  +1

                  Не знаю, откуда вы взяли, что притворяется. Просто взяли простой знакомый язык запросов и назвали его специально CQL, чтобы люди не думали, что это как постгре SQL какой-нить.

                  Kafka, redis точно так же можно сказать притворяются. Их точно так же пытаются натянуть как сову на глобус с подачи компаний, стоящих за их разработкой. Ничего плохого в этом нет, просто надо понимать, что к чему. Касандра тут ничем не выделяется. По факту, это СУБД. Просто NoSQL с широкими колонками и прочими особенностям. Все как у всех.


  1. creker
    18.04.2023 16:33
    +8

    Пост конечно глупый совершенно. Во-первых, касандра не колоночная база данных и никаким местом с Clickhouse и Vertica их сравнивать и противопоставлять нельзя, ибо OLTP против OLAP получается. Из касандры OLAP делается только через Apache Spark ему подобные. Во-вторых, пример запросов действительно совершенно некорректный. Делать выборки без primary key это антипаттерн и заставит ходить за данным по всем нодам в кластере. Ну и касандра никак вообще не оптимизирована, можно сказать, для работы на высокопроизводительном оборудовании. Она его не способная утилизировать в принципе. Сцилла да, касандра нет от слова совсем.


    1. ggo
      18.04.2023 16:33
      +2

      Предположительно, касандру записали в колоночные базы из-за термина "column-family"

      Это очень похоже на "column-oriented", но не одно и тоже


      1. hard_sign
        18.04.2023 16:33

        Да, именно так. Издержки перевода. И это не первый раз на Хабре такое :(


  1. kle6ra
    18.04.2023 16:33

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


  1. Evgeek
    18.04.2023 16:33

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