Cloud Bigtable 概览

Cloud Bigtable 是稀疏填充的表,可以扩展到数十亿行和数千列,可让您存储 TB 级甚至是 PB 级的数据。每行中都会有一个被编入索引的值;这个值称为行键。Cloud Bigtable 非常适合以非常低的延迟存储大量单键数据。它可以低延迟支持高读写吞吐量,是 MapReduce 操作的理想数据源。

Cloud Bigtable 通过多个客户端库公开给应用,包括适用于 Java 的 Apache HBase 库的受支持扩展程序。因此,它可与开源 Big Data 软件的现有 Apache 生态系统集成在一起。

与自行管理的 HBase 安装相比,Cloud Bigtable 强大的后端服务器具有多项关键优势:

  • 不可思议的可扩缩性。 Cloud Bigtable 的扩缩能力与您集群中的机器数量成正比。自行管理的 HBase 安装存在一个设计瓶颈,在达到特定阈值后会对性能造成限制。Cloud Bigtable 不存在此瓶颈,因此您可以扩展集群以处理更多读取和写入操作。
  • 易于管理。 Cloud Bigtable 可以透明方式处理升级和重启,而且会自动保持高度的数据耐用性。要复制您的数据,只需为您的实例添加第二个集群,然后系统便会自动开始复制。无需管理主实例或区域;只需设计好表的架构,Cloud Bigtable 就会为您处理剩余的操作。
  • 无需停机即可调整集群大小。 您可以增加 Cloud Bigtable 集群的大小,运行几个小时以处理某个大型负载,然后再减小集群,全过程无需停机。更改集群的大小后,负载状态下的 Cloud Bigtable 通常只需几分钟便可使集群中所有节点的性能达到平衡。

适合的场景

如果应用需要非常高的吞吐量和可扩展性来处理非结构化键/值数据,而数据中的每个值通常不超过 10 MB,使用 Cloud Bigtable 非常适合。Cloud Bigtable 还非常适合作为批量 MapReduce 操作、流处理/分析和机器学习应用的存储引擎。

您可以使用 Cloud Bigtable 存储和查询以下所有类型的数据:

  • 时间序列数据,例如多个服务器在一段时间内的 CPU 和内存使用率。
  • 营销数据,例如购买记录和客户偏好设置。
  • 金融数据,例如交易记录、股票价格和货币汇率。
  • 物联网数据,例如来自电表/气表和家用电器的使用量报告。
  • 图表数据,例如有关用户相互间连接方式的信息。

Cloud Bigtable 存储模型

Cloud Bigtable 将数据存储在可大规模扩展的表中,其中每个表都是有序的键/值对映射。该表由行(通常每行描述一个实体)和列(包含每行的各个值)组成。每一行通过一个行键编入索引,而彼此相关的列通常组合在一起形成一个列族。每一列由列族和列限定符(即列族中的唯一名称)的组合来标识。

每个行/列交集可以包含不同时间戳的多个单元格或版本,提供了存储数据随时间如何变化的记录。Cloud Bigtable 表属于稀疏表;如果某一单元格不包含任何数据,则该单元格就不会占用任何空间。

例如,假设您正在为美国总统构建一个社交网络 - 比方说叫做 Prezzy。每位总统都可以关注来自其他总统的帖子。下图显示了一个 Cloud Bigtable 表,它旨在跟踪每位总统在 Prezzy 上所关注的人:

Cloud Bigtable 表(每行对应一个用户名)。

此图中有几点需要注意:

  • 该表包含一个列族,即 follows 族。该族包含多个列限定符。
  • 列限定符被用作数据。 这种设计方案利用了 Cloud Bigtable 表的稀疏性以及可以即时添加新列限定符这一特性。
  • 用户名被用作行键。 假设用户名在字母表中均匀分布,则整个表的数据访问将按合理方式保持一致。请参阅负载平衡以了解 Cloud Bigtable 如何处理不均匀负载,并参阅选择行键以查看有关如何选择行键的更多高级提示。

