如何平滑升级?
解读
在国内生产环境中,CouchDB 常被用作离线优先业务(如零售门店、物流 PDA、政务移动执法)的中央同步节点,“平滑” 的核心含义是:升级过程对终端用户零感知、对同步会话零中断、对业务数据零丢失,同时满足等保 2.0 审计和央企/国企的变更窗口要求(通常≤30 分钟)。面试官想考察的是:你是否能把开源社区的“rolling upgrade”理论落地到国内真实的灰度、回滚、报备、观测场景里。
知识点
- 版本路线:CouchDB 3.x 起采用 Erlang/OTP 23+,与 2.x 不兼容,需先确认 Erlang 版本;国内镜像源(清华、中科大)滞后官方 1~3 天,需提前做离线包校验。
- 集群拓扑:国内主流部署为“3+2”模式——3 节点 CouchDB 集群 + 2 节点 HAProxy(keepalived),升级顺序必须是 HAProxy→CouchDB 节点→视图压缩→清理。
- 复制与分片:升级期间若触发跨 DC 的“filtered replication”,需把
worker_batch_size降到 200 以内,防止 mobile 端因checkpoint_interval过长而重传。 - 国产操作系统适配:麒麟 V10、UOS 20 自带 SELinux 策略对 5984 端口有默认限制,需提前写本地策略模块,否则升级后首次重启会被审计拦截。
- 回滚基线:国内监管要求“可回滚到任意 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 中断。
第三步 预检查
- 用
curl -u admin:<pwd> http://node1:5984/_up确认所有节点 status=ok; - 执行
GET /_node/_local/_system检查memory_usage< 80%,否则先触发couchdb compaction; - 通过
GET /_scheduler/jobs确认移动端同步任务 < 100 个,避免升级期间大量重试。
第四步 滚动升级
- 在 HAProxy 摘掉 node1(权重置 0),等待 30 秒长连接耗尽;
- 登录 node1
systemctl stop couchdb,备份data与etc目录; yum localinstall新版 RPM,禁止直接 rpm -U,防止旧配置被覆盖;- 修改
/opt/couchdb/etc/local.ini中uuid = <旧值>,确保集群 uuid 不变; systemctl start couchdb,用/_up接口等待status=ok且version=3.3.2;- 观察
/_stats/couch_log中 error=0,再把 HAProxy 权重恢复; - 依次对 node2、node3 重复以上步骤,每节点间隔≥10 分钟,方便观测。
第五步 视图重建与压缩
升级后视图索引格式变化,需执行
curl -X POST -u admin:<pwd> http://node1:5984/<db>/_compact
随后触发 /_view_cleanup,用 /_active_tasks 监控进度,禁止在白天高峰执行,通常放在 02:00-04:00。
第六步 回归与留观
- 用内部 Python 脚本跑 2000 条 CRUD 用例,QPS 与 RT 与基线差异 < 5%;
- 移动端 100 台样机离线写 1000 条 doc,再联网同步,确认无冲突;
- 持续观察 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 状态。
拓展思考
- 跨大版本蓝绿方案:对于金融客户,监管不允许滚动,需搭建同等规格蓝集群,用
_replicate做双向同步,切换时只改 DNS A 记录,RPO≈0,但需双倍资源。 - K8s 化升级:国内信创环境已出现 arm64 节点,CouchDB 3.3 官方镜像尚未支持,需基于
couchdb:3.3.2做 multi-arch 构建,并用StatefulSet的OnDelete策略手动滚动,注意 PVC 快照需调用麒麟自带的 lvm-provisioner。 - Serverless 边缘场景:在省级政务云“省-市-县”三级节点里,县级节点硬件差异大,升级前需把
max_document_size降到 16 MB,防止低端工控机 OOM;同时用 MQTT 心跳通知终端 APP 进入“只读缓存”模式,升级完再广播“可写”指令,实现真·离线优先平滑升级。