在单体数据库长期占据主流的年代,PostgreSQLMySQL 以及 Oracle 等传统关系型数据库管理系统(RDBMS)的架构设计,几乎都建立在单台高性能物理服务器上的纵向扩展(Scale-up)模型之上。然而,随着现代互联网应用数据量的爆发式增长、全球化部署需求的提升以及微服务架构的普及,单机扩展的硬件天花板与高昂成本,推动整个数据库行业不可逆转地走向横向扩展(Scale-out)架构。

早期的 NoSQL 数据库,如 CassandraMongoDB,虽然以键值对或文档的形式解决了横向扩展与数据分片问题,但这种能力往往以牺牲关系型数据库最核心的事务强一致性(ACID)、复杂关联查询(Join)以及标准 SQL 支持为代价。随后,Google Spanner 的出现标志着分布式 SQLDistributed SQL)时代真正到来,但它对专有硬件(TrueTime 原子钟)的依赖,以及对传统开源 SQL 生态兼容性的不足,仍为开源社区留下了巨大的技术空白。

为什么需要另外一种数据库

在这一技术演进的十字路口,Yugabyte 的首席工程师 Hari Krishna Sunder 提出了一条清晰的破局路径:通过彻底重构底层存储与共识机制,打造一个在全球分布式环境下依然完全兼容 PostgreSQL 的现代数据库 YugabyteDB。本文将基于这场深入的技术分享,结合分布式系统的底层原理与相关技术资料,系统剖析 YugabyteDB 的核心架构设计、数据分片策略、算子下推优化、高并发连接管理机制,以及其面向生成式人工智能(GenAI)工作负载的 Vector LSM 存储引擎。

架构重构:无状态查询层与强一致性存储层的解耦

构建一个从零开始的分布式 SQL 数据库,最艰难的挑战并不只是实现分布式共识,而是如何完整复刻传统 RDBMS 中经过数十年打磨的复杂 SQL 引擎。PostgreSQL 拥有庞大而成熟的代码库,涵盖抽象语法树(AST)解析器、基于成本的优化器(CBO)、执行器,以及大量针对边界场景的特殊处理逻辑。如果选择从头重写一套兼容 API,不仅工程量极为庞大,也很难在语义层面做到与原生数据库完全一致。

YugabyteDB 分层架构

YugabyteDB 采用了典型的两层分层架构:上层完整复用并深度适配 PostgreSQL 的查询层核心代码,保留其成熟的 SQL 语义、类型系统与生态兼容性;底层则替换为自研的分布式存储引擎 DocDB,基于 Raft 一致性协议与 LSM-Tree 结构,专为云原生分布式环境设计,实现水平扩展与强一致持久化。这一工程取舍既继承了 PostgreSQL 的生态优势,又通过分布式存储层解决了传统单机 PostgreSQL 的扩展性瓶颈。

无状态的 YSQL 查询引擎与分布式路由

PostgreSQL 兼容性

在上述架构中,YugabyteDB 的查询层 YSQL 不只是“接口兼容” PostgreSQL,而是直接运行了 PostgreSQL 的大量 C 语言源代码。这个设计带来的直接收益是:应用开发者无需修改业务代码、无需更换 ORM 框架(如 HibernateSQLAlchemyPrisma),也无需替换数据库驱动,便可将原本依赖单体数据库的应用较为平滑地迁移到分布式环境。

更关键的是,查询层在集群中每个节点上都以完全无状态(Stateless)的方式运行。当客户端通过标准 TCP 协议连接到任意一个物理节点时,该节点会在逻辑上充当当前查询的协调者(Coordinator)。它负责接收 SQL 文本,驱动原生解析器生成抽象语法树,并交由查询规划器生成逻辑执行计划。而在物理执行阶段,由于底层数据已被打散并分布在整个集群中,协调者还必须承担分布式路由职责,将计算子任务精准地下发到实际持有对应数据分片的远端存储节点。

DocDB:基于 RocksDBRaft 协议的分布式存储底座

承接上层复杂计算逻辑的,是底层存储与并发控制引擎 DocDB。这是一个构建在高度定制化 RocksDB 之上的分布式键值与文档存储系统。在单机节点层面,DocDB 采用基于日志结构合并树(Log-Structured Merge-treeLSM)的存储架构。数据被组织在内存中的 MemTable 以及持久化到磁盘上的多个排序字符串表(Sorted String TablesSSTables)中。面对海量高并发写入时,LSM 树通过将随机写转化为顺序追加写,显著提升了磁盘 I/O 吞吐量;后台运行的压缩(Compaction)线程则持续合并 SSTables,以回收由更新和删除操作产生的冗余空间,并维持读取效率。

但单机性能远远不够。为了在由商用硬件构成的分布式集群中提供高容错与强一致性,DocDB 借鉴了类似 Google Spanner 的架构思想,同时避免了对昂贵原子钟硬件的依赖。它通过几项关键机制的组合,实现了全局可串行化(Serializable)的一致性语义。

第一,Raft 分布式共识协议。整个集群中的数据会被细粒度地切分为大量逻辑分片(Tablets)。每个分片都不是孤立存在的,而是作为一个独立的 Raft 共识组进行多副本复制。在任意时刻,每个 Raft 组都会通过心跳机制选出一个领导者(Leader),所有写请求以及要求强一致性的读请求都必须路由到该 LeaderLeader 在接收到写入请求后,需要先将操作日志同步到多数派(Majority)副本,并在收到确认后,才能将数据真正提交到底层 LSM 树并向客户端返回成功。这一机制保证了即便少数节点发生故障,只要多数派仍然存活,系统就不会丢失已提交数据,并能在较短时间内完成自动故障切换。相关实现思路可参考 DocDB Raft 设计说明

