kisenon

区域迁移

将项目迁移到另一个区域 — 迁移哪些内容、托管流程,以及当下可用的手动 pg_dump 操作手册。

区域迁移 将一个现有项目从它创建时所在的 区域 移动到 另一个区域。当你的流量已经更靠近另一个区域(往返延迟更低),或当合规或 数据驻留要求规定你的数据必须位于某个特定司法辖区时,你会用到它。

迁移改变的是数据 位于何处,而不是数据 是什么。你的分支、角色、 数据库以及其中的行都会一并迁移。客户端这一侧唯一会变的是连接字符串中的 主机 — 你的项目会落在目标区域中一个新的端点主机上,所以一旦切换完成, 你的 DATABASE_URL 就需要重新指向。

How it works

托管迁移作为一次受控且经过验证的复制运行,并带有一个由你批准的显式切换。 各阶段如下:

  1. 冻结 — 源项目被短暂置于只读 / 暂停状态,以便复制有一个一致且不动的 目标。
  2. 转储 — 从源区域取得每个分支的逻辑转储。
  3. 传输 — 转储通过 TLS 移动到目标区域。
  4. 恢复 — 转储被恢复到目标区域中一个全新预配的项目中。
  5. 验证 — 检查目标与源是否逐字节等价:模式指纹、各表的行数以及内容 校验和都必须匹配,迁移才会被提供用于切换。
  6. 确认 — 不会自动切换任何内容。你审查验证结果并显式确认切换。
  7. 切换 — 项目的活动端点被重新指向目标区域。连接字符串的主机改变。

如果你在切换前取消,或验证在任何阶段失败,迁移会 回滚:目标脚手架被 丢弃,源项目从只读状态中退出,保持原样。

Size guidance

只读窗口随你的数据大小而伸缩:

  • 小于 10 GB — 通常在 15 分钟以内完成。
  • 10–100 GB — 一个延长的窗口;请计划一段更长的只读时段,并安排在高峰 时间之外。
  • 超过 100 GB — 请联系支持 进行协助式迁移。大型项目 使用人工操作手册迁移,而非自助流程。

Managed migration (console)

托管区域迁移正在 逐步推出。这里描述的向导正在逐步启用;如果你在项目 设置中尚未看到 Migrate region,请使用下面的 手动操作手册,它当下在每个项目上都可用。

控制台向导会引导你完成上述流程:

  1. 打开项目并进入 Settings → Migrate region
  2. 选择目标 — 从下拉列表中挑选目标区域。当前区域会作为参考显示。
  3. 审查影响 — 向导会总结即将发生的事情:项目将经历的只读窗口,以及切换 时连接字符串主机会改变这一事实。
  4. 监控进度 — 每个分支都会显示自己经过转储 → 传输 → 恢复的进度。迁移 运行时向导会流式传输状态。
  5. 审查验证 — 复制完成后,验证结果按分支显示:模式指纹匹配、行数匹配 以及校验和匹配。
  6. 确认切换 — 一旦验证为绿色,确认切换。这是没有自动退路的节点。
  7. 更新 DATABASE_URL — 切换后,从端点卡片复制新的连接字符串,并更新你 应用程序的 DATABASE_URL。主机已经改变;其余一切相同。

Manual migration runbook

此操作手册 当下在任何套餐上都可用。它使用标准的 Postgres 工具和公开的 连接字符串,因此不依赖于托管流程。形态是:在目标区域中立起一个新项目,用 pg_dump / pg_restore 把数据复制进去,验证,然后重新指向并删除旧项目。

1. Create the destination project

在目标 区域 中创建一个新项目(控制台 New project, 或 API)。匹配源项目的 Postgres 主版本。从端点卡片记下新项目的连接字符串。

2. Dump the source

项目的连接字符串以 custom 格式转储。--no-owner--no-privileges 让转储在目标中新创建的角色之间保持可移植:

pg_dump \
  --format=custom \
  --no-owner \
  --no-privileges \
  "postgresql://app:SOURCE_PWD@ep_SOURCE.kisenon.com:5432/main?sslmode=require" \
  --file=migration.dump

3. Restore into the destination

恢复到 目标 项目的连接字符串。--single-transaction 加上 --exit-on-error 使恢复成为全有或全无:如果有任何失败,目标会保持干净而 不是加载了一半:

pg_restore \
  --no-owner \
  --no-privileges \
  --single-transaction \
  --exit-on-error \
  --dbname "postgresql://app:DEST_PWD@ep_DEST.kisenon.com:5432/main?sslmode=require" \
  migration.dump

4. Verify

在切换之前确认目标与源匹配。对两个连接字符串比较各表的行数:

SELECT relname, n_live_tup
FROM pg_stat_user_tables
ORDER BY relname;

要进行更强的检查,在最重要的表上抽查内容校验和。对源和目标分别运行此查询 并比较结果:

SELECT md5(string_agg(t::text, '' ORDER BY t)) AS checksum
FROM my_table AS t;

行数和校验和相符意味着数据已完整迁移。

5. Cut over and clean up

将你应用程序的 DATABASE_URL 重新指向目标连接字符串。一旦你确认应用程序 针对新项目运行正常,就删除旧项目以停止为它计费:

keon projects delete <old-project-id>

删除项目不可逆 — 仅在你验证了目标并把所有流量切换到它之后才执行。

FAQ

How much downtime should I expect?

对于托管迁移,唯一的中断是复制期间的只读窗口 — 写入被暂停,读取继续。窗口 随数据大小伸缩(见大小指引):低于 10 GB 的项目不到 15 分钟,更大的更长。对于手动操作手册,停机时间是你为停止写入而选择的窗口, 期间你进行转储、恢复和验证。

Can I cancel a migration?

可以 — 在 最终切换之前 的任何时候。取消会丢弃目标脚手架并把源项目恢复 正常;在你确认切换之前源永远不会被修改,所以取消后你恰好停留在开始的地方。

What happens to my branches?

每个分支都会被迁移。请注意,逻辑转储与恢复会 抹平 写时复制历史:每个 分支以其当前数据迁移过来,但子分支与其父分支之间的 fork-at-LSN 关系不会被 保留 — 目标分支从迁移后的数据全新开始,而不是共享页面。数据是完整的;共享 存储的谱系则不是。

Do my passwords and roles survive?

角色会作为立起目标项目的一部分被重新创建,它们拥有的数据会迁移过来。由于 手动操作手册使用 --no-owner --no-privileges 转储,角色所有权和授权 不会 由转储携带 — 你在目标上重新应用它们。把角色/密码的一致性当作迁移后需要验证 并重新建立的事情,而不是自动的。托管流程会为你重新创建项目的角色,但同样的 谨慎适用:在切换前确认你应用程序的登录角色和密码在目标上可用。

Do my connection strings change?

会 — 主机 会改变,因为你的项目迁移到目标区域中一个新的端点主机。你在 切换时一次性更新 DATABASE_URL(以及任何其他硬编码了主机的地方)。你的 API 密钥(nsk_…)是账户范围的,不会 受区域迁移影响。

Is my data encrypted in transit?

是的。区域之间的传输通过 TLS 运行,源端的转储和目标端的恢复都使用 连接字符串 中描述的标准 sslmode=require Postgres 连接。

  • 区域 — 你在其间迁移的目录。
  • 项目 — 作为整体迁移的单位。
  • 连接字符串 — 其主机在切换时改变的线路格式。
  • 分支 — 写时复制的子项,以及转储/恢复如何影响它们的谱系。