使用“/_replicate”端点启动持续复制时,如何启用“use_checkpoints=false”用于调试?
解读
在国内 CouchDB 面试中,这道题考察的是你对 持续复制(continuous replication) 与 检查点(checkpoint)机制 的理解深度。
面试官真正想听的是:
- 你知道 use_checkpoints=false 是调试利器,能强制 CouchDB 每次从头开始比对序列,跳过本地 checkpoint 文档;
- 你能把该参数 准确地写在 POST /_replicate 的 JSON 体内,而不是乱拼 URL;
- 你清楚 生产环境禁止长期关闭检查点,否则会造成 seq 扫描风暴,拖垮集群;
- 你能结合 国内常见的离线-优先移动场景 说明:只在排查“丢数据”或“seq 不一致”时临时关闭,调试完立即恢复。
知识点
- /_replicate 是 CouchDB 的 内置 HTTP 端点,接受 POST 方式触发复制任务;
- 持续复制 需指定 "continuous": true,CouchDB 会在后台保持长连接;
- 检查点(checkpoint) 默认开启,每 5 000 条文档或 5 min 把当前 seq 写入本地 _local 文档,减少下次比对量;
- use_checkpoints 是 可选布尔值,写在 JSON 请求体里,false 表示完全禁用检查点读写;
- 关闭后,每次重启复制都会从头扫描 changes feed,方便观察是否漏数据,但会 放大磁盘 IO 与网络流量;
- 国内私有云常把 source 与 target 放在不同可用区,关闭检查点调试时务必 临时调大 ulimit 与 file_descriptor,防止扫描过快打爆句柄数;
- 调试结束应 删除临时复制任务,再重建一条带 "use_checkpoints": true 的持续复制,避免集群长期高负载。
答案
向 /_replicate 端点发送标准 JSON 即可,模板如下:
POST http://localhost:5984/_replicate
Content-Type: application/json
{
"source": "http://user:pass@source.example.cn:5984/mydb",
"target": "http://user:pass@target.example.cn:5984/mydb",
"continuous": true,
"use_checkpoints": false
}
返回示例:
{"ok":true,"_local_id":"e34f2c6..."}
关键点:
- use_checkpoints 与 continuous 同级,放在最外层 JSON,不能写成 URL 参数;
- 若需临时调试,可再加 "worker_processes": 1 与 "connection_timeout": 30000,降低并发,方便抓包;
- 调试完成后,务必调用 DELETE /_replicator/{docid} 或通过 _replicator 数据库删除任务,再重建带检查点的复制,禁止长期关闭。
拓展思考
- 如果面试官追问“关闭检查点后仍看到 _local 文档”,你要答:
use_checkpoints=false 仅跳过读取与写入 checkpoint,不会阻止 CouchDB 创建空的 _local 初始文档,这是设计如此,不代表检查点生效。 - 若问到“国内跨城专线延迟高,关闭检查点会不会雪崩”,可答:
会。建议 先打开 use_checkpoints,配合 "checkpoint_interval": 1000 缩短周期,而不是直接关闭;
若必须关闭,应 限流 worker_processes 与 batch_size,并在 凌晨低峰期 操作。 - 面试官还可能让你对比 “/_replicate 一次性调用” 与 “/_replicator 数据库文档” 两种模式:
- /_replicate 是 瞬态 API,重启节点任务消失,适合调试;
- /_replicator 是 持久化文档,节点重启后自动重新调度,生产环境必须用后者,并在文档里写 "use_checkpoints": false 同样生效。