Cloud Bigtable 架构

下图显示了 Cloud Bigtable 整体架构的简化版本:

Cloud Bigtable 整体架构。

如图所示,所有客户端请求都是先经过前端服务器,然后再发送到 Cloud Bigtable 节点。(在原始 Bigtable 白皮书中,这些节点被称为“片服务器”)。节点以 Cloud Bigtable 集群的形式组织,而集群属于一个 Cloud Bigtable 实例,是用于存放集群的容器。

集群中的每个节点用于处理对该集群的一部分请求。通过向集群添加节点,不但可以增加集群能够同时处理的并发请求数量,还可以提高整个集群的最大吞吐量。如果通过添加第二个集群启用了复制功能,您还可以将不同类型的流量发送到不同的集群,并可在一个集群不可用时故障转移到另一个集群。

Cloud Bigtable 表被分成多个连续的行块(称为片),旨在帮助平衡查询工作负载。(片类似于 HBase 区域。)片以 SSTable 格式存储在 Google 的文件系统 Colossus 上。SSTable 提供了一种持久、有序且不可变的键值对映射,其中键和值都可以是任意的字节字符串。每个片都与特定的 Cloud Bigtable 节点相关联。除 SSTable 文件外,所有写入内容都会在得到 Cloud Bigtable 确认后立即存储到 Colossus 的共享日志中,从而提高了耐用性。

重要的是,数据永远不会存储到 Cloud Bigtable 节点本身;每个节点都有指向 Colossus 中所存储的一组片的指针。因此:

  • 您可以非常快速地将片从一个节点再平衡到另一个节点,因为 Cloud Bigtable 不会复制实际数据,而只是更新每个节点的指针。
  • 您可以非常快速地从 Cloud Bigtable 节点故障中进行恢复,因为只有元数据需要迁移到替代节点。
  • 当 Cloud Bigtable 节点发生故障时,任何数据都不会丢失。

如需详细了解如何使用这些基本组件,请参阅实例、集群和节点

负载平衡

每个 Cloud Bigtable 地区都是由一个主实例进程管理,该进程可使集群内的工作负载和数据量达到平衡。主实例会将较繁忙/较大的片拆分成两半,而将较少访问/较小的片合并在一起,并根据需要在各节点之间重新分配这些片。如果某个片遇到流量高峰,则主实例会先将该片拆分成两部分,然后再将其中一个新片移至另一个节点。Cloud Bigtable 可自动管理所有拆分、合并和再平衡操作,从而为用户省去了手动管理片的工作量。了解 Cloud Bigtable 性能中对此过程进行了详细介绍。

为了使 Cloud Bigtable 达到最佳写入性能,请尽可能均匀地在各节点间分配写入操作,这一点非常重要。实现这一目标的一种方法是按不可预测的顺序使用行键。例如,用户名在整个字母表中的分布往往是大致均匀的,因此将用户名包含在行键的开头位置通常会使写入操作得到均匀分布。

