datanous-cdc 现可显式选择固定 datanous-cdc-worker 子进程。默认关闭,既有显式 bootstrap -create-slot、run-once [-ack-source] 入口保留。该能力独立于连接器 sourceIsolation:后者处理 SQL 发现、快照和 append-only 页,本组件处理已有 PostgreSQL CDC 的复制槽、导出初始快照、持久应用和显式 ACK。
运行边界
- 子进程只有
probe、bootstrap、run-once三个固定协议模式。没有任意 SQL、代码、文件路径、自动循环或自动重试接口。 - 父 CLI 把一条源 DSN、一条目标 DSN及必要的 stream、目标 schema、冻结 binding 和显式 create/ACK 选择通过私有 stdin 发送。环境、argv、配置文件路径、平台密钥、租约和其他源凭据不传入。
- 源 DSN 通过调用上下文进入已有 SQL/复制连接;目标 DSN只供子进程打开目标连接池。凭据不写入配置结果、stdout、公开请求摘要或诊断信息。
- 子进程原样复用
BootstrapPostgresCDC和RunPostgresCDCOnce。目标 state/receipts 的原事务和“持久提交后才允许源 ACK”的顺序保持不变。 - 源复制权限、publication、数据读取授权以及目标专属 schema 权限仍须由部署者提供;cgroup 不授予或代替数据库授权,也不限制远端数据库服务器本身的 CPU/RSS。
status始终由父 CLI 只读查询目标状态,不属于 cgroup 子进程。因此故障后不要求先恢复 worker 才能检查目标。它只返回与配置 binding 匹配的持久目标状态,不证明源槽当前状态。
配置
构建入口为 cmd/datanous-cdc-worker,发布名称 datanous-cdc-worker。需和父 CLI 使用同一版本,核对可信发布 SHA-256。
在现有完整 CDC 配置中增加下面的 isolation 字段。此片段不能替代现有 source、destinationDSNEnv、destinationSchema、stream、binding 配置:
{
"isolation": {
"enabled": true,
"workerPath": "/opt/datanous/datanous-cdc-worker",
"workerSHA256": "REPLACE_WITH_VERIFIED_64_LOWERCASE_HEX_DIGEST",
"cgroupParent": "/sys/fs/cgroup/datanous-cdc",
"memoryMaxBytes": 536870912,
"cpuQuotaMicros": 50000,
"cpuPeriodMicros": 100000,
"pidsMax": 32,
"timeoutMillis": 60000
}
}
Linux cgroup v2 委派、目录属主/权限、控制器、sealed memfd、FD执行、clone3和清理条件与《PKG001SQL采集进程隔离操作说明》一致。父目录必须由部署者提前准备;应用只操作本次随机子 cgroup,不更改其他进程的资源策略。
启用后先运行不访问数据库的真实隔离 probe,确认固定 worker 和内核执行条件;随后仅调用一次所选变更操作。不支持或配置不完整时拒绝,不回退到父进程执行。父 CLI 原 60 秒整体上限、内部 CDC 原有 45 秒操作限制继续有效;配置更大的 worker 超时不会放宽它们。
本地配置限 1 MiB,拒绝未知字段、同一 JSON 对象中的 Unicode 大小写等价重复键和过深结构。worker 请求和响应各限 64 KiB、每条 DSN 最多 16 KiB、JSON 最深 16 层、stderr 最多 4 KiB。冻结 binding 过大时在发送前拒绝,不能截断表或列清单。
原 CDC v1 支持的数据类型、非分区完整 publication、固定 relation OID/列/主键、50,000 行/16 MiB 目标状态、8 MiB 变更批等边界保持不变。隔离封装不扩展这些能力,也不代表持续生产 CDC 或企业吞吐 SLO 已验收。
调用与故障恢复
datanous-cdc -config /private/cdc.json -mode bootstrap -create-slot
datanous-cdc -config /private/cdc.json -mode run-once
datanous-cdc -config /private/cdc.json -mode run-once -ack-source
datanous-cdc -config /private/cdc.json -mode status
上述命令均需操作者显式选择;未提供 mode 不执行,bootstrap 未提供 -create-slot 不执行。未提供 -ack-source 时,run-once 只持久应用目标,不确认源位置。
父端验证响应 nonce、配置承诺摘要、stream、sourceID/version/systemID/database/slot/publication/generation、LSN格式、计数和 ACK 选择。公开摘要排除了两条 DSN,仅用于绑定这次配置承诺;它不是权威身份凭证。实际源 IDENTIFY_SYSTEM 和目录校验仍由原 CDC 实现执行。
超时、取消、OOM、输出丢失、无效响应、清理无法确认或父端写 stdout 失败,均不能推断数据库事务已回滚。 父 CLI 返回 bootstrap_not_confirmed_inspect_slot_and_destination 或 run_not_confirmed_inspect_durable_receipts_and_source,不自动重发变更调用。
出现上述状态后:
- 用
-mode status读取配置绑定的目标持久 LSN,并按目标 schema 检查 state/receipts;不要仅凭进程退出码判断提交结果。 - 在授权源侧检查该专属槽的
confirmed_flush_lsn和 active 状态;确保没有其他执行器使用同一槽。status输出的sourceAcknowledged=false只表示该 status 操作未执行或确认源 ACK,不表示源槽必然尚未推进。 - 核对目标持久位点与源槽后,才由操作者显式选择后续
run-once或run-once -ack-source。已有收据会验证重放,不能把未知收据当作重复初始化许可。 - bootstrap 响应未知时保留槽和目标用于核对。不要自动删除槽、重建槽、覆盖目标或循环 bootstrap。
cgroup 终止涵盖本次后代,且必须确认 populated 0 后才移除该目录。清理失败仍按未确认处理,保留管理员排查入口。此行为是可信固定 worker 的资源隔离,不是恶意代码文件/网络/系统调用沙箱或 MPC/TEE。
本地证据与 Linux gate
新的 fresh logical PostgreSQL 实例上已验证真实独立 worker:初始快照、insert/update/delete、目标提交但未 ACK、显式 ACK 后响应管道丢失、从目标和源槽核对、显式幂等恢复及收据不重复;同时通过原 CDC 4 项实机回归。专属槽/schema已删除,私有 PostgreSQL已停止且数据目录清理完成。
可复验:
python3 scripts/check-cdc-process-private.py
该脚本仅创建新的 .runtime/parallel-cdc-process-* 实例、非默认 loopback 端口,串行运行固定测试范围,检查专属资源清理,不改变既有数据库的 WAL 配置。
macOS 上 Linux cgroup gate 明确 skip。Linux worker/CLI和测试交叉编译通过,不等于 CPU/OOM/pids 物理验证通过。具备专属委派目录后执行:
DATANOUS_TEST_CGROUP_PARENT=/sys/fs/cgroup/datanous-test-delegation \
go test ./internal/cdcprocess -run TestCDCProcessLinuxProductionGate -count=1 -v
DATANOUS_TEST_CGROUP_PARENT=/sys/fs/cgroup/datanous-test-delegation \
go test ./internal/aggregateprocess \
-run 'TestLinuxExecutablePinnedAndSealed|TestLinuxPhysicalCgroupLimits' -count=1 -v
准确测试计数、命令和私有集群清理报告见 PKG001CDC进程隔离开发记录.json。