Открыть сервис

Bw-tree

Bw-tree — это структура данных, относящаяся к классу сбалансированных деревьев поиска, разработанная для работы в многопоточных средах и оптимизированная для использования в современных кэш-иерархиях процессоров. В отличие от традиционных деревьев (например, B-tree), Bw-tree не изменяет узлы на месте, а использует технику обновлений на основе дельта-записей (delta records) и принципы копирования при записи (copy-on-write), что обеспечивает высокую конкурентность и производительность при низких накладных расходах на синхронизацию.

История

Bw-tree была впервые предложена в 2011 году исследователями из Microsoft Research Джастином Левинсоном, Дэвидом Лометом и другими. Разработка была направлена на создание индексной структуры, эффективно работающей на многоядерных процессорах с неоднородным доступом к памяти (NUMA) и системами флэш-памяти (SSD). Первое описание было опубликовано в работе «The Bw-Tree: A B-tree for New Hardware Platforms» в 2013 году. В отличие от многих предшествующих структур, Bw-tree не требует блокировок и не использует латч (lock), что уменьшает конкуренцию между потоками.

Технические предпосылки. В 2010-х годах рост числа ядер в процессорах и распространение SSD с быстрым последовательным доступом, но ограниченными операциями записи, потребовали пересмотра традиционных подходов к индексации. Bw-tree стала одной из первых реализаций, адаптированных к этим условиям.

Принцип работы и архитектура

Bw-tree представляет собой дерево, состоящее из узлов, которые хранят пары ключ-значение. Основные принципы, отличающие её от B-tree, включают:

Структура узлов

Каждый физический узел Bw-tree состоит из двух частей:

  1. Базовый узел (base node) — неизменяемая копия полного набора пар ключ-значение.
  2. Цепочка дельта-записей (delta chain) — последовательность записей, каждая из которых содержит тип операции (вставка, удаление, разделение, слияние) и данные изменения. Цепочка строится от последнего изменения к началу: новая дельта добавляется в начало.

Процесс работы

При выполнении операций вставки или удаления потоки конкурируют не за изменение узла, а за добавление новой дельта-записи в начало цепочки. Операция CAS применяется к указателю на голову цепочки, что позволяет выполнять изменения без взаимной блокировки. Если CAS обнаруживает, что цепочка уже была изменена другим потоком, поток повторяет попытку с новым указателем.

Разделение (split) или слияние (merge) узлов, характерные для B-tree, также реализуются с помощью дельта-записей, но без блокировок. Например, при разделении создаётся новый узел, содержащий половину ключей, а в родительский узел добавляется дельта, отражающая это изменение.

Преимущества и недостатки

Преимущества Bw-tree:

Недостатки и ограничения:

Сравнение с другими структурами

ХарактеристикаBw-treeB-treeLSM-дерево
КонкурентностьВысокая (без блокировок)Средняя (блокировки)Высокая (компактизация)
Скорость вставки (в среднем)ВысокаяУмереннаяВысокая
Скорость поиска (в среднем)ВысокаяВысокаяУмеренная (много уровней)
Управление памятьюРазделение на дельты и базовые узлыПрямое изменениеКомпактизация и слияние
Адаптация к SSDДаЧастичноДа

Применение

Bw-tree нашла применение в системах управления базами данных (СУБД) и других компонентах, где требуется высокая производительность индексирования в многопоточных средах:

Интересные факты

Критика

Некоторые исследователи отмечают, что Bw-tree не всегда оправдывает ожидания на традиционных жёстких дисках (HDD) из-за частых последовательных операций чтения дельта-цепочек, которые ухудшают производительность при случайном доступе. Кроме того, сложность поддержки дельта-цепей при сбоях (консистентность при крахе) остаётся проблемой, требующей дополнительных механизмов — таких как журналирование.

Источники

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →