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 性能中对此过程进行了详细介绍。

为了使 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 中存储大于 1 MiB 的值,请先进行压缩。这样可以节省 CPU 周期、服务器内存和网络带宽。如果是大于 1 MiB 的值,Cloud Bigtable 会自动关闭压缩功能。

数据耐用性

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

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

安全

Cloud Bigtable 表的访问权限由您的 Google Cloud 项目以及分配给用户的 Identity and Access Management 角色共同控制。例如,您可以分配 IAM 角色,针对性地防止特定用户读取表、对表执行写入操作或创建新实例。如果某人无权访问您的项目,或者没有适当 Cloud Bigtable 权限的 IAM 角色,则无法访问您的任何表。

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

备份

借助 Cloud Bigtable 备份,您可以保存表的架构和数据的副本,并在以后从备份恢复为新表。备份可以帮助您从应用级数据损坏或运算符错误(例如意外删除表)中恢复。

其他存储和数据库选项

Cloud Bigtable 不是关系型数据库,不支持 SQL 查询、联接或多行事务。

  • 如果您需要为联机事务处理 (OLTP) 系统提供全面的 SQL 支持,请考虑使用 Cloud SpannerCloud SQL
  • 如果您需要在一个在线分析处理 (OLAP) 系统中进行互动式查询,请考虑使用 BigQuery
  • 如果您需要将高度结构化的对象存储在文档数据库中,且支持 ACID 事务和 SQL 类查询,请考虑使用 Firestore
  • 如需以低延迟方式存储内存数据,请考虑使用 Memorystore
  • 如需实时同步用户之间的数据,请考虑使用 Firebase 实时数据库

如需详细了解其他数据库选项,请参阅数据库服务概览。 Google Cloud 还提供了各种存储方案

后续步骤