Зачем АНБ создало собственную HBase и как работает Apache Accumulo

Когда требуется хранить терабайты данных в распределённом виде, разработчики на Java обычно вспомнят про Cassandra или Apache HBase. Мало кто знает, что у HBase есть давний сородич с редкой фичей, за которую его и любят в специфических проектах.
В 2008 году Агентство национальной безопасности США столкнулось с задачей: им нужно было хранить колоссальные объёмы информации, но давать доступ к разным ячейкам одной и той же таблицы строго по допускам сотрудников. Существующие NoSQL-решения так делать не умели. В итоге спецслужба написала своё хранилище, а в 2011 году передала его в Apache Software Foundation. Проект назвали Apache Accumulo.
Что под капотом
По своей сути Accumulo — это отсортированная распределённая база данных класса «ключ-значение». Вдохновлена она всё той же известной статьей Google о BigTable.
Данные не лежат на одном диске. В качестве фундамента Accumulo использует Apache Hadoop HDFS для физического хранения файлов и Apache ZooKeeper для управления состоянием кластера и координации.
Если взглянуть на структуру ключа в Accumulo, станет понятно, чем она отличается от простых хранилищ:
- Row ID (идентификатор строки)
- Column Family (семейство колонок)
- Column Qualifier (квалификатор колонки)
- Column Visibility (метка безопасности)
- Timestamp (временная метка)
Именно четвертый компонент, Column Visibility, решает проблему, ради которой проект вообще создавали.
Контроль доступа до последней ячейки
В большинстве баз данных права раздаются на уровне таблиц или колонок. В крайнем случае — отдельных строк. В Accumulo контекст безопасности зашит прямо в каждую ячейку.
Каждая запись содержит метку вроде (ADMIN&SECRET)|TOP_SECRET. Когда клиент отправляет запрос на чтение, он передаёт свои авторизационные токены. Сервер Accumulo сам фильтрует поток данных до того, как отправить его по сети. Если у пользователя нет нужного допуска, он даже не узнает о существовании конкретных ячеек в строке.
Такой подход избавляет от необходимости писать сложную логику фильтрации в коде приложения или разворачивать десятки отдельных таблиц под каждый уровень доступа.
Итераторы: вычисления на стороне сервера
Вторая сильная сторона Accumulo — итераторы. Это серверные плагины на Java, которые встраиваются в цепочку сканирования и сжатия данных.
Итераторы работают непосредственно на узлах хранения (Tablet Servers). Они выполняют сразу несколько задач:
- Фильтруют данные по сложным условиям до отправки клиенту.
- Агрегируют и трансформируют значения на лету.
- Очищают устаревшие версии или удалённые записи во время фонового сжатия файлов (compaction).
С помощью итераторов можно сделать так, чтобы тяжелая аналитическая фильтрация происходила прямо на хранилище. Сеть при этом не забивается сырыми гигабайтами.
Как собрать и запустить
Проект полностью написан на Java. Собирается он стандартным Maven. Команда для сборки тарбола выглядит традиционно:
mvn package -DskipTests
Готовый архив появится по пути assemble/target/accumulo-<version>-bin.tar.gz.
Для локальной разработки можно запустить тестовый экземпляр, но для полноценной эксплуатации придётся поднять рабочий кластер HDFS и ZooKeeper. Потребуется выделить ресурсы и правильно настроить конфиги, так как система рассчитана на распределённое окружение.
Где это пригодится
Поднимать Accumulo ради простого пет-проекта нет смысла. Но система показывает себя с лучшей стороны в следующих сценариях:
- Мультиарендные сервисы. Когда в одной базе хранятся данные разных отделов или клиентов с пересекающимися правами.
- Обработка графов и построение поисковых индексов. Итераторы помогают быстро пересекать множества на стороне сервера.
- Хранение логов и событий телеметрии. Когда запись идёт сплошным потоком, а чтение должно строго ограничиваться ролями пользователей.
Стоит ли связываться
У проекта около 1100 звёзд на GitHub, но за невысокой популярностью скрывается зрелый инструмент с частыми релизами и поддержкой Apache Foundation.
Если вашей системе не требуются метки безопасности на уровне отдельных ячеек или специфическая серверная обработка через итераторы, проще выбрать HBase или Cassandra. У них больше сообщество и проще интеграция с популярными фреймворками. Если же безопасность данных на уровне ячеек стоит во главе угла, альтернатив у Accumulo практически нет.
