标签 数据同步 下的文章

本文章使用 Microsoft Copilot GPT-5.2 辅助写作。

前些日子在小红书刷到一篇帖子,吐槽 Overleaf 编译时间超过 10 秒就要收费。在评论区翻了翻,意外得知 中国科技云 提供了一个基于开源版 Overleaf 的在线服务,单次编译时间可免费使用 600 秒。出于好奇,我顺手探索了一下中国科技云,结果发现它居然还提供了一个 免费的 20G 存储(兼容 S3)

既然有现成的 S3,那不用来同步 Obsidian 就有点说不过去了。于是折腾了一番,用 Remotely Sync 插件成功把 Obsidian 接入了中国科技云的 S3。下面简单记录一下过程。


注册并创建 S3 存储桶

首先注册一个中国科技云账号

然后进入 数据胶囊 页面:

进入后,新建一个 数据空间

这里需要注意一点:“未命名” 只是别名,不是实际的桶名称

创建完成后,点击 客户端访问

在这里可以修改桶名,并创建一个 AccessKey,后面配置 Obsidian 时会用到,请妥善保存。


配置 Obsidian 的 Remotely Sync

接下来切换到 Obsidian。

  1. 打开设置 → 第三方插件

  2. 关闭安全模式,搜索并安装 Remotely Sync

同时也建议在 核心插件 中关闭 Obsidian 自带的同步功能,避免冲突。

插件安装完成后,按如下方式填写配置:

  • 服务地址(Endpoint)s3.cstcloud.cn

  • 区域(Region)us-east-1

  • Access Key ID / Access Key:填写刚才创建的

  • S3 URL Style:一定要选择 Path Style

配置完成后,点击 检查连接

如果一切顺利,就可以看到连接成功的提示了。至此,Obsidian 已经可以通过中国科技云的 S3 实现同步。


数据胶囊还支持 WebDAV 访问,也可以使用 WebDAV 接入更多应用。
文章很好,但怎么发成 wiki 了


📌 转载信息
原作者:
Gakusyun
转载时间:
2026/1/24 06:42:55

在 MySQL CDC 任务中,很多用户都会遇到这样的问题:任务失败后该从哪里恢复?只知道一个时间点,却拿不到对应的 binlog 位点怎么办?Apache SeaTunnel 2.3.12 通过引入按时间启动(Timestamp Startup)功能,给出了更直观的答案。

本文围绕该能力的设计背景、配置方式与实现机制展开解析,帮助读者理解如何基于时间语义更高效地进行 CDC 任务恢复与数据回溯。

功能概述

Problem:CDC 启动点配置“技术正确,但使用困难”

在 Apache SeaTunnel 2.3.12 之前,MySQL CDC 连接器主要支持从指定 binlog 位点(file + position)或 GTID 启动数据同步任务。这种方式在实现上是精确且可靠的,但在真实生产与运维场景中,往往并不符合用户的使用习惯。

在实际 CDC 运维过程中,用户更容易掌握的是 “时间”,而非底层 binlog 细节,例如:

  • 任务异常中断后,希望从
    “2024-04-01 10:00:00” 之后继续同步
  • 对某一时间窗口的数据进行回溯或补采
  • 只知道“昨天 08:00 之后的变更需要重新同步”,但无法定位对应的 binlog 文件和偏移量

如果仍要求用户手动将时间反推为 binlog 位点,不仅配置复杂,而且极易出错,也显著增加了运维成本。这种“技术友好、但用户不友好”的启动方式,已经成为 CDC 任务恢复和回溯场景中的常见痛点。

Solution:引入按时间启动

为解决上述问题,Apache SeaTunnel 在 2.3.12 版本中为 MySQL CDC 连接器引入了按时间启动功能

该功能允许用户直接指定一个 Unix 时间戳(毫秒级) 作为同步起始点。MySQL CDC 连接器会在启动阶段自动完成以下工作:

  1. 根据指定时间戳定位对应的 binlog 文件与偏移量
  2. 从该 binlog 位置开始读取变更事件
  3. 自动跳过所有早于该时间点的历史事件

通过引入“时间”这一更符合业务语义的维度,SeaTunnel 将 CDC 启动方式从面向底层 binlog 细节,提升为面向业务时间语义,显著降低了 CDC 任务在恢复、回溯和运维场景下的使用门槛。

配置参数

要启用按时间启动功能,需要配置以下两个关键参数:

参数名类型必填说明
startup.modeEnum设置为 "timestamp" 启用时间模式 2
startup.timestampLongUnix 时间戳(毫秒),指定启动时间点 3

配置示例

env {
  parallelism = 1
  job.mode = "STREAMING"
  checkpoint.interval = 10000
}

source {
  MySQL-CDC {
    url = "jdbc:mysql://localhost:3306/testdb"
    username = "root"
    password = "root@123"
    table-names = ["testdb.table1"]
    
    # 启用按时间启动
    startup.mode = "timestamp"
    startup.timestamp = 1672531200000  # 2023-01-01 00:00:00 UTC
  }
}

sink {
  Console {
  }
}

技术实现

启动模式枚举

MySqlSourceOptions 类中定义了所有支持的启动模式,包括新增的 TIMESTAMP 模式:

public static final SingleChoiceOption<StartupMode> STARTUP_MODE =
    (SingleChoiceOption)
        Options.key(SourceOptions.STARTUP_MODE_KEY)
            .singleChoice(
                StartupMode.class,
                Arrays.asList(
                    StartupMode.INITIAL,
                    StartupMode.EARLIEST,
                    StartupMode.LATEST,
                    StartupMode.SPECIFIC,
                    StartupMode.TIMESTAMP))

时间戳过滤实现

核心实现在 MySqlBinlogFetchTask 类中,当检测到启动模式为 TIMESTAMP 时,会使用 TimestampFilterMySqlStreamingChangeEventSource 来处理 binlog 事件:

StartupMode startupMode = startupConfig.getStartupMode();
if (startupMode.equals(StartupMode.TIMESTAMP)) {
    log.info(
        "Starting MySQL binlog reader,with timestamp filter {}",
        startupConfig.getTimestamp());

    mySqlStreamingChangeEventSource =
        new TimestampFilterMySqlStreamingChangeEventSource(
            sourceFetchContext.getDbzConnectorConfig(),
            sourceFetchContext.getConnection(),
            sourceFetchContext.getDispatcher(),
            sourceFetchContext.getErrorHandler(),
            Clock.SYSTEM,
            sourceFetchContext.getTaskContext(),
            sourceFetchContext.getStreamingChangeEventSourceMetrics(),
            startupConfig.getTimestamp());
}

偏移量计算

MySqlSourceFetchTaskContext 中实现了根据时间戳查找对应 binlog 偏移量的逻辑:

private Offset getInitOffset(SourceSplitBase mySqlSplit) {
    StartupMode startupMode = getSourceConfig().getStartupConfig().getStartupMode();
    if (startupMode.equals(StartupMode.TIMESTAMP)) {
        long timestamp = getSourceConfig().getStartupConfig().getTimestamp();
        try (JdbcConnection jdbcConnection =
                getDataSourceDialect().openJdbcConnection(getSourceConfig())) {
            return findBinlogOffsetBytimestamp(jdbcConnection, binaryLogClient, timestamp);
        } catch (Exception e) {
            throw new SeaTunnelException(e);
        }
    } else {
        return mySqlSplit.asIncrementalSplit().getStartupOffset();
    }
}

启动模式对比与适用场景

为了更好地理解按时间启动功能在整体 CDC 启动体系中的定位,下面对 MySQL CDC 当前支持的几种启动模式进行对比说明:

启动模式启动依据优点适用场景
INITIAL全量 + 当前 binlog一次性完成历史与增量同步首次接入数据源
EARLIEST最早可用 binlog不依赖具体位点binlog 保存周期较长的场景
LATEST当前最新 binlog启动快仅关注未来增量数据
SPECIFIC指定 binlog file + position精确可控已明确掌握 binlog 位点的场景
TIMESTAMP指定时间戳(毫秒)配置直观、符合业务语义任务恢复、数据回溯、按时间窗口同步

可以看到,TIMESTAMP 模式并不是替代 SPECIFIC 或 GTID 的“更底层”方案,而是为了解决“用户只知道时间、不知道 binlog”的典型问题,是一种以可用性和运维友好性为核心的补充能力

测试验证

该功能在集成测试中得到了充分验证,测试用例 MysqlCDCSpecificStartingOffsetIT 验证了按时间戳启动的正确性 7

使用注意事项

  1. 版本要求:需要 SeaTunnel 2.3.12 或更高版本
  2. 时间戳格式:必须使用 Unix 时间戳,单位为毫秒
  3. binlog 可用性:确保指定时间点对应的 binlog 文件仍然可用
  4. 时区考虑:时间戳基于 UTC 时区,需要注意时区转换

总结

SeaTunnel MySQL CDC 的按时间启动功能为数据同步提供了更精确的控制能力,特别适用于需要从特定时间点恢复数据同步的场景。该功能通过时间戳到 binlog 偏移量的转换,实现了高效的时间点定位和数据过滤。

Notes

  • 该功能在工厂类 MySqlIncrementalSourceFactory 中通过条件配置规则进行参数验证
  • 除了 MySQL CDC,其他 CDC 连接器如 SQL Server CDC 也支持类似的时间戳启动功能

ALL API Hub 是一个非常好用的能管理多个 API 中转站的浏览器扩展程序,原帖链接:All-API-Hub:开源 AI 中转站集中管理和自己的 New API 增强管理,基于 one-api-hub 大幅重构增强 - #362,来自 freemutation

我有多台设备同步需求,但是又没有 webdav,所以简单弄了个转换程序,可以使用 Github Gist 同步

注意:使用公共服务请确保 token 仅包含 Gist 权限


📌 转载信息
原作者:
Ceb
转载时间:
2026/1/4 09:57:00

ALL API Hub 是一个非常好用的能管理多个 API 中转站的浏览器扩展程序,原帖链接:All-API-Hub:开源 AI 中转站集中管理和自己的 New API 增强管理,基于 one-api-hub 大幅重构增强 - #362,来自 freemutation

我有多台设备同步需求,但是又没有 webdav,所以简单弄了个转换程序,可以使用 Github Gist 同步

注意:使用公共服务请确保 token 仅包含 Gist 权限


📌 转载信息
原作者:
Ceb
转载时间:
2026/1/3 21:21:49