NSAが独自のHBaseを構築した理由とApache Accumuloの動作原理

分散的にペタバイト規模のデータを保存する必要がある場合、Java開発者は通常CassandraやApache HBaseを思い浮かべます。しかし、HBaseには特定のプロジェクトで愛される希少な機能を持つ古い同胞が存在することを知っている人は少ないです。
2008年、米国家安全保障局(NSA)は課題に直面しました。膨大な量の情報を保存する必要がある一方で、同じテーブルの異なるセルへのアクセスを従業員らのセキュリティクリアランスレベルに基づいて厳密に許可する必要がありました。既存の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(タイムスタンプ)
4番目のコンポーネントであるColumn Visibilityこそ、このプロジェクトが最初に作成された問題を解決するものです。
セルレベルのアクセス制御
ほとんどのデータベースでは、権限はテーブルレベルまたはカラムレベルで付与されます。極端な場合——個別の行レベルです。Accumuloでは、セキュリティコンテキストが各セルに直接埋め込まれています。
各レコードには(ADMIN&SECRET)|TOP_SECRETのようなラベルが含まれています。クライアントが読み取りリクエストを送信すると、認証トークンを渡します。Accumuloサーバーはネットワークに送信する前に 자체的にデータストリームをフィルタリングします。必要なクリアランスを持っていないユーザーは、行内の特定のセルの存在すら知ることはできません。
このアプローチにより、アプリケーションコードで複雑なフィルタリングロジックを記述したり、各アクセスレベルごとに десятокの別テーブルを展開したりする必要がなくなります。
イテレータ:サーバーサイド計算
Accumuloの2番目の強みはイテレータです。これらはデータスキャンとコンパクションのチェーンに埋め込まれるサーバーサイドのJavaプラグインです。
イテレータはストレージノード(Tablet Server)で直接実行されます。同時にいくつかのタスクを実行します:
- クライアントに送信する前に複雑な条件に基づいてデータをフィルタリングする。
- オンザフライで値を集計して変換する。
- バックグラウンドのファイルコンパクション中に古いバージョンや削除されたレコードをクリーンアップする。
イテレータを使用すると、重い分析フィルタリングをストレージレイヤーで直接実行できます。これにより、ネットワークが生のギガバイトのデータで詰まることがなくなります。
ビルドと実行方法
このプロジェクトは完全にJavaで書かれています。Mavenでビルドします。tarballをビルドするコマンドは次のとおりです:
mvn package -DskipTests
準備ができたアーカイブはassemble/target/accumulo-<version>-bin.tar.gzに生成されます。
ローカル開発にはテストインスタンスを起動できますが、本格的な運用には動作するHDFSクラスターとZooKeeperをセットアップする必要があります。システムは一貫して分散環境を前提に設計されているため、リソースを適切に割り当てて設定を行う必要があります。
活用場面
単純なペットプロジェクトにAccumuloを展開しても意味はありません。しかし、このシステムは以下のようなシナリオでその真価を発揮します:
- マルチテナントサービス。異なる部署やクライアントのデータを1つのデータベースに保存し、アクセス許可が重複している場合。
- グラフ処理と検索インデックス構築。イテレータがサーバー側でセットを迅速に交差させるのに役立つ。
- ログやテレメトリイベントの保存。書き込みが連続的なストリームとして来るが、読み取りはユーザーの役割に基づいて厳密に制限する必要がある場合。
取り組む価値があるか
このプロジェクトはGitHubで約11,000のスターを持っていますが、地味な人気にもかかわらず、頻繁なリリースとApache Foundationのサポートを備えた成熟したツールです。
システムで個々のセルレベルでのセキュリティラベルやイテレータを通じた特定のサーバーサイド処理が必要ない場合は、HBaseやCassandraを選択する方が簡単です。これらはより大きなコミュニティを持ち、一般的なフレームワークとの統合も簡単です。しかし、セルレベルでのデータセキュリティが最優先事項であれば、Accumuloの代替はほとんど存在しません。
関連プロジェクト