Bigtable 概览
Bigtable 是一种以稀疏方式填充的表,可以扩展到数十亿行和数千列,支持您存储 TB 级甚至是 PB 级的数据。每行中都会有一个被编入索引的值;这个值称为行键。Bigtable 非常适合以低延迟方式存储大量单键数据。它可以低延迟地支持高读写吞吐量,是 MapReduce 操作的理想数据源。
Bigtable 通过多个客户端库公开给应用,包括适用于 Java 的 Apache HBase 库的受支持扩展程序。因此,它可与开源大数据软件的现有 Apache 生态系统集成在一起。
与自行管理的 HBase 安装相比,Bigtable 强大的后端服务器具有多项关键优势:
- 超高扩缩能力。Bigtable 的扩缩能力与集群中的机器数成正比。自行管理的 HBase 安装存在一项设计瓶颈,在达到特定阈值后会对性能造成限制。Bigtable 不存在此瓶颈,因此您可以扩展集群以处理更多读取和写入操作。
- 易于管理。Bigtable 可以透明方式处理升级和重启,而且会自动保持高度的数据耐用性。如需复制您的数据,请为您的实例添加第二个集群,系统便会自动开始执行复制操作。无需管理副本或区域;只需设计好表的架构,Bigtable 就会为您处理剩余的操作。
- 无需停机即可调整集群大小。您可以扩大 Bigtable 集群,运行几个小时以处理某个大型负载,然后再缩减集群,整个过程中无需停机。更改集群的大小后,负载状态下的 Bigtable 通常只需几分钟便可使集群中所有节点的性能达到平衡。
适合的场景
如果应用需要非常高的吞吐量和可伸缩性来处理键值数据,而数据中的每个值通常不超过 10 MB,那么使用 Bigtable 将非常适合。Bigtable 还非常适合作为批量 MapReduce 操作、流处理/分析和机器学习应用的存储引擎。
您可以使用 Bigtable 来存储和查询以下所有类型的数据:
- 时间序列数据,例如多个服务器在一段时间内的 CPU 和内存使用率。
- 营销数据,例如购买记录和客户偏好设置。
- 金融数据,例如交易记录、股票价格和货币汇率。
- 物联网数据,例如来自电表和家用电器的使用量报告。
- 图表数据,例如有关用户相互间连接方式的信息。
Bigtable 存储模型
Bigtable 将数据存储在可大规模扩展的表中,其中每个表都是有序的键值对映射。该表由行(通常每行描述一个实体)和列(包含每行的各个值)组成。每行通过一个行键编入索引,而彼此相关的列通常会被分组为一个列族。每列由列族和列限定符(即列族中的唯一名称)的组合来标识。
行和列的每个交叉点都可以包含多个单元格。每个单元包含相应行和列的带时间戳的唯一版本数据。在列中存储多个单元格可提供相应行和列的已存储数据如何随时间的推移而变化的记录。Bigtable 表属于稀疏表;如果特定行中未使用某列,则该列就不会占用任何空间。
此图中有几点需要注意:
- 行中可以不使用列。
- 给定行和列中的每个单元都有一个唯一的时间戳 (t)。
Bigtable 架构
下图显示了 Bigtable 整体架构的简化版本:
如图所示,所有客户端请求都是先经过前端服务器,然后再发送到 Bigtable 节点。(在原始 Bigtable 白皮书中,这些节点被称为“片服务器”。)这些节点组织成一个 Bigtable 集群,而这个集群属于一个 Bigtable 实例(也称为集群的容器)。
集群中的每个节点会处理对该集群的一部分请求。通过向集群添加节点,不但可以增加集群能够同时处理的并发请求数量,而且还会提高集群的吞吐量上限。如果通过添加额外的集群来启用复制功能,您还可以将不同类型的流量发送到不同的集群。然后,如果一个集群不可用,您可以故障转移到另一个集群。
Bigtable 表被分成多个连续的行块(称为片),旨在帮助平衡查询工作负载。(片类似于 HBase 区域。)片以 SSTable 格式存储在 Google 的文件系统 Colossus 上。SSTable 提供了一种持久、有序且不可变的键值对映射,其中键和值都可以是任意的字节字符串。每个分块都与特定的 Bigtable 节点相关联。除 SSTable 文件外,所有写入内容都会在得到 Bigtable 确认后立即存储到 Colossus 的共享日志中,从而提高了耐用性。
重要的是,数据永远不会存储到 Bigtable 节点本身;每个节点都有指向 Colossus 中所存储的一组片的指针。因此:
- 您可以非常快速地将分块从一个节点再平衡到另一个节点,因为 Bigtable 不会复制实际数据,Bigtable 会更新每个节点的指针。
- 您可以非常快速地从 Bigtable 节点故障中进行恢复,因为只有元数据必须迁移到替代节点。
- 当 Bigtable 节点发生故障时,任何数据都不会丢失。
如需详细了解如何使用这些基本组件,请参阅实例、集群和节点。
负载平衡
每个 Bigtable 区域都是由一个主实例进程管理,该进程可使集群内的工作负载和数据量达到平衡。此进程会将较繁忙或较大的分块拆分成两半,而将较少访问/较小的分块合并在一起,并根据需要在各节点之间重新分配这些分块。如果某个片遇到流量高峰,Bigtable 会先将该片拆分成两部分,然后再将其中一个新片移至另一个节点。Bigtable 可自动管理拆分、合并和再平衡操作,从而节省了手动管理片的工作量。了解性能部分详细介绍了此过程。
为了使 Bigtable 达到最佳写入性能,请尽可能均匀地在各节点间分配写入操作,这一点非常重要。实现这一目标的一种方法是按不可预测的顺序使用行键。例如,用户名在整个字母表中的分布往往是大致均匀的,因此将用户名包含在行键的开头位置通常会使写入操作得到均匀分布。
同时,对相关行进行分组以使它们彼此相邻也很有用,这可让您更高效地同时读取多个行。例如,如果您要存储一段时间内不同类型的天气数据,您可以在行键中依次添加收集了这些数据的位置和时间戳(例如 WashingtonDC#201803061617
)。这种类型的行键会将来自一个位置的所有数据组织成连续范围的行。对于其他位置,所属的行将以不同的标识符开头;如果有多个位置都在以相同速率收集数据,那么写入操作仍然会均匀分布到各片之中。
如需详细了解如何为您的数据选择合适的行键,请参阅选择行键。
受支持的数据类型
在大多数情况下,Bigtable 会将所有数据视为原始字节字符串。Bigtable 只有在执行增量操作时才会尝试确定类型,在这种情况下,目标必须是编码为 8 字节 big-endian 值的 64 位整数。
内存和磁盘使用率
以下部分介绍了几种 Bigtable 组件对实例的内存和磁盘使用率的影响。
未使用的列
未在 Bigtable 行中使用的列不会占用该行中的任何空间。每一行实质上都是键值对条目的集合,其中键由列族、列限定符和时间戳组成。如果某行不包含特定列的值,则说明键值对条目不存在。
列限定符
列限定符会占用行的空间,因为行中使用的每个列限定符会存储在该行中。因此,将列限定符用作数据通常是有效的做法。
如需详细了解列限定符,请参阅列。
压缩
Bigtable 会定期重写您的表以移除已删除的条目,并重新整理数据以提高读写操作的效率。我们将这一过程称为压缩。对于压缩,没有相关的配置设置,因为 Bigtable 会自动压缩您的数据。
变更和删除
行更改会占用额外的存储空间,因为 Bigtable 按顺序存储更改且仅定期进行压缩。对表进行压缩时,Bigtable 会移除不再需要的值。如果您更新某单元格中的值,则原始值和新值都会在磁盘上存储一段时间,直到数据得到压缩为止。
删除也会占用额外的存储空间(至少短期内是这样),因为删除实际上是一种特殊类型的更改。在表得到压缩之前,删除将占用额外的存储空间而不会释放空间。
数据压缩
Bigtable 采用智能算法自动压缩您的数据。您无法为表配置压缩设置。但是,了解如何存储数据以便高效地进行压缩是很有用的:
- 随机数据不能像图案化数据那样有效地压缩。 规律性数据包括文本,例如您正在阅读的页面。
- 当相同值彼此临近时压缩效果最佳(无论这些值是位于相同行还是相邻行)。如果您在排列行键时使具有相同数据块的行彼此相邻,那么数据就可以得到高效压缩。
- Bigtable 会压缩大小不超过 1 MiB 的值。 如果您存储的值大于 1 MiB,请先对其进行压缩,然后再将其写入 Bigtable,以节省 CPU 周期、服务器内存和网络带宽。
数据耐用性
当您使用 Bigtable 时,您的数据将使用 Google 数据中心的存储设备存储在 Colossus 上,这是 Google 提供的一个极为耐用的内部文件系统。您无需运行 HDFS 集群或任何其他文件系统即可使用 Bigtable。在后台,Google 利用专有的存储方法来实现数据耐用性,并高于标准 HDFS 三向复制功能所提供的耐用性。
使用复制功能时,耐用性会进一步提高。Bigtable 会在您选择的位置为复制实例的每个集群保留一份单独的数据副本。
一致性模型
单集群 Bigtable 实例可提供强一致性。默认情况下,具有多个集群的实例提供最终一致性,但对于某些用例,这些实例可以配置为提供读己所写一致性或强一致性,具体取决于工作负载和应用配置文件设置。
安全
对 Bigtable 表的访问权限通过您的 Google Cloud 项目以及您分配给用户的 Identity and Access Management (IAM) 角色控制。例如,您可以分配 IAM 角色,针对性地防止特定用户读取表、对表执行写入操作或创建新实例。如果某人无权访问您的项目,或者没有适当 Bigtable 权限的 IAM 角色,则无法访问您的任何表。
您还可以通过创建表的已获授权视图(表示表数据的子集)来控制对表数据的访问权限。然后,您可以向部分用户授予已获授权的视图级权限,而无需向他们授予表级权限。
您可以在项目级、实例级、表级或已获授权的视图级管理安全性。Bigtable 不支持行级、列级或单元格级的安全限制。
加密
默认情况下,存储在 Google Cloud 中的所有数据(包括 Bigtable 表中的数据)都会使用我们用于自己的加密数据的同一强化密钥管理系统进行静态加密。
如果您希望更好地控制用于静态加密 Bigtable 数据的密钥,您可以使用客户管理的加密密钥 (CMEK)。
备份
借助 Bigtable 备份,您可以保存表架构和数据的副本,并可在以后通过该副本将内容恢复到一个新表中。使用备份及备份副本,无论源表位于何处,您都可以在包含 Bigtable 实例的任何区域或项目中将内容恢复到一个新表中。
变更数据捕获
Bigtable 以变更数据流的形式提供变更数据捕获 (CDC)。借助变更数据流,您可以在发生更改时捕获数据并将数据更改流式传输到表中。您可以使用 Dataflow 等服务来读取变更数据流,以支持数据分析、审核、归档要求和触发下游应用程序逻辑等用例。如需了解详情,请参阅变更数据流概览。
使用应用配置文件来请求路由
通过应用配置文件路由政策,您可以控制哪些集群将处理从应用传入的请求。路由政策包括如下选项:
- 单集群路由:将所有请求发送到单个集群。
- 多集群路由到任何集群:将请求发送到实例中最近的可用集群,包括以下选项:
- 任何集群:实例中的任何集群都可以接收请求。
- 集群组路由:实例中的指定集群组可以接收请求。
其他存储和数据库选项
Bigtable 不是传统的关系型数据库。虽然它支持 SQL 查询,但某些用例可能更适合使用其他数据库选项。
- 如果您需要在一个在线分析处理 (OLAP) 系统中进行互动式查询,请考虑使用 BigQuery。
- 如果您必须将高度结构化的对象存储在文档数据库中,且支持 ACID 事务和 SQL 类查询,请考虑使用 Firestore。
- 如需以低延迟方式存储内存数据,请考虑使用 Memorystore。
- 如需实时同步用户之间的数据,请考虑使用 Firebase Realtime Database。
如需详细了解其他数据库选项,请参阅数据库服务概览。 Google Cloud 还提供了各种存储方案。
后续步骤
- 使用 Bigtable 命令行工具
cbt
CLI 尝试 Bigtable 快速入门。 - 浏览 Bigtable Codelab。
- 详细了解 Bigtable 实例、集群和节点。
- 了解如何创建 Bigtable 实例。
- 了解 Cloud Bigtable 的客户端库。
- 阅读关于 Bigtable 的原始 OSDI 论文。