在 VMware 中如何静默文件系统并触发 VMware Tools 脚本?

解读

国内金融、政企、运营商的 CouchDB 集群普遍跑在 VMware vSphere 私有云里。
备份、克隆、在线迁移(vMotion)之前,必须静默文件系统(quiesce),保证数据库文件、视图索引、.couch 文件与 .view 文件在同一时间点处于一致状态;否则还原后可能出现**“视图索引损坏”“数据库头校验失败”,导致 CouchDB 启动报错。
VMware Tools 提供的
“自定义冻结/解冻脚本”**机制,是官方推荐的静默手段,也是面试官考察“你能否把数据库一致性要求落到虚拟化层”的核心考点。

知识点

  1. VMware 静默方式
    文件系统静默(quiesce filesystem):依赖 VMware Tools 的 VSS(Windows)或 vmxnet3 驱动配合冻结脚本(Linux/Unix)。
    内存快照(snapshot the virtual machine’s memory):仅保证崩溃一致性,不保证应用一致性,不满足 CouchDB 要求

  2. Linux 下静默流程
    ① 宿主机侧:备份软件调用 vSphere API,设置 quiesce = true, memory = false
    ② 客体内:open-vm-tools 收到 freeze 请求,依次执行
    /usr/sbin/pre-freeze-scriptfsfreeze -f → 快照 → fsfreeze -u/usr/sbin/post-thaw-script
    ③ 脚本返回 0 表示成功,非 0 则 vSphere 报“Quiesce operation failed”。

  3. CouchDB 一致性要点
    ‑ 必须落盘所有写操作(包括 _users、_replicator、_global_changes 等系统库);
    ‑ 视图索引(.view 文件)与主库(.couch)必须同一时间点
    ‑ 多节点集群需逐台静默,禁止并发快照,否则集群元数据可能不一致。

  4. 国内合规要求
    ‑ 等保 2.0 要求“备份数据可恢复性验证”,静默脚本需输出日志到 /var/log/couchdb/quiesce.log 并保存 6 个月;
    ‑ 金融规范(JR/T 0168)要求**“备份窗口内 RPO=0”**,脚本执行时间必须 < 30 s,否则触发告警。

答案

以 CentOS 7 + open-vm-tools 11.x + CouchDB 3.2 为例,给出可直接落地的步骤:

  1. 创建冻结脚本 /usr/sbin/pre-freeze-script

    #!/bin/bash
    LOG=/var/log/couchdb/quiesce.log
    echo "$(date '+%F %T') freeze start" >>$LOG
    # 1. 停止外部写入:切换到维护节点(若集群)
    curl -XPUT http://127.0.0.1:5986/_node/_local/_config/couchdb/maintenance_mode -d '"true"' -H "Content-Type: application/json"
    # 2. 触发 CouchDB 检查点,确保 .couch 落盘
    curl -XPOST http://127.0.0.1:5984/_ensure_full_commit -H "Content-Type: application/json"
    # 3. 同步文件系统缓存
    sync; echo 3 > /proc/sys/vm/drop_caches
    echo "$(date '+%F %T') freeze ready" >>$LOG
    exit 0
    
  2. 创建解冻脚本 /usr/sbin/post-thaw-script

    #!/bin/bash
    LOG=/var/log/couchdb/quiesce.log
    echo "$(date '+%F %T') thaw start" >>$LOG
    # 关闭维护模式
    curl -XPUT http://127.0.0.1:5986/_node/_local/_config/couchdb/maintenance_mode -d '"false"' -H "Content-Type: application/json"
    echo "$(date '+%F %T') thaw finish" >>$LOG
    exit 0
    
  3. 赋权并注册

    chmod 755 /usr/sbin/pre-freeze-script /usr/sbin/post-thaw-script
    # 无需额外注册,open-vm-tools 会自动调用
    
  4. 验证
    在 vCenter 手动生成“快照(静默)”→ 查看 /var/log/couchdb/quiesce.log 出现“freeze ready / thaw finish”即成功;
    同时 /var/log/vmware-vmsvc.log 中应无“Custom quiesce script failed”字样。

  5. 集群场景
    通过 Ansible 逐台执行快照,每台静默前先 PUT /_cluster_setup 把节点置为 maintenance,快照完再恢复,确保**“集群级一致性”**。

拓展思考

  1. 如果宿主机使用基于存储(H3C、华为 OceanStor)的硬件快照,仍需调用 VMware Tools 脚本吗?
    ‑ 需要。硬件快照只保证 LUN 级一致性,CouchDB 的视图索引与数据库文件可能跨多个 VMDK,必须依赖应用级静默脚本才能消除跨文件时间差。

  2. 当 CouchDB 与 Elasticsearch 共存同一虚拟机时,如何协同静默?
    ‑ 在 pre-freeze-script串行执行:
    ① 关闭 ES 写入 (/_flush/synced) → ② CouchDB 维护模式 → ③ 统一 sync → 快照;
    解冻时反向操作,保证**“多应用零丢失”**。

  3. 国内信创环境(鲲鹏 + 麒麟 V10)open-vm-tools 版本低,不支持原生 freeze 回调,怎么办?
    ‑ 改用 “软静默” 方案:备份软件通过 SSH 下发脚本,手动 fsfreeze,再调用 vSphere API 创建内存快照=false 的普通快照;
    ‑ 需在变更流程里明确记录“软静默”操作人、时间、结果,满足等保审计。