Почему многие называют Кассандру базой данных, ориентированной на столбцы?
Прочитав несколько статей и документов в Интернете, я нашел много противоречивой информации о модели данных Cassandra. Многие идентифицируют ее как базу данных, ориентированную на столбцы, другую - как строку, а затем определяют ее как гибридный способ обоих.
Согласно тому, что я знаю о том, как Cassandra хранит файл, он использует файл *-Index.db для доступа к правильной позиции файла *-Data.db, где хранится фильтр Блума, индекс столбцов и затем столбцы обязательный ряд
На мой взгляд, это строго ориентировано на ряд. Я что-то упускаю?
5 ответов
Да, терминология, ориентированная на столбцы, немного сбивает с толку.
Модель в Кассандре состоит в том, что строки содержат столбцы. Чтобы получить доступ к наименьшей единице данных (столбцу), необходимо сначала указать имя строки (ключ), а затем имя столбца.
Так в колонке называется Fruit
Вы могли бы иметь структуру, подобную следующему примеру (с 2 строками), где типы фруктов - это ключи строк, а каждый столбец имеет имя и значение.
apple -> colour weight price variety
"red" 100 40 "Cox"
orange -> colour weight price origin
"orange" 120 50 "Spain"
Одно из отличий от реляционной базы данных на основе таблиц состоит в том, что можно в любой момент опустить столбцы (у оранжевого нет разнообразия) или добавить произвольные столбцы (у оранжевого есть происхождение). Вы все еще можете представить вышеприведенные данные в виде таблицы, хотя и разреженной, где многие значения могут быть пустыми.
Однако "ориентированная на столбцы" модель также может использоваться для списков и временных рядов, где каждое имя столбца уникально (и здесь у нас есть только одна строка, но мы можем иметь тысячи или миллионы столбцов):
temperature -> 2012-09-01 2012-09-02 2012-09-03 ...
40 41 39 ...
которая довольно сильно отличается от реляционной модели, где нужно было бы моделировать записи временного ряда как rows
не columns
, Этот тип использования часто называют "широкими рядами".
- Если вы посмотрите файл Readme в Apache Cassandra git repo, он говорит, что
Cassandra - это магазин секционированных рядов. Строки организованы в таблицы с обязательным первичным ключом.
Разделение означает, что Cassandra может распределять ваши данные по нескольким машинам в прозрачном для приложений вопросе. Кассандра будет автоматически перераспределяться по мере добавления и удаления машин из кластера.
Хранилище строк означает, что, как и реляционные базы данных, Cassandra организует данные по строкам и столбцам.
Колонно-ориентированные или столбчатые базы данных хранятся на диске по столбцам.
например: таблица
Bonuses
ТаблицаID Last First Bonus 1 Doe John 8000 2 Smith Jane 4000 3 Beck Sam 1000
В системе управления базами данных, ориентированной на строки, данные будут храниться так:
1,Doe,John,8000;2,Smith,Jane,4000;3,Beck,Sam,1000;
В системе управления базами данных, ориентированной на столбцы, данные будут храниться так:
1,2,3;Doe,Smith,Beck;John,Jane,Sam;8000,4000,1000;
Кассандра в основном магазин для семейных колонн
- Кассандра будет хранить вышеуказанные данные как,
"Bounses" : { row1 : { "ID":1, "Last":"Doe", "First":"John", "Bonus":8000}, row2 : { "ID":2, "Last":"Smith", "First":"Jane", "Bonus":4000} ... }
- Прочитайте это для более подробной информации.
Надеюсь это поможет.
Самый недвусмысленный термин, с которым я столкнулся, - это магазин с широкими колонками.
Это своего рода двумерное хранилище значений ключей, где вы используете ключ строки и ключ столбца для доступа к данным.
Основное различие между этой моделью и реляционной (как ориентированной на строки, так и ориентированной на столбцы) состоит в том, что информация о столбцах является частью данных.
Это означает, что данные могут быть редкими. Это означает, что разные строки не должны иметь одинаковые имена столбцов или количество столбцов. Это позволяет полуструктурированным данным или таблицам без схемы.
Вы можете думать о хранилищах с широкими столбцами как о таблицах, которые могут содержать неограниченное количество столбцов и, таким образом, являются широкими.
Вот несколько ссылок, подтверждающих это:
- Эта статья Mongodb
- В этой статье Datastax также упоминается, хотя она классифицирует Cassandra как хранилище значений ключей.
- Эта статья
- Эта статья 2013 года
- Википедия
Вы оба делаете хорошие замечания, и это может сбивать с толку. В примере, где
apple -> colour weight price variety
"red" 100 40 "Cox"
яблоко - это ключевое значение, а столбец - это данные, которые содержат все 4 элемента данных. Из того, что было описано, звучит так, как будто все 4 элемента данных хранятся вместе как один объект, а затем анализируются приложением для получения только требуемого значения. Поэтому с точки зрения IO мне нужно прочитать весь объект. ИМХО, это по своей сути основано на строке (или объекте), а не на столбце.
Хранилище на основе столбцов стало популярным для хранилищ, потому что оно предлагает экстремальное сжатие и уменьшенный ввод-вывод для полного сканирования таблицы (DW), но за счет увеличения ввода-вывода для OLTP, когда вам нужно было извлекать каждый столбец (выберите *). Большинству запросов не нужен каждый столбец, и из-за сжатия количество операций ввода-вывода может быть значительно сокращено при полном просмотре таблиц всего на несколько столбцов. Позвольте мне привести пример
apple -> colour weight price variety
"red" 100 40 "Cox"
grape -> colour weight price variety
"red" 100 40 "Cox"
У нас есть два разных фрукта, но оба имеют красный цвет. Если мы сохраняем цвет на отдельной странице диска (блоке) от веса, цены и разнообразия, поэтому сохраняется только цвет, то при сжатии страницы мы можем добиться предельного сжатия из-за значительной дедупликации. Вместо того, чтобы хранить 100 строк (гипотетически) на странице, мы можем хранить 10000 цветов. Теперь, чтобы прочитать все с красным цветом, это может быть 1 IO вместо тысяч IO, что действительно хорошо для складирования и аналитики, но плохо для OLTP, если мне нужно обновить всю строку, так как строка может иметь сотни столбцов и один обновление (или вставка) может потребовать сотни операций ввода-вывода.
Если бы я не пропустил что-то, что я бы не назвал основанным на столбцах, я бы назвал это основанным на объектах. До сих пор не ясно, как объекты расположены на диске. Размещены ли несколько объектов на одной странице диска? Есть ли способ обеспечить совместную работу объектов с одинаковыми метаданными? В связи с тем, что один фрукт может содержать данные, отличные от другого фрукта, поскольку он содержит только метаданные или XML или то, что вы хотите сохранить в самом объекте, существует ли способ обеспечить совместное хранение определенных типов фруктов для повышения эффективности?
Larry
Семейство столбцов не означает, что оно ориентировано на столбцы. Кассандра - это семейство столбцов, но не ориентированное на столбцы. Он хранит строку вместе со всеми семействами столбцов.
Hbase - это семейство столбцов, а также хранит семейства столбцов ориентированным на столбцы образом. Различные семейства столбцов хранятся отдельно в узле, или они могут даже находиться в другом узле.
ИМО, это неправильный термин для Кассандры. Вместо этого более уместно называть это хранилищем разделов строк. Позвольте мне рассказать вам об этом подробнее:
Первичный ключ, ключ разделения, столбцы кластеризации и столбцы данных:
Каждая таблица должна иметь первичный ключ с уникальным ограничением.
Primary Key = Partition key + Clustering Columns
# Example
Primary Key: ((col1, col2), col3, col4) # primary key uniquely identifies a row
# we need to choose its components partition key
# and clustering columns so that each row can be
# uniquely identified
Partition Key: (col1, col2) # decides on which node to store the data
# partitioning key is mandatory, and it
# can be made up of one column or multiple
Clustering Columns: col3, col4 # decides arrangement within a partition
# clustering columns are optional
Ключ раздела - это первый компонент первичного ключа. Его хешированное значение используется для определения узла для хранения данных. Ключ раздела может быть составным ключом, состоящим из нескольких столбцов. Нам нужны почти равные разбросы данных, и мы учитываем это при выборе первичного ключа.
Любые поля, перечисленные после ключа раздела в первичном ключе, называются столбцами кластеризации. Они хранят данные в разделе в порядке возрастания. Компонент столбца кластеризации также помогает убедиться, что первичный ключ каждой строки уникален.
Вы можете использовать столько столбцов кластеризации, сколько захотите. Вы не можете использовать столбцы кластеризации не по порядку в инструкции SELECT. Вы можете отказаться от использования столбца кластеризации в инструкции SELECT. Все в порядке. Просто не забудьте подать в суд на них, когда вы используете оператор SELECT. Но обратите внимание, что в вашем запросе CQL вы не можете пытаться получить доступ к столбцу или столбцу кластеризации, если вы не использовали другие определенные столбцы кластеризации. Например, если первичный ключ(year, artist_name, album_name)
и вы хотите использовать city
столбец в вашем запросе WHERE
пункт, то вы можете использовать его, только если ваш WHERE
В предложении используются все столбцы, которые являются частью первичного ключа.
Жетоны:
Cassandra использует токены, чтобы определить, какой узел содержит какие данные. Токен - это 64-битное целое число, и Cassandra назначает диапазоны этих токенов узлам, чтобы каждый возможный токен принадлежал узлу. Добавление дополнительных узлов в кластер или удаление старых приводит к перераспределению этих токенов между узлами.
Ключ раздела строки используется для вычисления токена с использованием данного разделителя (хеш-функция для вычисления токена ключа раздела), чтобы определить, какой узел владеет этой строкой.
Кассандра - это магазин строк-разделов:
Строка - это самая маленькая единица, которая хранит связанные данные в Cassandra.
Не думайте о семействе столбцов Кассандры (то есть о таблице) как о таблице СУБД, но думайте о ней как оdict
из dict
(Вот dict
структура данных похожа на структуру данных Python OrderedDict
):
- внешний
dict
имеет ключ строки (первичный ключ): это определяет, какой раздел и какая строка в разделе - внутренний
dict
вводится ключом столбца (столбцы данных): это данные вdict
с именами столбцов в качестве ключей - и то и другое
dict
упорядочены (по ключу) и отсортированы: внешниеdict
сортируется по первичному ключу
Эта модель позволяет вам опускать столбцы или добавлять произвольные столбцы в любое время, поскольку она позволяет вам иметь разные столбцы данных для разных строк.
В Cassandra есть концепция семейств столбцов (таблица), которая изначально пришла из BigTable. Хотя, как вы упомянули, действительно ошибочно называть их столбцовыми. В каждом семействе столбцов они хранят вместе все столбцы из строки вместе с ключом строки и не используют сжатие столбцов. Таким образом, модель Bigtable по-прежнему в основном ориентирована на строки.