您可以使用 Livesync Docker 镜像将所有数据或特定表从 PostgreSQL 数据库实例实时同步到 Timescale Cloud 服务。您可以连续运行 Livesync,将 PostgreSQL 变成主数据库,并将 Timescale Cloud 服务作为逻辑副本。这使您能够在副本数据上利用 Timescale Cloud 的实时分析功能。

警告

您可以使用 Livesync 进行数据同步,而不是迁移。它目前处于 alpha 阶段,不建议用于生产环境。

Livesync 利用 PostgreSQL 逻辑复制协议,这是 PostgreSQL 生态系统中一项成熟且广为人知的功能。通过依赖此协议,Livesync 确保了兼容性、熟悉度和更广泛的知识库,使您更容易采用和集成。

您可以使用 Livesync 来

  • 将现有数据从 PostgreSQL 实例复制到 Timescale Cloud 服务
    • 以高达 150 GB/小时的速度复制数据。您至少需要一个 4 CPU/16GB 的源数据库和一个 4 CPU/16GB 的目标服务。
    • 并行复制发布表。但是,大型表仍然使用单个连接复制。并行复制正在待办事项列表中。
    • 忽略外键关系。Livesync 在同步期间禁用外键验证。例如,如果 metrics 表引用了 tags 表上的 id 列,您仍然可以仅同步 metrics 表,而无需担心它们的外键关系。
    • 跟踪进度。PostgreSQL 在 pg_stat_progress_copy 中公开 COPY 进度。
  • 将实时更改从 PostgreSQL 实例同步到 Timescale Cloud 服务。
  • 使用 PostgreSQL PUBLICATION 接口 按需添加和删除表。
  • 在您的逻辑副本上启用 超表列式存储连续聚合 等功能。

如果您有任何问题或反馈,请在 Timescale Community 的 #livesync 频道 中与我们交流。

最佳实践是使用与您的 Timescale Cloud 服务托管在同一区域的 Ubuntu EC2 实例 来移动数据。也就是说,您在上面运行命令以将数据从源数据库移动到目标 Timescale Cloud 服务的机器。

在移动数据之前

  • 创建一个目标 Timescale Cloud 服务

    每个 Timescale Cloud 服务都有一个支持 最流行的扩展 的单一数据库。Timescale Cloud 服务不支持表空间,并且没有与服务关联的超级用户。最佳实践是创建一个至少具有 8 个 CPU 的 Timescale Cloud 服务,以获得更流畅的体验。更高规格的实例可以显着缩短整体迁移窗口。

  • 为确保维护不会在迁移进行时运行,最佳实践是调整维护窗口

  • 在您的同步机器上安装 Docker。您需要至少一个 4 CPU/16GB 的 EC2 实例来运行 Livesync

  • 在您的同步机器上安装 PostgreSQL 客户端工具。

    这包括 psqlpg_dumppg_dumpall

  • Schema 不会通过 Livesync 迁移,您可以使用 pg_dump/restore 来迁移 schema
  • Schema 更改必须协调。首先在您的 Timescale Cloud 服务中进行兼容的 schema 更改,然后在源 PostgreSQL 实例中进行相同的更改。
  • 在大型表复制期间,源 PostgreSQL 实例上存在 WAL 卷增长。
  • 这仅适用于 PostgreSQL 数据库作为源。尚不支持 TimescaleDB。

SOURCE 连接中的 <user> 必须被授予 replication 角色才能创建复制槽。

这些变量保存源数据库和目标 Timescale Cloud 服务的连接信息。在迁移机器的终端中,设置以下内容

export SOURCE="postgres://<user>:<password>@<source host>:<source port>/<db_name>"
export TARGET="postgres://tsdbadmin:<PASSWORD>@<HOST>:<PORT>/tsdb?sslmode=require"

您可以在创建服务时下载的配置文件中找到 Timescale Cloud 服务的连接信息。

重要提示

避免使用通过 PgBouncer 或类似工具等连接池路由的连接字符串。此工具需要直接连接到数据库才能正常运行。

您需要在 PostgreSQL 源数据库上调整预写日志 (WAL)

要执行此操作:

psql $SOURCE -c "SET wal_level=’logical’;"
psql $SOURCE -c "SET max_wal_sender=10;"

副本标识通过识别正在修改的行来辅助数据复制。默认情况下,源数据库中的每个表和超表都默认为被复制表的主键。但是,您也可以拥有

  • 可行的唯一索引:每个表都有一个唯一的、非部分的、非延迟的索引,该索引仅包含标记为 NOT NULL 的列。如果 UNIQUE 索引不存在,请创建一个以辅助迁移。您可以在实时同步后删除它。对于每个表,将 REPLICA IDENTITY 设置为可行的唯一索引

    psql -X -d $SOURCE -c 'ALTER TABLE <table name> REPLICA IDENTITY USING INDEX <_index_name>'
  • 没有主键或可行的唯一索引:使用蛮力。对于每个表,将 REPLICA IDENTITY 设置为 FULL

    psql -X -d $SOURCE -c 'ALTER TABLE <table name> REPLICA IDENTITY FULL'

    对于每个 UPDATEDELETE 语句,PostgreSQL 会读取整个表以查找所有匹配的行。这会导致复制速度显着降低。如果您预计表上会有大量的 UPDATEDELETE 操作,最佳实践是不使用 FULL

