跳转到主要内容
Chroma 采用模块化架构设计,优先考虑性能和易用性。它可以从本地开发无缝扩展到大规模生产环境,并在所有部署模式下提供一致的 API。 Chroma 尽可能将数据持久化问题委托给 SQLite 和云对象存储等受信任的子系统,使系统设计专注于数据管理和信息检索的核心问题。

部署模式

Chroma 可以在任何需要的地方运行,支持从本地实验到大规模生产工作负载的所有场景。
  • 本地 (Local):作为嵌入式库运行 - 非常适合原型设计和实验。
  • 单节点 (Single Node):作为单节点服务器运行 - 非常适合中小规模工作负载,可在少量集合中处理少于 1000 万条记录。
  • 分布式 (Distributed):作为可扩展的分布式系统运行 - 非常适合大规模生产工作负载,支持数百万个集合。
您可以使用 Chroma Cloud,它是分布式 Chroma 的托管版本。

核心组件

无论何种部署模式,Chroma 都由五个核心组件组成。每个组件在系统中扮演不同角色,并基于共享的 Chroma 数据模型运行。 Chroma 系统架构

网关 (The Gateway)

所有客户端流量的入口点。
  • 在所有模式下暴露一致的 API。
  • 处理身份验证、速率限制、配额管理和请求验证。
  • 将请求路由到下游服务。

日志 (The Log)

Chroma 的预写日志 (WAL)。
  • 所有写入操作在向客户端确认之前都会记录在此处。
  • 确保多条记录写入的原子性。
  • 在分布式部署中提供持久性和回放功能。

查询执行器 (The Query Executor)

负责所有读取操作
  • 向量相似度、全文本和元数据搜索。
  • 维护内存和磁盘索引的组合,并与日志协同工作以提供一致的结果。

压缩器 (The Compactor)

定期构建和维护索引的服务。
  • 从日志中读取数据并构建更新的向量/全文本/元数据索引。
  • 将物化索引数据写入共享存储。
  • 使用有关新索引版本的元数据更新系统数据库。

系统数据库 (The System Database)

Chroma 的内部目录。
  • 跟踪租户、集合及其元数据。
  • 在分布式模式下,还管理集群状态(例如,查询/压缩节点成员身份)。
  • 由 SQL 数据库支持。

存储与运行时

这些组件根据部署模式的不同而运作不同,特别是在它们如何使用存储以及运行的运行时环境方面。
  • 在本地和单节点模式下,所有组件共享一个进程,并使用本地文件系统进行持久化。
  • 分布式模式下,各组件作为独立服务部署。
    • 日志和构建的索引存储在云对象存储中。
    • 系统目录由 SQL 数据库支持。
    • 所有服务都使用本地 SSD 作为缓存,以降低对象存储的延迟和成本。

请求序列

读取路径

Chroma System Read Path
1
请求到达网关,在此进行身份验证、配额检查、速率限制并转化为逻辑计划。
2
该逻辑计划被路由到相关的查询执行器。在分布式 Chroma 中,使用集合 ID 的一致性哈希 (Rendezvous Hash) 将查询路由到正确的节点并提供缓存一致性。
3
查询执行器将逻辑计划转化为物理计划以执行,从存储层读取并执行查询。查询执行器从日志中拉取数据以确保读取的一致性。
4
请求返回给网关,随后返回给客户端。

写入路径

Chroma System Write Path
1
请求到达网关,在此进行身份验证、配额检查、速率限制,然后转化为操作日志。
2
操作日志被转发到预写日志进行持久化。
3
在预写日志持久化后,网关向客户端确认写入。
4
压缩器定期从预写日志中拉取数据,并根据累积的写入构建新的索引版本。这些索引针对读取性能进行了优化,包括向量、全文本和元数据索引。
5
一旦构建了新的索引版本,它们将被写入存储并在系统数据库中注册。

权衡取舍

分布式 Chroma 构建在对象存储之上,以确保数据的持久性并实现低成本。对象存储具有极高的吞吐量,能够轻松使单节点的网络带宽饱和,但其代价是约 10-20 毫秒的相对较高的延迟下限。 为了减少这种延迟下限的开销,分布式 Chroma 积极利用 SSD 缓存。当您首次查询集合时,回答查询所需的数据子集将有选择地从对象存储中读取,从而产生冷启动延迟。在后台,SSD 缓存将加载该集合的数据。在集合完全预热后,查询将完全由 SSD 处理。

Chroma 数据模型

Chroma 的数据模型旨在平衡简单性、灵活性和可扩展性。它引入了几个核心抽象 —— 租户 (Tenants)数据库 (Databases)集合 (Collections) —— 使您能够跨环境和用例高效地组织、检索和管理数据。

集合 (Collections)

集合是 Chroma 中存储和查询的基本单元。每个集合包含一组条目,每个条目由以下部分组成:
  • 唯一标识该条目的 ID
  • 一个嵌入向量
  • 可选的元数据(键值对)
  • 属于所提供嵌入的文档
集合是独立索引的,并针对使用向量相似度全文本搜索元数据过滤的快速检索进行了优化。在分布式部署中,集合可以根据需要跨节点进行分片或迁移;系统根据访问模式透明地管理它们在内存中的进出切换。

数据库

集合被分组成数据库,作为逻辑命名空间。这有助于按用途组织集合 —— 例如,区分 “测试” 和 “生产” 环境,或将应用归类在通用的架构下。 每个数据库包含多个集合,且每个集合名称在数据库内必须是唯一的。

租户

模型的最顶层是租户,代表单个用户、团队或账户。租户提供完全隔离。租户之间不共享任何数据或元数据。所有访问控制、配额执行和计费都限定在租户级别。