在 Fauxton 中如何一次性复制作业从源库到目标库并验证复制状态为“completed”?

解读

国内大多数 CouchDB 集群部署在内网,面试官真正想考察的是:

  1. 你是否能在 Fauxton 图形界面 里一次性发起复制,而不是写脚本;
  2. 你是否知道 复制文档的必填字段状态字段含义
  3. 你是否能在 无 root 权限 的测试环境里,用只读账号就能验证结果。
    一句话:既要“点得对”,又要“看得懂”。

知识点

  • _replicator 系统库:所有复制任务都以普通 JSON 文档形式存在于此,字段写错直接 404 或 400。
  • 一次性复制 vs 连续复制:一次性复制必须显式设置 "continuous": false(默认缺省就是 false,但写上更显专业)。
  • 必填字段sourcetarget 必须是完整 URL 或本地库名;若源库需认证,source 里要嵌 "headers": {"Authorization": "Basic ..."}
  • 状态字段_replicator 文档里实时回写的 "state" 字段 只有三种终态:"completed""failed""error""triggered" 只是中间态。
  • Fauxton 的 Replicator 向导:在 3.x 之后把“一次性”与“连续”两个单选按钮藏在了“Advanced Options”折叠面板里,很多候选人没展开就点“Replicate”,结果默认建了连续任务,状态一直跑不到 completed。

答案

  1. 登录 Fauxton,左上角切换至 “_replicator” 数据库。
  2. 点击 “Create Document”,手动输入如下一次性复制文档(示例把本地 db1 全量拉到 db2):
{
  "_id": "job_一次性演示",
  "source":  "http://127.0.0.1:5984/db1",
  "target":  "http://127.0.0.1:5984/db2",
  "continuous": false,
  "create_target": false,
  "owner":  "your_user"
}

若源库需认证,把 source 改成:

"source": {
  "url":  "http://127.0.0.1:5984/db1",
  "headers": {"Authorization": "Basic dXNlcjpwYXNz"}
}
  1. 保存后回到 “_replicator” 列表,刷新,看到刚建的文档,点进去。
  2. 等待 3–10 秒(视数据量),按 F5 强制刷新文档(Fauxton 不会自动轮询),直到 "state": "completed" 出现;若出现 "failed""error",展开 "history[0].reason" 查看具体报错。
  3. 切到 “target” 库,查看 “Database info” 中的 doc_count 与源库一致,即验证成功。

至此,一次性复制任务在 Fauxton 里发起并确认 completed 的全流程结束

拓展思考

  • 如果源库与目标库跨机房,网络抖动会导致状态卡在 "triggered",此时可在 "history" 数组里看 "start_time""last_update" 差值,超过 5 min 仍无 end_time 即可判定为 挂起,需检查 防火墙 5984 端口证书链
  • 国内部分金融客户禁用 _replicator 写权限,只允许 POST /_replicate 旧端点;此时 Fauxton 向导会 403,需要提前向运维申请 replicator 角色
  • 大于 2 GB 的一次性复制,建议先在 源库做 _compact 并把 _revs_limit 降到 20,减少 历史版本 传输量,可把 completed 时间缩短 40% 以上。