大数据库迁移(Citus Cloud)

较大的环境可以使用 Citus WarpDebeziumStriimHVR 等工具进行在线复制。 这些工具允许您将更改从 PostgreSQL 源数据库流式传输到我们在 Microsoft Azure 上的 托管服务。 就好像应用程序自动写入两个数据库而不是一个,除非具有完美的事务逻辑。

对于此过程,我们强烈建议您通过 opening a support reauest 与我们联系。 为了进行复制,我们通过 VPC 对等或 IP 白名单将 Citus 集群的协调器节点连接到现有数据库,然后开始复制。

以下是开始复制过程之前需要执行的步骤:

  1. 在目标 Citus 集群上复制 schema 结构

  2. 在源数据库中启用逻辑复制

  3. 允许从 Citus coordinator 节点到源的网络连接

  4. 联系我们开始复制

复制 schema

将数据迁移到 Citus 的第一步是确保 schema 完全匹配,至少对于您选择迁移的表而言。 一种方法是针对您的开发数据库(用于本地测试应用程序的 Citus 数据库)运行 pg_dump --schema-only。 在 coordinator Citus 节点上重放输出。另一种方法是针对目标数据库运行应用程序迁移脚本。

您希望迁移的所有表都必须具有主键。 相应的目标表也必须具有主键, 唯一的区别是这些键也允许组合以包含分布列,如 确定分布策略 中所述。

还要确保在开始复制之前在集群中 分布表,这样数据就不必单独放在 coordinator 节点上。

启用逻辑复制

某些托管数据库(例如 Amazon RDS)需要通过更改服务器配置参数来启用复制。 在 RDS 上,您需要创建一个新参数组,在其中设置 rds.logical_replication = 1, 然后将参数组设为活动参数组。 应用更改需要重新启动数据库服务器,这可以安排在下一个维护时段。

如果您正在管理自己的 PostgreSQL 安装,请将这些设置添加到 postgresql.conf:

wal_level = logical
max_replication_slots = 5 # has to be > 0
max_wal_senders = 5       # has to be > 0

需要重新启动数据库才能使更改生效。

开放访问网络连接

识别目标协调器节点的 IP 地址。挖掘主机名以找到其 IP 地址:

dig +short <hostname> A

如果您使用的是 RDS,请编辑入站数据库安全组以添加自定义 TCP 规则:

Protocol

TCP

Port Range

5432

Source

<citus ip>/32

这会将 Citus coordinator 节点的 IP 地址列入白名单以进行入站连接。 连接两者的另一种方法是在它们的 VPC 之间建立对等互连。 如果需要,我们可以帮助进行设置。

开始复制

通过在 Azure 门户中打开 support ticket 与我们联系。 工程师将连接到您的数据库以执行初始数据库转储(database dump)、打开复制槽(replication slot)并开始复制。 我们可以在迁移中包含/排除您选择的表。

在复制的第一阶段,如果数据库处于写入负载下,Postgres 预写日志 (WAL) 可能会大幅增长。 在开始此过程之前,请确保源数据库上有足够的磁盘空间。 我们建议 100GB 可用空间或总磁盘空间的 20%,以较大者为准。 一旦初始 dump/restore 完成并开始复制,那么数据库将能够再次归档未使用的 WAL 文件。

随着复制的进行, 请注意源数据库上的磁盘使用情况 。 如果源和目标之间存在数据类型不匹配,或其他意外的 schema 更改,则复制可能会停止。 在长时间停顿期间,复制槽可以在源上无限增长,从而导致潜在的崩溃。

由于复制停滞的可能性,我们强烈建议在进行 Citus warp 时尽量减少 schema 更改。如果需要进行侵入式 schema 更改,您将需要停止 warp 并重试。

进行侵入式 schema 更改的步骤:

  1. 请求支持工程师停止复制。

  2. 更改源数据库上的 schema。

  3. 更改目标数据库上的 schema。

  4. 重新开始。

切换到 Citus 并停止与旧数据库的所有连接

当复制赶上源数据库的当前状态时,还有一件事要做。 由于复制过程的性质,序列值不会在目标数据库上正确更新。 为了获得正确的序列值,例如 id 列,您需要在打开对目标数据库的写入之前手动调整序列值。

一旦这一切完成,应用程序就可以连接到新数据库了。我们不建议同时写入源数据库和目标数据库。

当应用程序切换到新数据库并且源数据库上没有发生进一步的更改时,请再次联系我们以删除复制槽。迁移完成。