WiredTiger¶
WiredTiger — это высокопроизводительное программное обеспечение для управления базами данных (СУБД), реализованное в виде движка хранения данных (storage engine). Оно предназначено для эффективного управления записями, чтением и кэшированием данных на диске и в оперативной памяти, поддерживая как транзакционную обработку (OLTP), так и аналитические нагрузки. WiredTiger является движком хранения по умолчанию в MongoDB начиная с версии 3.2, а также используется в других системах (например, в Berkeley DB).
¶История
WiredTiger был разработан компанией WiredTiger Inc., основанной в 2011 году. Основными авторами проекта являются Майкл Кэхилл (Michael Cahill) и Кит Бостик (Keith Bostic), которые ранее работали над Berkeley DB и Sleepycat Software. Первоначально WiredTiger позиционировался как альтернатива традиционным B-деревьям и LSM-деревьям, предлагая гибридный подход к хранению данных.
В 2014 году компания MongoDB Inc. приобрела WiredTiger Inc. и интегрировала движок в свою СУБД MongoDB. Начиная с версии MongoDB 3.2 (2015 год), WiredTiger стал движком хранения по умолчанию, заменив MMAPv1. С тех пор WiredTiger активно развивается в рамках экосистемы MongoDB, но также сохраняет совместимость с другими проектами.
¶Архитектура и ключевые особенности
WiredTiger использует гибридную архитектуру, сочетающую преимущества B-деревьев (B-tree) и LSM-деревьев (Log-Structured Merge-tree). Это позволяет достичь высокой производительности как при случайных, так и при последовательных операциях записи и чтения.
¶Основные компоненты
- B-деревья (B-trees): используются для хранения индексов и данных, поддерживающих быстрый поиск по ключу. WiredTiger реализует собственные B-деревья с оптимизациями для многопоточности и сжатия.
- LSM-деревья (LSM-trees): применяются для сценариев с высокой нагрузкой на запись (write-heavy workloads). Данные сначала записываются в оперативную память (memtable), а затем периодически сливаются на диск в виде отсортированных файлов (SSTables). Это снижает количество операций ввода-вывода и повышает пропускную способность записи.
- Кэш (cache): встроенный механизм кэширования страниц данных в оперативной памяти. Размер кэша конфигурируется и может занимать значительную часть доступной памяти (по умолчанию — 50% от ОЗУ за вычетом 1 ГБ). Кэш использует алгоритм LRU (Least Recently Used) для вытеснения старых страниц.
- Сжатие (compression): WiredTiger поддерживает несколько алгоритмов сжатия данных на уровне страниц: Snappy (быстрое сжатие), Zlib (высокая степень сжатия), Zstandard (Zstd) (баланс скорости и степени сжатия). Сжатие применяется как к данным, так и к индексам.
- Транзакции и ACID: WiredTiger обеспечивает поддержку транзакций с уровнем изоляции snapshot isolation (мгновенный снимок). Это гарантирует согласованность данных при параллельных операциях. Движок использует многоверсионное управление параллелизмом (MVCC) для обработки конфликтов.
- Контрольные точки (checkpoints): WiredTiger периодически создаёт консистентные снимки данных на диске (checkpoints). Это позволяет быстро восстанавливать состояние базы данных после сбоя, не выполняя полное воспроизведение журнала.
¶Журнал предзаписи (WAL)
WiredTiger использует журнал предзаписи (Write-Ahead Log, WAL) для обеспечения долговечности данных. Все изменения сначала записываются в журнал, а затем применяются к основным файлам данных. Это позволяет восстанавливать данные после аварийного завершения работы. Размер и частота сброса журнала настраиваются.
¶Классификация и режимы работы
WiredTiger может работать в двух основных режимах:
- Режим B-дерева (B-tree mode): используется для операций с низкой задержкой чтения и случайного доступа. Подходит для OLTP-нагрузок (обработка транзакций в реальном времени).
- Режим LSM-дерева (LSM-tree mode): оптимизирован для высокой пропускной способности записи, например, при потоковой загрузке данных или ведении логов. В этом режиме периодически выполняется слияние (compaction) SSTables для уменьшения фрагментации.
По умолчанию в MongoDB используется режим B-дерева, но пользователь может переключить коллекцию на LSM-режим, если это необходимо.
¶Применение
¶MongoDB
Основная область применения WiredTiger — это СУБД MongoDB. В MongoDB WiredTiger выполняет функции хранения документов (BSON-объектов) и индексов. Он обеспечивает:
- Сжатие данных на диске (в 2–5 раз по сравнению с MMAPv1).
- Поддержку транзакций с многодокументной атомарностью (начиная с MongoDB 4.0).
- Высокую производительность при параллельных операциях за счёт многопоточности и кэширования.
- Автоматическое восстановление после сбоев.
¶Другие проекты
WiredTiger также используется в качестве встраиваемого движка хранения в Berkeley DB (начиная с версии 12.1) и в некоторых других базах данных, таких как Tarantool (через модуль). Однако основная разработка ведётся в рамках MongoDB.
¶Производительность и оптимизация
WiredTiger демонстрирует высокую производительность в тестах, особенно при больших объёмах данных (терабайты и более). Ключевые факторы, влияющие на производительность:
- Размер кэша: чем больше кэш, тем реже происходят операции ввода-вывода. Рекомендуется выделять не менее 50% доступной памяти.
- Сжатие: использование Snappy или Zstd снижает объём данных на диске и ускоряет чтение, но увеличивает нагрузку на процессор.
- Параллелизм: WiredTiger поддерживает до 64 потоков для одновременной обработки запросов.
- Контрольные точки: частота создания контрольных точек влияет на время восстановления и производительность записи.
¶Критика и ограничения
Несмотря на преимущества, WiredTiger имеет некоторые ограничения:
- Потребление памяти: по умолчанию WiredTiger может занимать до 50% ОЗУ, что может быть проблемой для систем с ограниченной памятью.
- Сложность настройки: для достижения оптимальной производительности требуется тонкая настройка параметров (размер кэша, частота контрольных точек, алгоритм сжатия).
- Фрагментация: в режиме LSM-дерева со временем может возникать фрагментация, требующая периодического слияния (compaction).
- Восстановление после сбоя: при внезапном отключении питания восстановление может занять значительное время, особенно при большом размере журнала.
¶Интересные факты
- WiredTiger написан на языке C и использует собственную библиотеку для работы с памятью и файлами.
- Название «WiredTiger» происходит от прозвища одного из основателей — Кита Бостика, которого коллеги называли «Wired Tiger» за его энергичность и увлечённость разработкой.
- WiredTiger поддерживает работу с файлами размером до 16 эксабайт (2^64 байт).
¶Источники
- Официальная документация MongoDB: «WiredTiger Storage Engine» (MongoDB Manual).
- Документация WiredTiger: «WiredTiger Storage Engine Overview» (WiredTiger GitHub).
- Статья «MongoDB WiredTiger: A Deep Dive» (MongoDB Blog, 2015).
- Книга «MongoDB: The Definitive Guide» (O'Reilly Media, 2019).
- Исходный код WiredTiger (репозиторий на GitHub, MongoDB Inc.).
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →


