# Relyt One 发布：像代码一样分支的 Serverless Postgres

Relyt One 是 Serverless PostgreSQL 17，提供写时复制的分支、空闲时自动挂起的计算实例、内置向量检索和托管认证。本文介绍它的工作原理，以及如何在五分钟内从登录走到一个分支好的数据库。

**Relyt One 是面向开发者和 AI 智能体的 Serverless Postgres。你得到的是标准的 PostgreSQL 17：每个 Pull Request、每个预览环境、每次智能体运行都能有自己的数据库分支；没人用时计算实例自动挂起；大多数应用迟早要补上的那些组件也都已备好——连接池、向量检索、Open API 和托管认证。它可以免费开始使用，无需信用卡，用 GitHub 或 Google 登录，几分钟后就能拿到一个数据库。**

本文介绍 Relyt One 是什么、为什么这样设计，以及实际用起来是什么样子：从第一条连接字符串，一直到一个装着生产数据、用完即弃的分支。

## 为什么还要再做一个 Postgres 服务？

Postgres 是新应用的默认数据库，这是有充分理由的。但我们运行它的方式却没怎么变过。托管 Postgres 实例归根结底仍是一台机器：固定的 CPU 和内存，挂着一块磁盘，不管有没有人连上来，它都在运行。

这种模式有三重代价，每个团队迟早都会遇到。

**环境太贵，所以总是不够用。** 人人都想要一个和生产环境一模一样的预发数据库、每个 Pull Request 一个数据库、一个能让迁移安全失败的沙箱。可在「机器形态」的 Postgres 上，每多一个环境就要多开一个实例、多恢复一份 dump、多付一份账单。于是团队只好共用一个预发数据库，拿几行种子数据测试迁移，直到上了生产才发现那条 `ALTER TABLE` 有多慢。

**空闲的数据库和繁忙的数据库一样贵。** 个人项目、内部工具、预览环境和演示应用，一生中大部分时间都无事可做。一台永远开着的机器，会为这些「无事可做」照样收费。

**智能体让这两个问题雪上加霜。** 如果一个编程智能体能为每个任务创建一个数据库，试一下 schema 变更、跑一遍测试，然后把结果丢掉，那它远比只能和你共用开发数据库的智能体有用。但前提是：创建数据库要像创建 git 分支一样便宜、一样快。

Relyt One 从一种不同的架构出发，让这三个问题都不复存在。

## Relyt One 的工作原理

核心思路是**计算与存储分离**。

![连接池位于各分支的计算实例之前，所有计算实例都从同一个共享的写时复制存储层读取数据](/blog/assets/682133d99466ec4c.svg)

存储是一个共享层，保存着数据的历史。计算实例是一个普通的 Postgres 17 进程，为某一个分支处理查询，并从存储层读取数据页。由于数据并不放在计算实例的磁盘上，三件过去很昂贵的事情变得便宜了。

### 分支是写时复制的

分支是一条新的历史线，从父分支的某个时间点开始。创建分支不会复制数据：新分支与父分支共享所有数据页，直到其中一方修改了某一页，只有被修改的页才会占用新空间。正因如此，无论父分支装着 1 MB 还是 100 GB 数据，创建分支的成本都一样；也正因如此，控制台显示的是每个分支**相对父分支的存储增量**，而不是一份完整副本的大小。新分支的计算实例需要一小段时间来准备，而数据从分支创建的那一刻起就已经在那里了。

分支构成一棵树。你可以从 `main` 创建分支，再从这个分支继续创建分支。删除一个分支永远不会影响它的父分支或兄弟分支；还有子分支的分支，要等子分支都删除后才能删除。主分支不能删除，所以 `main` 始终都在。

你还可以从过去创建分支。如果项目保留了历史（最多保留最近 3 小时，在项目的历史保留设置中配置），新分支可以从这个窗口内任意时刻的父分支数据开始，而不必从「现在」开始。这在「迁移搞砸了的早上」特别有用：从部署前十分钟创建一个分支，看看那些行原本是什么样子，再把需要的数据复制回来。

![main 有两个子分支，一个基于当前数据创建，另一个基于过去某个时间点创建](/blog/assets/1e0f178c431a92d3.svg)

### 每个分支都有自己的计算实例

每个分支都由自己的计算实例提供服务，规格以计算单元（CU）计量（1 CU = 1 vCPU + 4 GB RAM）。在预览分支上跑一轮繁重的测试，永远不会和生产环境争抢 CPU；智能体的实验也锁不住你的用户正在读取的表。

### 空闲的计算实例会挂起

计算实例空闲一段时间后（默认约十分钟）会自动挂起：状态从 **ACTIVE**（运行中）变为 **SUSPENDED**（已挂起），不再占用 CPU。数据丝毫不受影响，因为它本来就不在计算实例上。下一个连接到来时，计算实例会自动恢复。对于那一大批每天只忙几分钟的数据库来说，这就是「为一台机器付费」和「为实际工作付费」的区别。

## 你能得到什么

- **PostgreSQL 17，而不是仿制品。** 你的驱动、ORM、`psql`、pgAdmin 和 DBeaver 无需任何改动即可使用。`pg_trgm`、`citext`、`pgcrypto` 等扩展均可通过 `CREATE EXTENSION` 启用。
- **分支**：可基于当前数据或最近几小时内的数据创建，每个分支都有自己的计算实例，可以通过控制台或 API 创建。
- **连接池**：基于 PgBouncer 的事务级连接池，最多支持 10,000 个并发连接。Serverless 函数和其他短连接场景请使用连接池的连接字符串。
- **内置向量检索。** `vectors` 扩展（pgvecto.rs，不是 pgvector）已预加载，并默认在你的数据库中创建好，向量嵌入可以和它所描述的行存放在一起。
- **可观测性**：每个计算实例都有 CPU、内存、连接数和数据库大小图表，实时的活跃查询，以及带调用次数和耗时的查询历史。
- **Open API**：使用 API 密钥访问，覆盖组织、项目、分支和计算实例。
- **托管认证（预览版）。** 为你的应用用户提供登录能力，挂在分支上，用户数据就存放在该分支自己的数据库里。详见 [Relyt One 托管认证预览版发布](/blog/zh-CN/managed-auth-preview)。

## 五分钟：从登录到分支好的数据库

下面是完整的流程：创建项目、连接、创建分支、在分支上修改 schema，然后把分支丢掉。

### 1. 创建项目

使用 GitHub 或 Google [登录](/auth/signin)。首次登录时会自动为你创建一个免费组织。

创建一个项目：起个名字，选择区域，设置 PostgreSQL 密码。项目创建时自带一个主分支 `main`、一个主计算实例、一个数据库 `relytdb` 及其所有者角色 `relytdb_owner`。计算实例的准备可能需要几分钟，就绪后分支页面会提示你。

### 2. 连接

打开分支，选择 **Connect**（连接）。选好计算实例、数据库和角色，复制连接字符串。对话框里还有现成的 Prisma 和 Java 代码片段、供图形化客户端使用的主机和端口信息，以及连接池的连接字符串。

```bash
export DATABASE_URL="postgresql://<角色>:<密码>@<主机>/<数据库>?sslmode=require"
psql "$DATABASE_URL" -c "select version();"
```

建一张表、插入一些数据，好有东西可以分支：

```sql
CREATE TABLE customers (
  id         bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
  email      text NOT NULL UNIQUE,
  created_at timestamptz NOT NULL DEFAULT now()
);

INSERT INTO customers (email)
SELECT 'user' || g || '@example.com' FROM generate_series(1, 100000) AS g;
```

### 3. 创建分支

在 **Branches**（分支）页面选择 **New Branch**（新建分支），父分支选 `main`，保持 **Current data**（当前数据）不变，命名为 `add-plan-column`。

分支从一开始就拥有全部 100,000 行数据，还有自己的计算实例和自己的连接字符串；等计算实例显示就绪后，就可以连接了。整个过程没有复制任何数据：相对父分支的存储增量从零开始。

同样的操作也可以通过 Open API 完成，CI 任务或智能体用的就是这种方式（`$PROJECT_ID` 是项目的 `obj-…` ID，`parentBranchSlug` 是父分支的 `br-…` slug）：

```bash
curl https://relyt.one/api/v1/projects/$PROJECT_ID/branches \
  -H "x-api-key: $RELYT_API_KEY" \
  -H "content-type: application/json" \
  -d '{"name": "add-plan-column", "parentBranchSlug": "br-..."}'
```

加上 `"pointInTime": "2026-10-30T08:50:00Z"`，就会改为基于父分支在那个时刻的状态创建分支；这个时间必须落在项目的历史保留窗口之内。

### 4. 在分支上修改 schema

连接到这个分支，执行那条你心里没底的迁移：

```sql
ALTER TABLE customers ADD COLUMN plan text NOT NULL DEFAULT 'free';
CREATE INDEX customers_plan_idx ON customers (plan);
```

你能看到它在真实数据上要跑多久、跑完之后查询计划变成什么样、你的应用是否仍然正常，而这一切都不会碰到 `main`。打开 **Monitoring**（监控），选择该分支的计算实例，就能看到 CPU 的尖峰，还能在 **Query History**（查询历史）里看到执行过的语句。

### 5. 用完即弃

对结果满意？那就通过正常的部署流程在 `main` 上执行同样的迁移。不满意？删掉这个分支就好。无论哪种情况，这次实验的成本只是几秒钟的计算实例时间，加上它修改过的那些数据页。

## 为智能体而生

创建和删除项目、分支都只是一次 API 调用，这让 Relyt One 非常适合那些需要为每个任务准备一个真实数据库的编程智能体。

- **Open API** 可以创建和删除项目与分支（每个分支都自带计算实例）、读取计算实例的状态和指标，以及管理 API 密钥。[API 参考](/api-docs)列出了所有接口。
- 开源的 **[智能体技能包](https://github.com/relytcloud/agent-skills)** 教会 Claude Code 和其他智能体如何开通数据库、创建分支和建立连接，让它们不必靠猜。
- **每个任务一个分支。** 给智能体一个专属分支，让它在上面跑迁移和测试，在任何改动进入 `main` 之前先审查 diff。

## 价格

每个账号都从 **Free** 套餐开始：

|      | Free                 |
| ---- | -------------------- |
| 组织   | 1                    |
| 项目   | 5                    |
| 存储   | 2.5 GB（每个项目含 0.5 GB） |
| 计算实例 | 不限量的共享计算实例时长（早鸟优惠）   |

无需信用卡，也没有试用期倒计时。

## 周边全部开源

数据库本身就是 Postgres，周边工具也都是开源的：用于验证托管认证令牌的 [`@relyt/auth`](https://github.com/relytcloud/relyt-auth-js)、[示例应用](https://github.com/relytcloud/relyt-auth-examples)，以及 [智能体技能包](https://github.com/relytcloud/agent-skills)，均以 MIT 许可证发布在 GitHub 上。

## 开始使用

登录，创建一个项目，然后给它建个分支。如果有哪里让你困惑或者坏了，我们很想知道：请使用控制台里的反馈按钮告诉我们。

[创建免费项目](/auth/signin?ref=blog-hello-relyt-one)
