Radim Marek:谷歌AlloyDB的奇案

Radim Marek:谷歌AlloyDB的奇案

💡 原文英文,约9000词,阅读约需33分钟。
📝

内容提要

AlloyDB是Google基于PostgreSQL协议的企业级HTAP数据库,采用日志即数据库架构,将存储与计算分离。其列式存储引擎可大幅加速分析查询(如TPC-H Q6提速311倍),但VACUUM仍在计算节点运行。AlloyDB Omni是独立产品,仅含查询层功能。ScaNN向量索引体积小、构建快。适合GCP用户处理多TB数据或突发读取场景,但扩展兼容性和治理模式受限。

🔎

延伸解读

兼容性的边界

AlloyDB 的“完全兼容”仅指 PostgreSQL 的线协议和 SQL 方言,底层存储引擎与社区版完全不同。这意味着迁移只需改连接串,但存储内部机制、VACUUM 调度和调优方式均不可控。若依赖 pageinspect 等工具或特定扩展,需提前验证兼容性。

列式存储的适用场景

列式存储对扫描多行但仅取少数列的聚合查询(如 TPC-H Q6)加速显著,但对点查和小表无益,甚至可能拖慢写入。其优势在数据量大、内存不足时体现,且需确保列已驻留内存,否则可能静默失效。

读池的经济性权衡

AlloyDB 读池共享存储,避免复制数据,但计算节点单价更高。对于持续读取且数据量小的情况,Cloud SQL 更便宜;而突发性读取(如业务高峰)时,AlloyDB 的自动扩缩容可降低成本。盈亏平衡点取决于数据量和负载模式。

Omni 与托管版的差异

AlloyDB Omni 仅包含查询层(列式引擎、ScaNN),不提供分布式存储、共享读池等托管特性。它更接近带列式引擎的 PostgreSQL 分支,适合本地测试列式性能,但无法体验存储分离的优势。

Q&A

AlloyDB的“完全兼容PostgreSQL”具体指什么?

AlloyDB的兼容性主要体现在wire protocol层面,即psql、JDBC、ORMs等客户端工具可以无缝连接,迁移时只需更改连接字符串。但底层存储引擎和查询执行器与标准PostgreSQL不同,例如存储格式、WAL机制和VACUUM调度都有所差异。

AlloyDB的“日志即数据库”架构是如何工作的?

AlloyDB将计算与存储分离,计算节点不直接写数据页,而是将WAL日志发送到基于Colossus的分布式存储层。存储层中的日志处理服务(LPS)异步处理日志并更新数据页,计算节点按需从存储层获取页面。因此,数据的持久化形式是日志本身,页面是从日志派生的。

AlloyDB的列式存储引擎在什么情况下能大幅提升查询性能?

列式存储引擎对扫描密集型聚合查询(如TPC-H Q6)提升显著,因为只需读取相关列,避免读取整行数据。例如,Q6查询在SF100规模下从182秒降至0.6秒,提速311倍。但对于点查询和小表查询,列式存储可能没有优势,甚至更慢。

AlloyDB Omni与托管版AlloyDB有何区别?

AlloyDB Omni是可下载的容器镜像,运行在用户自己的基础设施上,它包含列式引擎和ScaNN索引,但不包含托管版的分布式存储、共享存储读池和自动故障转移等功能。Omni使用标准PostgreSQL存储,更接近一个带有列式引擎的PostgreSQL分支。

AlloyDB的读池在什么情况下比Cloud SQL更经济?

读池的共享存储避免了为每个副本复制数据,但计算节点价格更高。对于突发性读取(如业务高峰时段),读池的自动扩缩容可以按需付费,而Cloud SQL需要持续运行副本。当数据量较大且读取模式具有突发性时,读池更经济;对于持续平稳的读取和小数据量,Cloud SQL可能更便宜。

AlloyDB的ScaNN向量索引相比pgvector的HNSW有什么优势?

ScaNN索引在大小和构建时间上优势明显:在10M 1024维向量测试中,ScaNN索引大小为2.6GB,构建时间约6-7分钟,而ivfflat(pgvector)索引大小为76GB,构建时间53分钟。ScaNN的召回率表现未完全验证,但索引大小和构建速度是其亮点。

AlloyDB的跨区域复制支持active-active模式吗?

不支持。AlloyDB最多支持5个跨区域次级集群,但写入始终在主区域,次级集群只读,除非进行故障转移或切换。故障转移可能丢失未确认的WAL,而切换是协调的零丢失操作。因此,AlloyDB不支持多区域写入。

🏷️

标签

➡️

继续阅读