同时,对相关行进行分组以使它们彼此相邻也很有用,这可让您更高效地同时读取多个行。例如,如果您要存储不同类型的天气随时间变化的数据,那么您的行键可以是该数据的收集位置并后跟时间戳(例如 WashingtonDC#201803061617)。这种类型的行键可将来自一个位置的所有数据分组为一定范围的连续行。对于其他位置,所属的行将以不同的标识符开头;如果有多个位置都在以相同速率收集数据,那么写入操作仍然会均匀分布到各片之中。

如需详细了解如何为您的数据选择合适的行键,请参阅选择行键

受支持的数据类型

在大多数情况下,Cloud Bigtable 会将所有数据视为原始字节字符串。唯一需要 Cloud Bigtable 尝试确定类型的情况是增量操作,该操作的目标必须是编码为 8 字节 big-endian 值的 64 位整数。

内存和磁盘使用率

以下部分介绍了几种 Cloud Bigtable 组件对实例的内存和磁盘使用率的影响。

空单元格

Cloud Bigtable 表中的空单元格不会占用任何空间。每一行实质上都是键/值对条目的集合,其中键由列族、列限定符和时间戳组成。如果某行不包含特定键的值,则说明键/值对条目不存在。

列限定符

列限定符会占用行的空间,因为行中使用的每个列限定符会存储在该行中。因此,将列限定符用作数据通常是有效的做法。在上面所示的 Prezzy 示例中,follows 族中的列限定符是受关注用户的用户名;这些列的键/值条目只是一个占位符值。

压缩

Cloud Bigtable 会定期重写您的表以移除已删除的条目,并重新整理数据以提高读写操作的效率。我们将这一过程称为压缩。对于压缩,没有相关的配置设置,因为 Cloud Bigtable 会自动压缩您的数据。

更改和删除

行更改会占用额外的存储空间,因为 Cloud Bigtable 按顺序存储更改且仅定期进行压缩。对表进行压缩时,Cloud Bigtable 会移除不再需要的值。如果您更新某单元格中的值,则原始值和新值都会在磁盘上存储一段时间,直到数据得到压缩为止。

删除也会占用额外的存储空间(至少短期内是这样),因为删除实际上是一种特殊类型的更改。在表得到压缩之前,删除将占用额外的存储空间而不会释放空间。

数据压缩

Cloud Bigtable 采用智能算法自动压缩您的数据。您无法为表配置压缩设置。但一定要了解数据的存储方式,以便高效地压缩数据:

  • 随机数据不能像图案化数据那样有效地压缩。图案化数据包括文本,例如您正在阅读的页面。
  • 当相同值彼此临近时压缩效果最佳(无论这些值是位于相同行还是相邻行)。如果您在排列行键时使具有相同数据块的行彼此相邻,那么数据就可以得到高效压缩。

数据耐用性

当您使用 Cloud Bigtable 时,您的数据将使用 Google 数据中心的存储设备存储在 Colossus 上,这是 Google 提供的一个极为耐用的内部文件系统。您无需运行 HDFS 集群或任何其他文件系统即可使用 Cloud Bigtable。如果您的实例使用了复制功能,Cloud Bigtable 会为实例中的每个集群在 Colossus 中为数据维护一个副本。每个副本都位于不同的地区或区域,进一步提高耐用性。

在后台,Google 会利用专有的存储方法来实现数据耐用性,该方法超出标准 HDFS 三向复制功能所提供的耐用性。另外,我们还会为您的数据创建备份,以应对灾难性事件并提供灾难恢复。

安全

对 Cloud Bigtable 表的访问受您的 Google Cloud Platform 项目以及您为用户分配的 Cloud Identity and Access Management 角色控制。例如,您可以分配 Cloud IAM 角色,针对性地防止特定用户读取表、对表执行写入操作或创建新实例。如果某人无权访问您的项目,或者其 Cloud IAM 角色不具备适当的 Cloud Bigtable 权限,那么他们无法访问您的任何表。

您可以管理项目级层和实例级层的安全性。Cloud Bigtable 不支持表级、行级、列级或单元级的安全限制。

其他存储和数据库选项

Cloud Bigtable 不是关系数据库;它不支持 SQL 查询或联接,也不支持多行事务。此外,它不适合存储小于 1 TB 的数据。

  • 如果您需要为联机事务处理 (OLTP) 系统提供全面的 SQL 支持,请考虑使用 Cloud SpannerCloud SQL
  • 如果您需要在一个在线分析处理 (OLAP) 系统中进行互动式查询,请考虑使用 BigQuery
  • 如果您需要存储大小超过 10 MB 的不可变 blob,例如大型图片或影片,请考虑使用 Cloud Storage
  • 如果您需要将高度结构化的对象存储在文档数据库中,并支持 ACID 事务和类似 SQL 的查询,请考虑使用 Cloud Firestore

如需详细了解其他数据库选项,请参阅数据库服务概览

后续步骤