Введение. Говоря о «основном дизайне хранилища Apache Druid», я сказал, что хочу поговорить о колоночном хранилище. Теперь в этой статье вы можете узнать о режиме хранения строк, режиме хранения столбцов, их преимуществах и недостатках, а также об оптимизации режима хранения столбцов.
Сегодняшний девиз: не ограничивайте себя односторонним мышлением, делайте больше сравнений и узнавайте больше о разных измерениях.
из хранилища данных
Большинство систем баз данных, с которыми мы впервые столкнулись, представляют собой системы хранения строк. Когда мы изучали базы данных в колледже, преподаватель попросил нас представить базу данных в виде таблицы, каждая запись данных — это строка данных, а каждая строка данных содержит несколько столбцов. Таким образом, мы думаем о большей части хранилища данных как о более сложной системе управления таблицами. Мы записываем данные построчно, а затем отфильтровываем нужные строки, выполняя запросы по условиям запроса.
Большинство традиционных реляционных баз данных организуют данные по строкам. Например, Mysql, Postgresql. В последние годы все больше и больше традиционных баз данных добавляют возможности хранения столбцов. Хотя технология колоночного хранения существует уже более десяти лет, она никогда не становилась такой популярной организацией хранения, как сейчас.
Хранилище строк и хранилище столбцов — это способ организации данных в нижней части базы данных. (Он не находится на том же уровне, что и понятия типа документа, типа К-В, типа времени и т. д.)
хранилище строк
Система линейного храненияОрганизуйте данные в строки. Предположим, у нас сейчас есть следующие данные блога (учителя, которые давали систематические проектные задания в колледже, всегда просили нас создать систему блогов, вероятно, потому, что Интернет, с которым они впервые столкнулись, был BBS):
[
{
"title": "Oriented Column Store",
"author": "Alex",
"publish_time": 1508423456,
"like_num": 1024
},{
"title": "Apache Druid",
"author": "Bob",
"publish_time": 1504423069,
"like_num": 10
},{
"title": "Algorithm",
"author": "Casey",
"publish_time": 1512523069,
"like_num": 16
}
]
Rowstore будет хранить данные на диске следующим образом. Мы можем подумать о том, какое хранилище выгодно для этого способа? (Остановись здесь на 5 секунд и подумай) Это облегчает запись данных построчно.При записи записи данных вам нужно только добавить данные к существующей записи данных.
Хранилище линейного режима для системы OLTP (онлайн-обработка транзакций). Поскольку данные хранятся на линии, поэтому данные записываются быстрее. Нажмите запись на запрос данных также проще.
Большинство студентов спросят, наша система не делает этого, чтобы сделать это? Так почему мне нужно столбчатое хранение и столбчатое хранение, что такое?
Давайте представим сценарий: теперь вместо того, чтобы запрашивать блог Боба, я хочу подсчитать количество блогов, опубликованных Бобом, или количество отметок «Нравится» в блоге всей системы за сегодняшний день. Если это система хранения строк, как будет работать база данных? (Сделайте паузу и подумайте 10 секунд)
Как показано на рисунке, если вы хотите подсчитать все лайки, вам сначала нужно прочитать все данные строки в память, а затем выполнить операцию суммирования в столбце like_num, чтобы получить результат. Мы предполагаем, что диск может считывать данные 3-х блоков на рисунке за раз (на самом деле это нужно считывать побайтно), тогда для этого совокупного вычисления требуется N (N=количество данных) обращений к диску.
Эта необходимость часто агрегировать статистику по большим наборам данных на самом деле является обычным поведением систем OLAP. Основываясь на этом требовании, мы также можем понять, почему колоночное хранилище стало популярным в последние годы. Поскольку спрос на данные, большие данные, анализ данных, то есть систему онлайн-анализа OLAP (онлайн-аналитическая обработка), увеличился, транзакция записи данных и запрос данных по записи не находятся в ее центре внимания, она фокусируется на фильтрации данных, статистике .
хранилище столбцов
Так же, как и в приведенном выше примере данных, мы смотрим на то, как организовано столбцовое хранение данных.
[
{
"title": "Oriented Column Store",
"author": "Alex",
"publish_time": 1508423456,
"like_num": 1024
},{
"title": "Apache Druid",
"author": "Bob",
"publish_time": 1504423069,
"like_num": 10
},{
"title": "Algorithm",
"author": "Casey",
"publish_time": 1512523069,
"like_num": 16
}
]
Как показано, столбцовое хранилище упорядочивает данные для каждого столбца вместе. Можете ли вы подумать о том, для чего это хорошо? (Пауза 5 секунд)
Да, это хорошо для работы столбца, как мы упоминали выше, чтобы посчитать сумму всех like_num. Процесс будет следующим:
По-прежнему предполагается, что диск может считывать 3 блока данных за раз (фактически считывается в байтах). Видно, что данные организованы по столбцам, и может быть выполнена только 1 дисковая операция.
В мире программирования мы узнали, что за каждый выбор и склонность приходится платить. Пространство для времени, время для пространства, согласованность и доступность уравновешивают друг друга и т. д. У выбора столбчатого хранилища обязательно будут недостатки. Во-первых, это запись данных.
Когда поступает новый фрагмент данных, каждый столбец необходимо сохранить в соответствующем месте. Это требует нескольких операций записи на диск. (Разумеется, в реальной БД не будет ситуации "сжимать" и "перемещать" на рисунке, БД будет организовывать данные разных столбцов в разных местах; для проблемы множественных операций записи большинство СХД пройдет буфер для уменьшения дефицита, вызванного этой ситуацией)
В сравнении
Row-Store | Column-Store |
---|---|
Поскольку данные записываются и считываются построчно, чтение данных часто требует чтения ненужных столбцов. | Можно читать только нужные столбцы |
Легко читать и записывать данные по записи | Запись и чтение данных запись за записью происходит медленнее |
Подходит для систем OLTP | Подходящая система OLAP |
Агрегированные статистические операции, которые не подходят для больших наборов данных | Операции агрегирования данных для больших наборов данных |
Не подходит для сжатия данных | Хорошо подходит для сжатия данных |
Преимущества колоночного хранилища
В зависимости от рангового режима он, естественно, будет иметь следующие преимущества:
-
Автоматическая индексация
Поскольку он основан на хранении столбцов, каждый столбец сам по себе эквивалентен индексу. Таким образом, при выполнении некоторых операций, требующих индекса, нет необходимости в дополнительной структуре данных для создания соответствующего индекса для этого столбца.
-
хорошо подходит для сжатия данных
Компрессия хороша по двум причинам. Во-первых, вы обнаружите, что большая часть мощности данных столбца фактически повторяется.Возьмите приведенные выше данные в качестве примера, поскольку один и тот же автор будет публиковать несколько блогов, мощность всех значений, отображаемых в столбце автора, должна быть меньше, чем количество блогов, поэтому в колонке «На самом деле автор» не нужно хранить такой большой объем данных, как количество блогов; во-вторых, один и тот же тип данных столбца согласован, что способствует оптимизации и сжатию данных заполнение структуры, а для типа данных числовых столбцов более благоприятный алгоритм сжатия хранилища.
Наконец
Шаблон хранилища столбцов теперь распространен во многих аналитических базах данных. А из-за растущего спроса на анализ больших данных все больше и больше традиционных баз данных с хранилищем строк также присоединяются к режиму хранения столбцов.Например, Oracle и Sql Server имеют характеристики хранения столбцов.
Базовое хранилище данных Apache Druid, упомянутое ранее, основано на схеме столбцов. Кому интересно, могут пересмотреть. Кроме того, HBase является относительно репрезентативной базой данных режима хранения столбцов. Если у вас есть время, вы можете рассказать о том, как базовый HBase хранит данные. Вы также можете рассказать о методе сжатия числовых столбцов (вы также можете подумать о том, как сжимать числовые столбцы).
Серия статей:
Начальные знания и выбор базы данных временных рядов (TSDB)
10 минут, чтобы узнать об Apache Druid
Базовый дизайн хранилища Apache Druid
Проектирование кластера и рабочий процесс для Apache Druid
Справочная статья:
https://towardsdatascience.com/the-beauty-of-column-oriented-data-2945c0c9f560
https://dataschool.com/data-modeling-101/row-vs-column-oriented-databases/
Для получения дополнительных знаний, связанных с хранением данных, пожалуйста, обратите внимание на моего публичное число.
В этой статье используетсяmdniceнабор текста