使用“/_replicate”端点启动持续复制时,如何启用“use_checkpoints=false”用于调试?

解读

在国内 CouchDB 面试中,这道题考察的是你对 持续复制(continuous replication)检查点(checkpoint)机制 的理解深度。
面试官真正想听的是:

  1. 你知道 use_checkpoints=false 是调试利器,能强制 CouchDB 每次从头开始比对序列,跳过本地 checkpoint 文档;
  2. 你能把该参数 准确地写在 POST /_replicate 的 JSON 体内,而不是乱拼 URL;
  3. 你清楚 生产环境禁止长期关闭检查点,否则会造成 seq 扫描风暴,拖垮集群;
  4. 你能结合 国内常见的离线-优先移动场景 说明:只在排查“丢数据”或“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 数据库删除任务,再重建带检查点的复制,禁止长期关闭

拓展思考

  1. 如果面试官追问“关闭检查点后仍看到 _local 文档”,你要答:
    use_checkpoints=false 仅跳过读取与写入 checkpoint,不会阻止 CouchDB 创建空的 _local 初始文档,这是设计如此,不代表检查点生效。
  2. 若问到“国内跨城专线延迟高,关闭检查点会不会雪崩”,可答:
    会。建议 先打开 use_checkpoints,配合 "checkpoint_interval": 1000 缩短周期,而不是直接关闭;
    若必须关闭,应 限流 worker_processes 与 batch_size,并在 凌晨低峰期 操作。
  3. 面试官还可能让你对比 “/_replicate 一次性调用”“/_replicator 数据库文档” 两种模式:
    • /_replicate瞬态 API,重启节点任务消失,适合调试;
    • /_replicator持久化文档,节点重启后自动重新调度,生产环境必须用后者,并在文档里写 "use_checkpoints": false 同样生效。