要仅捕获 INSERT 并忽略 UPDATEDELETE,请在使用 创建发布 时使用 发布配置

使用 pg_dump 来

  1. 从源数据库下载 schema

    pg_dump $SOURCE \
    --no-privileges \
    --no-owner \
    --no-publications \
    --no-subscriptions \
    --no-table-access-method \
    --no-tablespaces \
    --schema-only \
    --file=schema.sql
  2. 在目标服务上应用 schema

    psql $TARGET -f schema.sql

为了提高查询和分析效率,您可以将包含时序数据或事件数据的表,以及已经使用 PostgreSQL 声明式分区进行分区的表,转换为 超表

  1. 将表转换为超表

    在目标 Timescale Cloud 服务中的每个表上运行以下命令以将其转换为超表

    psql -X -d $TARGET -c "SELECT create_hypertable('<table>', by_range('<partition column>', '<chunk interval>'::interval));"

    例如,要将 metrics 表转换为以 time 作为分区列,1 天作为分区间隔的超表

    psql -X -d $TARGET -c "SELECT create_hypertable('public.metrics', by_range('time', '1 day'::interval));"
  2. 将 PostgreSQL 分区转换为超表

    重命名分区并创建一个与分区表同名的新普通表,然后转换为超表

    psql $TARGET -f - <<EOF
    BEGIN;
    ALTER TABLE public.events RENAME TO events_part;
    CREATE TABLE public.events(LIKE public.events_part INCLUDING ALL);
    SELECT create_hypertable('public.events', by_range('time', '1 day'::interval));
    COMMIT;
    EOF

您可以使用 Livesync docker 镜像将 PostgreSQL 数据库实例的更改实时同步到 Timescale Cloud 服务

  1. 启动 Livesync

    由于您需要连续运行 Livesync,因此最佳实践是以后台进程运行它。

    docker run -d --rm --name livesync timescale/live-sync:v0.0.0-alpha.7 run --publication analytics --subscription livesync --source $SOURCE --target $TARGET
  2. 跟踪进度

    一旦 Livesync 作为 docker 守护程序运行,您还可以捕获日志

    docker logs -f livesync
  3. 查看正在同步的表

    psql $TARGET -c "SELECT * FROM _ts_live_sync.subscription_rel"
    subname | schemaname | tablename | rrelid | state | lsn
    ----------+------------+-----------+--------+-------+-----
    livesync | public | metrics | 17261 | d |

    state 的可能值有

    • d:初始表数据同步
    • f:初始表数据同步完成
    • s:追赶最新的更改
    • r:表已准备就绪,正在同步实时更改
  4. 停止 Livesync

    docker stop live-sync
  5. 清理

    您需要手动执行 SQL 代码片段来清理由 live-migration 创建的复制槽。

    psql $SOURCE -f - <<EOF
    select pg_drop_replication_slot(slot_name) from pg_stat_replication_slots where slot_name like 'livesync%';
    select pg_drop_replication_slot(slot_name) from pg_stat_replication_slots where slot_name like 'ts%';
    EOF

    清理命令即将推出。

在 Livesync docker 启动并运行后,您可以在 SOURCE 数据库上 CREATE PUBLICATION 以指定您打算同步的表列表。一旦您创建了 PUBLICATION,Livesync 会自动选取它,并开始同步作为其一部分表达的表。

例如

  1. 创建一个名为 analytics 的发布,它发布 metricstags

    PUBLICATION 使您能够添加 schema 中的所有表,甚至数据库中的所有表。但是,它在大多数托管 PostgreSQL 产品上都需要超级用户权限。

    CREATE PUBLICATION analytics FOR TABLE metrics, tags;
  2. 使用 ALTER PUBLICATION 调用向现有发布添加表

    ALTER PUBLICATION analytics ADD TABLE events;
  3. 发布 PostgreSQL 声明式分区表

    要将声明式分区表更改发布到您的 Timescale Cloud 服务,请将 publish_via_partition_root 特殊 PUBLICATION 配置设置为 true

    ALTER PUBLICATION analytics SET(publish_via_partition_root=true);
  4. 使用 DROP TABLE 调用停止同步 PUBLICATION 中的表

    ALTER PUBLICATION analytics DROP TABLE tags;

关键词

在此页面上发现问题?报告问题 或 在 GitHub 上编辑此页面