本组件为可组合、默认关闭的连接器能力。它把白名单 SQL 发现、完整快照读取和 PostgreSQL append-only 增量页读取交给固定子进程;父连接器保留平台认证、租约、签名、内容寻址产物写入和任务完成提交。
它限制采集子进程的 CPU、内存和进程数量,不等于源数据库服务器资源配额,不是任意代码、文件系统、网络或系统调用沙箱,也不是 MPC/TEE。
支持与边界
| 范围 | 行为 |
|---|---|
| PostgreSQL / MySQL / SQL Server 发现和快照 | 复用已有 SQL 驱动,只读取企业配置的表或视图;远端请求不能提供 SQL |
| PostgreSQL append-only incremental-page | 保留冻结 binding/checkpoint、跨页上界及 64 行分页;父端复验窗口和候选水位 |
| 文件、HTTP API 源 | sourceIsolation.enabled=true 时,发现和快照任务明确拒绝,不回退到父进程读取 |
| 加工管线、固定聚合 | 不受本配置保护;固定聚合另用 aggregateIsolation,加工管线不因此变成隔离执行 |
| CDC | 不属于 sourceIsolation;独立 CDC CLI 已另有可选 isolation,见《PKG001CDC进程隔离操作说明》 |
| 平台状态提交 | 仍在父连接器;子进程无平台密钥、租约或 ACK/保存接口 |
因此,应把此配置用于专用 SQL 连接器。需要文件/API 源时,应使用独立连接器及明确的配置边界,不能把本配置描述成全部数据源已隔离。
构建和配置
固定入口为 cmd/datanous-source-worker,发布名称为 datanous-source-worker。需构建与连接器同一版本的 Linux 可执行文件,校验发布摘要后部署到可信目录。新增 worker 不默认运行。
在已有企业 sources 配置中添加下列字段;路径和摘要必须换成实际部署值。示例不含真实凭据:
{
"root": "/srv/datanous/provider-data",
"connections": {
"warehouse": {
"kind": "postgres",
"dsnEnv": "SOURCE_READONLY_DSN",
"tables": ["public.approved_view"],
"readOnlyConfirmed": true
}
},
"sourceIsolation": {
"enabled": true,
"workerPath": "/opt/datanous/datanous-source-worker",
"workerSHA256": "REPLACE_WITH_VERIFIED_64_LOWERCASE_HEX_DIGEST",
"cgroupParent": "/sys/fs/cgroup/datanous-sources",
"memoryMaxBytes": 536870912,
"cpuQuotaMicros": 50000,
"cpuPeriodMicros": 100000,
"pidsMax": 32,
"timeoutMillis": 60000
}
}
凭据仍由父连接器按现有 dsnEnv 读取。每次调用只把该单一源 DSN 通过私有 stdin 帧交给 worker;worker 使用调用上下文传给驱动,不设置凭据环境变量。平台密钥、租约、整个 sources 配置、其他源 DSN、代理环境和个人 HOME 均不传入。
连接器启动时先在真实隔离条件下执行无数据库访问的 probe,验证 worker 版本、摘要、sealed-FD 执行和 cgroup/clone3 可用性。配置不完整、非 Linux、worker 摘要不符、控制器未委派、内核或容器策略不支持时启动拒绝;任务执行阶段再次检查,始终不静默回退。
Linux 前置条件
由部署管理员提供独立 cgroup v2 委派目录;应用不会自动开启父目录控制器,不会修改其他服务的 cgroup。目录必须属于连接器运行 UID、不得 group/world 可写,不允许路径符号链接,也不能使用 cgroup 挂载根目录。父目录的 cgroup.subtree_control 必须已开启 cpu memory pids。
内核/运行环境必须允许 sealed memfd、通过继承文件描述符执行、clone3 CLONE_INTO_CGROUP、cgroup.kill、memory.swap.max。容器只读 cgroup 或 seccomp 拦截 clone3 时拒绝运行。应通过实际启动 probe 检查,不能以 Linux 名称或内核版本推断验收通过。
每次任务只创建一个随机名称的专属子 cgroup,设置并读回 cpu.max、memory.max、memory.swap.max=0、pids.max、memory.oom.group=1。退出或异常时先终止该组全部后代,再确认 populated 0,最后校验目录身份并删除本次目录。无法确认清理时整次失败,不返回部分成功;应检查专属委派目录及服务权限,不得直接删除其他服务的 cgroup。
固定预算和结果绑定
- 请求为单个严格版本帧,最多 64 KiB;DSN 最多 16 KiB。未知字段、Unicode 大小写等价重复键、深度超过 16、尾随帧均拒绝。
- 响应最多 16 MiB;表单元格内容累计最多 8 MiB,单元格最多 1 MiB;最多 10 万行、200 字段。增量页最多 64 行。
- 此预算比原父进程 SQL 表读取的 64 MiB 内容预算更小。超限整次拒绝,不截断或推进水位;应配置受控视图或使用已支持的增量分页。没有新增任意 SQL 或自动切片功能。
- stderr 最多 4 KiB,仅丢弃/预算检查,不转发源驱动错误;stdout 只允许协议响应。错误和 panic 只返回安全阶段码。
- 父端检查 nonce、无凭据的请求绑定摘要、响应摘要、字段/行宽/字节/UTF-8、资源 schema,以及增量窗口/候选水位;重新计算规范 CSV 摘要并与生成的 manifest 核对,随后才进入既有平台完成流程。
timeoutMillis约束子进程传输执行阶段。源驱动已有读取超时及 PG 增量事务预算继续有效,但不承诺远端数据库的总资源隔离或生产 SLO。
sourceIsolation 可与 aggregateIsolation 组合使用,两者必须各自指向正确的固定 worker 与对应摘要。不能互换 worker 版本。
本地证据与集中验证
macOS 已完成普通及 race 定向协议测试、真实独立 worker CLI 对隔离 PostgreSQL 的发现/130 行快照/64-64-2-0 页读取/漂移拒绝、父 manifest 核对;旧固定聚合隔离兼容测试通过。另已在私有 MySQL 8.0.46 上使用随机数据库和 SELECT-only 用户验证实际 worker 发现/快照、超大整数及 DECIMAL 文本保真、父 manifest 和未授权表拒绝;服务器及私有数据已清理。Linux worker 与测试交叉编译通过。
这些结果不证明 Linux 物理 CPU/OOM/pids 限制已通过。本机 Linux gate 明确 skip。具有专属 Linux 委派目录后执行:
DATANOUS_TEST_CGROUP_PARENT=/sys/fs/cgroup/datanous-test-delegation \
go test ./internal/sourceworker -run TestSourceWorkerLinuxProductionGate -count=1 -v
DATANOUS_TEST_CGROUP_PARENT=/sys/fs/cgroup/datanous-test-delegation \
go test ./internal/aggregateprocess \
-run 'TestLinuxExecutablePinnedAndSealed|TestLinuxPhysicalCgroupLimits' -count=1 -v
第二组验证真实 CPU throttling、OOM kill、pids 拒绝及清理,不能使用 fake filesystem 代替。SQL Server 的真实只读源验收和企业容量测试仍需相应测试环境。MySQL 私有复验使用固定套件 python3 scripts/test-mysql-private.py --suite source-worker --race;不会接受任意 shell 测试命令。精确本地命令、计数和日志见同目录 PKG001SQL采集进程隔离开发记录.json。