如何平滑升级?

解读

在国内生产环境中,CouchDB 常被用作离线优先业务(如零售门店、物流 PDA、政务移动执法)的中央同步节点,“平滑” 的核心含义是:升级过程对终端用户零感知、对同步会话零中断、对业务数据零丢失,同时满足等保 2.0 审计和央企/国企的变更窗口要求(通常≤30 分钟)。面试官想考察的是:你是否能把开源社区的“rolling upgrade”理论落地到国内真实的灰度、回滚、报备、观测场景里。

知识点

  1. 版本路线:CouchDB 3.x 起采用 Erlang/OTP 23+,与 2.x 不兼容,需先确认 Erlang 版本;国内镜像源(清华、中科大)滞后官方 1~3 天,需提前做离线包校验。
  2. 集群拓扑:国内主流部署为“3+2”模式——3 节点 CouchDB 集群 + 2 节点 HAProxy(keepalived),升级顺序必须是 HAProxy→CouchDB 节点→视图压缩→清理
  3. 复制与分片:升级期间若触发跨 DC 的“filtered replication”,需把 worker_batch_size 降到 200 以内,防止 mobile 端因 checkpoint_interval 过长而重传。
  4. 国产操作系统适配:麒麟 V10、UOS 20 自带 SELinux 策略对 5984 端口有默认限制,需提前写本地策略模块,否则升级后首次重启会被审计拦截。
  5. 回滚基线:国内监管要求“可回滚到任意 30 秒前的数据状态”,因此升级前必须对 /opt/couchdb/data/opt/couchdb/views 做 LVM 快照,并验证 couchup 脚本能 5 分钟内完成单节点回滚。

答案

第一步 变更评审
在 Jira/禅道提交“三级变更”工单,附上《CouchDB 版本兼容性矩阵》《回滚测试报告》,经运维、安全、业务三方签字。

第二步 离线包准备
从国内镜像拉取 couchdb-3.3.2-1.el8.x86_64.rpm 与对应 erlang-23.3.4.11-1.el8.x86_64.rpm,用 rpm -K 校验签名,上传至内网 Nexus 仓库;编写 Ansible playbook,将 yum localinstall 超时设为 600 秒,防止国企内网慢导致 SSH 中断。

第三步 预检查

  1. curl -u admin:<pwd> http://node1:5984/_up 确认所有节点 status=ok;
  2. 执行 GET /_node/_local/_system 检查 memory_usage < 80%,否则先触发 couchdb compaction
  3. 通过 GET /_scheduler/jobs 确认移动端同步任务 < 100 个,避免升级期间大量重试。

第四步 滚动升级

  1. 在 HAProxy 摘掉 node1(权重置 0),等待 30 秒长连接耗尽;
  2. 登录 node1 systemctl stop couchdb,备份 dataetc 目录;
  3. yum localinstall 新版 RPM,禁止直接 rpm -U,防止旧配置被覆盖;
  4. 修改 /opt/couchdb/etc/local.iniuuid = <旧值>,确保集群 uuid 不变;
  5. systemctl start couchdb,用 /_up 接口等待 status=okversion=3.3.2
  6. 观察 /_stats/couch_log 中 error=0,再把 HAProxy 权重恢复;
  7. 依次对 node2、node3 重复以上步骤,每节点间隔≥10 分钟,方便观测。

第五步 视图重建与压缩
升级后视图索引格式变化,需执行
curl -X POST -u admin:<pwd> http://node1:5984/<db>/_compact
随后触发 /_view_cleanup,用 /_active_tasks 监控进度,禁止在白天高峰执行,通常放在 02:00-04:00。

第六步 回归与留观

  1. 用内部 Python 脚本跑 2000 条 CRUD 用例,QPS 与 RT 与基线差异 < 5%;
  2. 移动端 100 台样机离线写 1000 条 doc,再联网同步,确认无冲突;
  3. 持续观察 24 小时,若 /_stats/httpd_status_codes 中 5xx 比例 > 0.1%,立即执行回滚。

第七步 回滚预案
若任一步失败,执行 lvconvert --merge /dev/vg_couchdb/snap_<node> 还原数据目录,再用 yum history undo <id> 回退 RPM,最后 systemctl start couchdb总时长控制在 5 分钟内,并同步更新 CMDB 状态。

拓展思考

  1. 跨大版本蓝绿方案:对于金融客户,监管不允许滚动,需搭建同等规格蓝集群,用 _replicate 做双向同步,切换时只改 DNS A 记录,RPO≈0,但需双倍资源。
  2. K8s 化升级:国内信创环境已出现 arm64 节点,CouchDB 3.3 官方镜像尚未支持,需基于 couchdb:3.3.2 做 multi-arch 构建,并用 StatefulSetOnDelete 策略手动滚动,注意 PVC 快照需调用麒麟自带的 lvm-provisioner
  3. Serverless 边缘场景:在省级政务云“省-市-县”三级节点里,县级节点硬件差异大,升级前需把 max_document_size 降到 16 MB,防止低端工控机 OOM;同时用 MQTT 心跳通知终端 APP 进入“只读缓存”模式,升级完再广播“可写”指令,实现真·离线优先平滑升级。