>_ DevTrendszh

语言

首页

语言

板块

前端 后端 移动端 DevOps AI / ML 游戏开发 区块链 嵌入式 安全
Java

NSA 为何自建 HBase:Apache Accumulo 工作原理

Apache Accumulo

当你需要以分布式方式存储 TB 级数据时,Java 开发者通常会想到 Cassandra 或 Apache HBase。但很少有人知道,HBase 还有一个更早的"亲戚",它拥有一项罕见的功能,使其在特定项目中备受青睐。

2008 年,美国国家安全局(NSA)面临一个挑战:他们需要存储海量信息,但必须严格根据员工的安全级别来授予对同一表中不同单元格的访问权限。现有的 NoSQL 解决方案无法做到这一点。因此,这个情报机构编写了自己的存储系统,并于 2011 年将其捐赠给 Apache 软件基金会。该项目被命名为 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 Server)上运行。它们同时执行多项任务:

  1. 在将数据发送给客户端之前按复杂条件过滤数据。
  2. 实时聚合和转换值。
  3. 在后台文件压缩期间清理过期版本或已删除的记录。

使用迭代器,你可以让重量级的分析过滤直接在存储层进行。这样,网络就不会被原始 GB 级数据堵塞。

如何构建和运行

该项目完全使用 Java 编写,使用标准 Maven 构建。构建 tarball 的命令如下:

mvn package -DskipTests

构建完成后,压缩包将出现在 assemble/target/accumulo-<version>-bin.tar.gz

对于本地开发,你可以启动一个测试实例,但要进行完整运行,你需要设置一个可用的 HDFS 集群和 ZooKeeper。你需要分配资源并正确配置设置,因为该系统专为分布式环境而设计。

适用场景

为一个简单的个人项目部署 Accumulo 没有意义。但该系统在以下场景中表现出色:

  • 多租户服务。当一个数据库存储来自不同部门或权限重叠的客户端的数据时。
  • 图处理和搜索索引构建。迭代器有助于在服务器端快速交集集合。
  • 存储日志和遥测事件。当写入作为持续流到达,但读取必须严格按用户角色限制时。

是否值得投入

该项目在 GitHub 上约有 11,000 颗星,但在这不起眼的受欢迎程度背后,是一个成熟的工具,拥有频繁的发布和 Apache 基金会的支持。

如果你的系统不需要在单个单元格级别使用安全标签或通过迭代器进行特定的服务器端处理,选择 HBase 或 Cassandra 会更容易。它们拥有更大的社区,与流行框架的集成也更简单。然而,如果数据安全在单元格级别是首要任务,实际上没有比 Accumulo 更好的替代方案。

相关项目