第二,混合逻辑时钟(HLC)与多版本并发控制(MVCC。在缺少全局物理原子钟的分布式网络中,跨分片事务顺序的协调是一个核心难题。DocDB 通过引入混合逻辑时钟(Hybrid Logical ClocksHLC),结合本地物理时钟的推进性与逻辑时钟(Lamport Clocks)的因果关系保证,为每次写入分配一个基于 HLC 计算的单调递增时间戳。这些时间戳被编码到底层键值对中,从而原生支持多版本并发控制(MVCC)。借助这一机制,数据库在高并发读写场景下能够为只读事务提供全局一致的快照隔离(Snapshot Isolation),实现“读不阻塞写,写不阻塞读”。

第三,高度优化的行打包(Packed Rows)格式。为进一步提升存储效率,DocDB 引入了优化后的行存储格式。传统模型中,一行数据的多个列可能会被拆分为多个独立键值对存储,从而带来显著的元数据开销。通过行打包技术,整行关系型数据可以被编码为一个紧凑的文档结构并存储在单一键下,不仅显著降低了磁盘占用,也减少了单行重组时的 CPU 开销。

数据分片与路由拓扑:应对复杂工作负载的存储策略

在分布式关系型数据库的设计中,如何将海量表数据均匀且高效地分布到整个物理集群,是决定系统水平扩展能力、避免资源倾斜以及消除性能热点(Hotspots)的核心问题。在 YugabyteDB 的架构中,表会被逻辑切分为多个称为 Tablets 的微型数据分片。系统后台的协调服务(YB-Master)会根据节点的 CPU、磁盘和网络负载,持续且透明地执行分片迁移与领导者平衡(Leader Balancing)操作,以确保读写压力在整个拓扑中尽可能均匀地分布。

数据行究竟应该映射到哪个 Tablet 中,是整个系统设计的关键。Hari Krishna Sunder 在分享中重点分析了三种不同的分片策略,并说明了它们在不同工作负载下的工程权衡。

下表总结了三种核心分片技术的实现原理、适用场景以及局限性:

分片策略(Sharding Strategy底层映射原理与实现方式工程优势与典型适用场景架构局限性与潜在性能瓶颈
Hash Sharding(哈希分片)数据库引擎对用户指定的路由列(通常是主键)应用确定性哈希函数,根据哈希值将数据行均匀映射到预先划分好的哈希空间对应的 Tablet 中。能够实现较为均匀的数据分布,有效消除物理写入热点。适合高并发写入的大规模 OLTP 场景,以及依赖精确主键匹配的点查询(Point Lookups)。难以高效支持范围查询(Range Queries)。因为逻辑上相邻的数据在物理存储上可能被完全打散。执行 WHERE id BETWEEN 10 AND 50 这类查询时,查询层往往需要向多个节点发起请求。
Range Sharding(范围分片)按照主键列的自然排序顺序(字典序或数值递增序)将连续数据段划分到同一个 Tablet 中。当某个 Tablet 达到预设阈值时,系统会自动将其拆分。非常适合带有 BETWEEN<>ORDER BY 等条件的范围扫描工作负载,也适合时间序列与日志流水等需要保持顺序性的场景。容易形成“尾部热点”(Tail Hotspots)。如果主键是单调递增的时间戳或自增 ID,新增写流量会集中落到最新区间对应的单个 Leader Tablet 上,导致局部节点压力过高。
Bucketized Range Sharding(桶化范围分片)一种混合分片方式。系统先按范围划定较大数据区间,再在区间内部进一步切分为多个逻辑桶(Buckets/Shards),结合了哈希分布与范围顺序两者特性。允许对具有顺序语义的数据进行高并发并行写入,缓解单调递增数据造成的写入热点;读取阶段,协调节点还能通过多路归并排序(Merge Sort)合并来自不同桶的有序结果。对容量规划要求较高。配置相对复杂,需要根据业务吞吐、数据增长模型和查询访问模式预估桶数量;如果设置不当,可能引发存储碎片化或归并开销偏大。

桶化范围分片

进一步对比 YugabyteDB 与其他分布式 SQL 数据库(如 CockroachDB)的设计哲学,可以看到一个很有代表性的工程分歧。CockroachDB 在系统层面默认采用范围分片,这使局部扫描更加直接,但也将“如何处理写入热点”的负担更多地转嫁给应用层架构设计,例如需要人工设计复杂的复合主键来打散热点。相比之下,YugabyteDB 选择将哈希分片设为默认选项,优先保障分布式数据库最核心的横向写入扩展能力,同时通过灵活的语法让用户在建表时按业务需求显式切换为范围分片或桶化范围分片。这种设计思路在一定程度上降低了用户在分布式场景下的建模和运维复杂度。相关讨论可参考 YugabyteDB 对 CockroachDB 的对比分析

赞助商

分布式查询优化与算子下推:跨越网络 I/O 的物理鸿沟

评估分布式数据库性能时,一个几乎无可争议的原则是:将计算推向数据所在节点,通常远比将海量数据拉回协调节点更高效。在传统单体数据库中,内存、CPU 与磁盘位于同一台机器上,数据搬运的代价主要体现为内存拷贝和磁盘 I/O。而在分布式架构中,如果协调节点必须先将底层海量原始数据通过 RPC 拉回,再执行简单的条件过滤和聚合,网络延迟与带宽瓶颈就会迅速成为系统吞吐的主要限制因素。

为了解决这一问题,YugabyteDB 实现了较为深入的“算子下推”(Query Push-down)机制。其实现基础之一,在于上层 YSQL 运行的是原生 C 语言实现的 PostgreSQL 核心库,而底层 DocDBC++ 编写。两者在调用栈与内存模型上具备天然的亲和性,减少了跨语言、跨运行时带来的性能损耗。依托这一点,YugabyteDB 得以将部分原本属于 PostgreSQL 顶层规划与执行器中的核心逻辑,编译并下沉到 DocDB 存储节点内部执行。可参考 YugabyteDB 关于 Query Pushdown 的技术文章

SQL 下推

算子下推在 YugabyteDB 中主要体现在以下几个层面。

首先是谓词下推(Predicate Pushdown)与存储级过滤。假设应用发出如下查询:SELECT * FROM employees WHERE salary > 10000 AND department = 'Engineering';。如果没有谓词下推,底层 DocDB 可能需要先读取大量原始数据,再通过网络返回给查询层,由查询层在内存中逐行过滤。这样做在分布式环境下代价极高。启用谓词下推后,过滤表达式可以被序列化并直接发送给对应的 DocDB 分片节点。Tablet 节点利用本地 CPU 在读取 SSTable 的同时完成过滤,通过网络返回的只剩下满足条件的少量结果。用户在 EXPLAIN 中看到的可能仍是高效顺序扫描(Seq Scan)等抽象计划,但底层实际上已经执行了更深入的远端过滤逻辑。

其次是分布式聚合函数下推(Aggregate Pushdown。在电商盘点、日志统计或金融报表场景中,类似 SELECT COUNT(*), SUM(transaction_amount) FROM orders; 的全局聚合查询很常见。YugabyteDB 的优化器可以识别这类无需搬运全量明细数据的查询结构,将计数、求和等操作并行下发到所有相关 Tablet 节点。每个节点在本地存储引擎上完成局部聚合(Partial Aggregate),然后只把轻量级的局部结果返回给协调节点,由协调节点做最终汇总(Finalize Aggregate)。这种类似 Map-Reduce 的本地化执行方式,可以显著降低网络传输量与总查询延迟。

最后是网络延迟感知与基于成本的优化器(CBO)改造。原生 PostgreSQL 优化器诞生于单机时代,其核心成本模型主要围绕磁盘 I/O、内存命中率和 CPU 周期展开。但在地理分布式(Geo-distributed)集群中,网络延迟往往是整体耗时的主导因素。为此,YugabyteDB 对优化器做了较深入的改造,使其具备一定的网络拓扑感知能力。在评估诸如多表关联(Join)等执行计划时,优化器会综合考虑将过滤条件推向远端所节省的网络传输成本,并与本地执行的 CPU 代价进行比较。在某些复杂场景中,它会选择批量嵌套循环连接(Batched Nested Loop Join),将大量零散的单行网络请求合并为批量请求,以降低跨域 RPC 带来的延迟损耗。

突破传统并发瓶颈:深度集成的 Odyssey 线程级连接管理器

对长期运维 PostgreSQL 的工程团队而言,一个长期存在的扩展性痛点,就是其经典的“每个连接一个进程”(Process-per-connection)并发模型。在内存资源紧张的早期年代,这种设计有其合理性:它能够为每个客户端会话提供良好的内存隔离与崩溃隔离。然而,随着微服务架构扩张以及 Serverless 计算的兴起,现代应用可能会在极短时间内向数据库发起成千上万的并发连接请求。

在这种连接风暴下,操作系统调度器会被频繁的上下文切换(Context Switching)拖累。与此同时,每个后端进程都需要消耗额外内存来维护会话上下文,大量空闲连接也可能持续占用宝贵资源。一旦连接数量继续上升,数据库节点的吞吐和延迟都可能明显恶化。

在传统单体架构中,常见的缓解方案是在数据库前部署 PgBouncer 之类的连接池中间件。但在分布式架构下,这种做法也引入了额外复杂性:一方面,它增加了独立的运维组件与故障点;另一方面,当 PgBouncer 运行在效率较高的事务级池化(Transaction Pooling)模式时,为了实现不同客户端事务之间的物理连接复用,它不得不限制一部分依赖会话状态的 PostgreSQL 特性,例如预编译语句(Prepared Statements)以及部分 SET 会话参数,这会直接影响不少 ORM 和现有业务代码。相关背景可参考 YugabyteDB 关于连接池管理的技术文章

为从根本上缓解这一问题,YugabyteDB 选择将 Yandex 开源的高并发连接池 Odyssey 深度改造,并嵌入数据库内部,构建原生常驻的连接池管理器(Database Resident Connection Pool)。

连接管理器

这一深度集成带来了几个重要变化:

  1. 协程驱动的多线程异步架构。原生 PostgreSQL 核心长期保持单线程处理模型,而内置的 Odyssey 管理器则采用现代化的多线程事件驱动架构,并结合轻量级协程来处理海量逻辑连接。这样一来,客户端发起的大量逻辑连接(Logical Connections)可以由 Odyssey 的工作线程以更低的 CPU 和内存开销统一管理,再动态复用到一组真实的后端物理连接(Physical Connections)上。
  2. 更强的会话状态感知能力。由于连接管理器被放入数据库内部,而不是作为外部中间件存在,它能够更深入地理解数据库会话状态。因此,那些在外部连接池中经常受限的 SQL 能力,如复杂临时表(TEMP TABLE)、持久游标(WITH HOLD CURSORS)以及预编译语句,在 YugabyteDB 中可以获得更好的兼容支持。
  3. 更高的连接承载能力。在官方公开的基准测试中,这种内置管理方式在突发连接场景下能显著提升连接建立速度,并在保持吞吐与延迟相对稳定的前提下,承载更多并发连接。这意味着原本属于 PostgreSQL 生态的典型短板,在分布式云原生环境中得到了实质性改善。

拥抱生成式 AIVector LSM 引擎与十亿级向量检索架构

随着大语言模型(LLMs)的快速突破,整个技术产业被迅速带入生成式人工智能(GenAI)时代。在这一新范式下,为了缓解模型的幻觉问题并补足私有知识盲区,检索增强生成(Retrieval-Augmented GenerationRAG)成为企业级 AI 落地的重要架构。而支撑 RAG 的关键基础设施之一,就是能够处理高维嵌入向量(Embeddings)并执行语义相似度检索的向量数据库。

但传统单体关系型数据库,即便安装了类似 pgvector 这样的优秀扩展,在面对真实企业场景下动辄数十亿级别的向量数据时,仍会在索引分布、内存占用和查询延迟方面暴露明显瓶颈。另一方面,纯向量数据库虽然在特定检索场景中表现亮眼,却常常制造新的“数据孤岛”,迫使架构师在关系型主库与向量系统之间维护额外的数据同步链路,从而引入事务一致性与系统复杂度问题。

YugabyteDB 给出的回答,是在其成熟的分布式底座之上,引入 Vector LSM 这一向量存储引擎抽象层。对外,它仍然兼容广泛使用的 pgvector 语法,使开发者能够继续沿用标准 SQL 和既有工具链来执行近似最近邻(ANN)查询;但在底层存储与执行机制上,它做了大幅重构。相关介绍可参考 YugabyteDB 关于语义搜索的技术文章

对于 PgVector 兼容

突破内存瓶颈:USearch 与磁盘支持的 HNSW 索引重构

观察多数主流开源向量索引库,例如 FAISSHnswlib,会发现它们普遍存在一个结构性限制:它们通常依赖将庞大的近似最近邻(ANN)分层可导航小世界图(HNSW Graph)整体保存在内存中。当数据量还处于数百万级时,这种策略可以换来极高的检索速度;但一旦规模逼近十亿级,全内存架构就会迅速遭遇成本与扩展性的双重瓶颈。相关问题可参见 YugabyteDB 关于十亿级向量检索的基准分析

Vector LSM 正是为了突破这一限制而设计。它可以被视为一种专门面向分布式环境的可插拔(Pluggable)向量索引抽象层,借鉴了传统 LSM 树处理海量写入时的多层合并思想,并在底层深度集成了以高效、轻量著称的 USearch 引擎。

  1. 极速的内存摄入层(Ingestion。当系统持续接收外部模型生成的向量写入时,这些数据首先被暂存于内存缓冲区中。在这一阶段,引擎利用高度优化、可结合 SIMD 指令集加速的 HNSW 算法,在内存中快速构建局部近邻图。
  2. 异步刷盘与持久化层(Persistence。当内存缓冲区达到预设高水位线后,底层 USearch 可以借助高效的内存映射文件(Memory-mapped Filemmap)能力,将向量索引平滑地刷写为磁盘上不可变的紧凑数据块。这样一来,大规模向量索引不再必须长期占据昂贵内存,而可以在磁盘与内存之间更平衡地分层管理。相关设计可参考 YugabyteDB 的向量索引架构说明

同位分区、MVCC 过滤与混合查询性能

在真实 AI 应用中,纯向量搜索通常并不够用。业务真正需要的,往往是向量相似度检索与关系型过滤条件深度结合的混合搜索(Hybrid Search)。例如,在电商推荐场景中,查询可能是:“找出与用户意图向量最接近的商品,同时要求这些商品满足库存大于零、分类属于数码 3C,且上架时间在最近 7 天内。”

如果向量数据与关系型元数据被拆分到不同系统,这类查询往往会退化为昂贵的跨系统数据搬运与分布式 JoinYugabyteDB 的一个关键设计亮点,是围绕向量索引实现“同位分区”(Locality-Aware Indexing / Co-partitioning)的物理布局策略。

DocDB 的物理层中,无论是高维向量索引,还是其对应的商品主键、价格标签、更新时间等结构化业务数据,都可以复用同一套分片(Sharding)与自动负载均衡机制,并尽量被放置在相同的物理 Tablet 副本空间内。

这种数据局部性(Data Locality)带来了两个显著收益。

首先,在处理包含权限控制、属性过滤或时间约束的混合查询时,底层向量检索过程可以与 DocDB 的多版本并发控制(MVCC)规则结合起来执行。系统在遍历 HNSW 图并计算相似度的同时,就能够过滤掉那些事务上不可见、已逻辑删除,或根本不满足关系型属性条件的记录。相比“先取出候选向量结果,再回到关系型系统进行二次过滤”的模式,这种方式能明显减少无效候选结果与额外网络开销。

其次,当集群接收到全局向量检索请求时,协调节点可以将查询并行扇出(Fan-out)到多个相关 Tablet 副本。每个持有数据的物理节点都在本地 Vector LSM 实例中计算自己的局部 Top-K 结果。由于向量与结构化元数据具备较好的同位分布特性,整个计算过程更多地发生在节点本地,从而减少跨分片网络传输。当所有分片陆续返回局部最优结果后,协调节点只需做一次轻量级的全局归并和重排,即可生成最终结果。

这种在分布式系统底层将计算逻辑与数据布局紧密结合的设计,使 YugabyteDB 在面对大规模 AI 检索工作负载时,能够同时维持较低延迟与良好的线性扩展能力。随着企业向量数据规模继续增长,运维团队理论上可以通过增加普通商用服务器来扩容集群,而系统则在后台自动完成 TabletVector LSM 索引的重平衡与迁移。

总结:云原生分布式 PostgreSQL 的现实路径

通过梳理 Hari Krishna Sunder 这场高密度技术分享,并结合公开的工程资料,可以比较清晰地看到 YugabyteDB 团队的核心目标:它并不满足于做一个仅仅“运行在云上”的 PostgreSQL 兼容数据库,而是试图以尽可能保留 PostgreSQL 生态优势的方式,重建其在分布式时代的底层能力边界。

这种思路的关键,在于通过分层架构将负责语义解析与优化规划的无状态查询层 YSQL,与负责数据分片、Raft 共识以及 LSM 存储的底层 DocDB 进行清晰解耦。它既保留了 PostgreSQLSQL 语义和工具链上的成熟度,也通过纯软件工程手段突破了传统单机关系型数据库在横向扩展上的结构限制。

进一步看,YugabyteDB 的算子下推机制缓解了分布式查询中最昂贵的跨节点网络 I/O 问题;深度集成的 Odyssey 连接管理器,则在高并发微服务和 Serverless 场景下补齐了 PostgreSQL 原有的连接扩展短板;而 Vector LSM 的引入,又让它在生成式 AI 与语义检索场景中具备了更现实的工程落地能力。

在数据库行业持续从集中式单点走向云原生分布式、从纯 OLTP 走向更复杂的混合工作负载,并进一步拥抱 AI 检索需求的过程中,YugabyteDB 所代表的这一路径,提供了一个值得认真观察的样本:既不轻易放弃 PostgreSQL 生态,也不回避分布式一致性、连接扩展性与向量检索这些新的系统级挑战。对需要规划下一代数据底座的架构师而言,这种兼顾兼容性、扩展性与新型工作负载支持的设计,确实具有相当强的现实吸引力。

欢迎关注

欢迎关注「端小强的博客」微信公众号,会不定期分享数据库、系统架构与工程实践相关内容,欢迎交流。

微信公众号