内存中层概览
内存中层级是一种使用专用节点的集群级设置。在阅读本页内容之前,请先了解实例、集群和节点。我们还建议您熟悉一下限制。
Bigtable 内存中是 Bigtable 节点的一个集成内存层,可通过单个 API,根据访问模式和性能需求实现无缝、经济高效的数据分层。借助远程直接内存访问 (RDMA),Bigtable 内存中层可显著缩短响应时间,缓解热点问题,并针对对延迟敏感的数据提供高吞吐量保障。如需了解详情,请参阅了解性能。
何时使用内存中
我们建议您在以下使用情形中启用内存层:
- 亚毫秒级延迟要求:需要读取延迟时间低于 1 毫秒的工作负载,通常通过在数据库前面放置一个自管理缓存解决方案来解决。
- 高吞吐量点读取:对特定数据子集有高读取流量吞吐量要求的应用。
- 热点缓解:高吞吐量工作负载,可能包含特定行键上的流量高峰或热点。
- 成本优化:您希望通过将高读取量分流到更具成本效益的内存层来减少 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) 集群不支持内存中模式。
后续步骤
- 了解如何启用内存中层