内存中层概览

内存中层级是一种使用专用节点的集群级设置。在阅读本页内容之前,请先了解实例、集群和节点。我们还建议您熟悉相关限制

Bigtable 内存中层是 Bigtable 节点的一个集成内存层,可通过单个 API 实现基于访问模式和性能需求的无缝、经济高效的数据分层。借助远程直接内存访问 (RDMA),Bigtable 内存中层可显著缩短响应时间,缓解热点问题,并针对对延迟敏感的数据提供高吞吐量保障。如需了解详情,请参阅了解性能

何时使用内存中层

我们建议您在以下使用情形中启用内存层:

  • 亚毫秒级延迟时间要求:需要读取延迟时间低于 1 毫秒的工作负载,通常通过在数据库前面放置一个自管理的缓存解决方案来解决。
  • 高吞吐量点读取:对特定数据子集有高读取流量吞吐量要求的应用。
  • 热点缓解:吞吐量较高的工作负载,可能包含特定行键上的流量高峰或热点。
  • 成本优化:您希望通过将高读取量分流到更具成本效益的内存层来减少 Bigtable 节点数。

内存中层的工作原理

内存层支持由混合存储节点提供。这些专用节点扩展了 Bigtable 的计算和存储分离,以纳入具有垂直可伸缩吞吐量的内存层。Bigtable 最长可能需要 30 分钟才能预配专用内存层节点。在此期间,Bigtable 会继续从持久性存储空间提供流量。

您可以在集群级层启用内存中层

内存中层的工作方式如下:

  • 获取内存层中的数据:内存层提供直读缓存行为。通过您为内存中层配置的应用配置文件,包含读取操作的行会进入内存中层。如果行数据已位于内存中层,则任何应用配置文件的写入操作都会更新内存中层。
  • 逐出和失效政策:内存层使用行级最近最少使用 (LRU) 逐出和 15 分钟的存留时间 (TTL) 失效政策。
  • 负缓存:内存中层会记住资源是否在一段时间内缺失,以防止后端过载。
  • 安全性:内存中层支持静态加密和传输中加密 (TLS)。
  • 复制:在多集群实例中,不同集群的内存层级不同步。由于每个内存层会根据其接收的读取流量独立确定要将哪些数据加载到内存中,因此不同的集群可能会在其内存层中保存不同的行键。 Bigtable 会从本地集群的 SSD 层将数据加载到内存中。写入某一行最终会更新该行所在的所有内存层,遵循的是最终一致性的标准 Bigtable 复制模型。
  • 纵向自动扩缩:内存中层支持节点级纵向自动扩缩,可与 Bigtable 自动扩缩功能协同工作。

内存中层级经过优化,可实现对当前数据的高性能访问。为了保持这种性能,内存层中仅驻留行的最新时间戳版本。对较早版本数据的请求(也称为历史单元格)会自动绕过内存层,并从永久性存储空间提供。

数据一致性

Bigtable 可确保内存中层数据与 SSD 或非频繁访问存储层中的持久性数据保持一致。这种混合架构使 Bigtable 能够在所有存储层中提供一致的存储模型,从而让您能够通过相同的语义接口访问数据,无论数据是实际存储在 RAM 中还是持久性存储空间中。启用 Bigtable 内存中层后,您可以在集群级保持读己所写一致性。

纵向扩缩

启用内存中层后,每个节点都可以使用纵向伸缩来修改其内存中层吞吐量容量。每个节点都包含 8 GB 的 RAM(用于内存中层),并且初始基本容量为每秒 40,000 次读取。为了应对点读取流量的激增,节点可以自动扩缩,每次扩缩的增量为每秒 4 万次读取,每个节点最多可达到每秒 12 万次读取。

此纵向伸缩功能与 Bigtable 自动伸缩功能集成。如果集群中所有节点的内存中层容量都达到上限,并且自动扩缩处于活跃状态,Bigtable 会自动预配更多节点,以进一步提升内存中层吞吐量。

节点上的纵向伸缩仅适用于内存中层每秒读取次数,无论是否启用集群级自动伸缩,它都能正常运行。如果垂直伸缩超出每秒 40,000 次读取的基本限制,则需将节点的小时费用乘以一个系数。如需了解详情,请参阅价格限制

限制

内存层存在以下限制:

  • 内存中层需要 SSD 存储空间。
  • 内存层级仅支持单行级点读取操作。
  • 内存层不提供数据扫描服务,也不支持 SQL 查询。
  • 内存中层应用配置文件仅支持单集群路由。
  • 内存中层将每行键的行大小限制为 1 MiB。Bigtable 从持久性存储空间读取超出此限制的行。
  • 内存中层需要使用 Java 版 Bigtable 客户端库 2.77.0 或更高版本,或者 BOM 26.80.0 或更高版本。不支持其他客户端库。
  • 客户管理的加密密钥 (CMEK) 集群不支持内存中层。

后续步骤