对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。

将外部应用程序数据库返回给 MongoDB Ops Manager

您可以将 外部应用程序数据库返回由 MongoDB Ops Manager 资源进行内部管理。MongoDB Ops Manager 资源接管现有的应用程序数据库 StatefulSet,然后,您删除托管该资源的 MongoDB 资源。Kubernetes 操作符不会移动或重新创建您的数据,也不会重启 MongoDB Ops Manager pod。

MongoDB Ops Manager 资源以外部应用程序数据库开始:一个 MongoDB 资源,其中 spec.role 设置为 AppDB,命名为 <primary-om-name>-db,并拥有应用程序数据库 StatefulSet。迁移如下进行:

  1. 您从 MongoDB Ops Manager 资源中删除 spec.externalApplicationDatabaseRef 并添加 spec.applicationDatabase。

  2. Kubernetes 操作符 要求 MongoDB 资源释放 StatefulSet。MongoDB 资源在等待 MongoDB Ops Manager 资源回收时报告 Pending 阶段。

  3. Kubernetes 操作符回收 StatefulSet 并将其托管作为内部应用程序数据库。由于连接字符串未变,Ops Manager Pod 不会重启。

  4. 您删除了 MongoDB 资源,该资源不再拥有任何内容。

警告

仅在 MongoDB Ops Manager 资源再次托管内部应用程序数据库后,才删除 MongoDB 资源。如果您在 MongoDB 资源仍拥有 StatefulSet 时将其删除,Kubernetes 将对应用程序数据库进行垃圾回收。从该状态恢复需要从保留的 持久卷声明 中重新创建应用程序数据库,这会导致停机并轮换应用程序数据库凭证。

在开始之前,请完成以下任务:

  • 安装 Kubernetes 操作符和 kubectl。要了解更多信息,请参阅 使用 Kubernetes 安装。

  • 确认主节点 (primary node in the replica set) Ops Manager 资源使用外部应用程序数据库:它将 spec.externalApplicationDatabaseRef 设置为命名为 <primary-om-name>-db 的 MongoDB 资源,它不设置 spec.applicationDatabase,并且它的 status.applicationDatabase.phase 报告 Disabled。

  • 确认 MongoDB 资源处于 Running 阶段,并拥有应用程序数据库 StatefulSet。

在迁移之前,请查看以下考虑因素:

  • 将 spec.applicationDatabase.version 设置为应用程序数据库已经运行的版本。重用相同版本可以保留相同的二进制文件和数据。不同版本在交接同时启动应用程序数据库升级。

  • Kubernetes Operator 不会删除它为外部应用程序数据库创建的 Ops Manager 项目。删除该项目会使应用程序数据库的历史指标无法读取,因此是否清理它由您决定。

1
export K8S_CTX="<your-kube-context>"
export MDB_NS="mongodb"
export PRIMARY_OM_NAME="primary-om"
export APPDB_NAME="${PRIMARY_OM_NAME}-db"
export APPDB_VERSION="8.0.5-ent"
2
  1. 确认 MongoDB Ops Manager 资源引用了外部应用程序数据库,并将其应用程序数据库报告为 Disabled:

    kubectl get om "${PRIMARY_OM_NAME}" --context "${K8S_CTX}" -n "${MDB_NS}" \
    -o jsonpath='ref={.spec.externalApplicationDatabaseRef.name} appdb={.status.applicationDatabase.phase}{"\n"}'
  2. 确认 MongoDB 资源拥有应用程序数据库 StatefulSet:

    kubectl get statefulset "${APPDB_NAME}" --context "${K8S_CTX}" -n "${MDB_NS}" \
    -o jsonpath='{range .metadata.ownerReferences[*]}{.kind}/{.name}{"\n"}{end}'

    该命令返回 MongoDB/${APPDB_NAME}。

3

此补丁删除 spec.externalApplicationDatabaseRef 并添加 spec.applicationDatabase

kubectl patch om "${PRIMARY_OM_NAME}" \
--context "${K8S_CTX}" -n "${MDB_NS}" \
--type merge \
-p "{\"spec\":{\"externalApplicationDatabaseRef\":null,\"applicationDatabase\":{\"members\":3,\"version\":\"${APPDB_VERSION}\"}}}"
4
  1. 确认 MongoDB 资源已释放 StatefulSet。该资源报告 Pending 阶段,并附带一条消息,说明它正在反向迁移到 MongoDB Ops Manager 资源:

    kubectl wait --for=jsonpath='{.status.phase}'=Pending \
    mdb/"${APPDB_NAME}" --context "${K8S_CTX}" -n "${MDB_NS}" --timeout=300s
    kubectl get mdb "${APPDB_NAME}" --context "${K8S_CTX}" -n "${MDB_NS}" \
    -o jsonpath='{.status.message}{"\n"}'
  2. 等待 MongoDB Ops Manager 资源再次管理内部应用程序数据库:

    kubectl wait --for=jsonpath='{.status.applicationDatabase.phase}'=Running \
    om/"${PRIMARY_OM_NAME}" --context "${K8S_CTX}" -n "${MDB_NS}" --timeout=1200s
    kubectl wait --for=jsonpath='{.status.opsManager.phase}'=Running \
    om/"${PRIMARY_OM_NAME}" --context "${K8S_CTX}" -n "${MDB_NS}" --timeout=1800s
5

仅在上一个步骤报告 applicationDatabase.phase=Running 后完成此步骤。

kubectl delete mdb "${APPDB_NAME}" \
--context "${K8S_CTX}" -n "${MDB_NS}" --wait=true --timeout=300s
6
  1. 确认 MongoDB Ops Manager 资源控制应用程序数据库 StatefulSet:

    kubectl get statefulset "${APPDB_NAME}" --context "${K8S_CTX}" -n "${MDB_NS}" \
    -o jsonpath='{range .metadata.ownerReferences[*]}{.kind}/{.name}{"\n"}{end}'

    该命令返回 MongoDBOpsManager/${PRIMARY_OM_NAME}。

  2. 确认 MongoDB Ops Manager 资源将其应用程序数据库报告为 Running,并且 MongoDB 资源不再存在:

    kubectl get om "${PRIMARY_OM_NAME}" --context "${K8S_CTX}" -n "${MDB_NS}" \
    -o jsonpath='{.status.applicationDatabase.phase}{"\n"}'
    kubectl get mdb --context "${K8S_CTX}" -n "${MDB_NS}"
  3. 通过检查 Ops Manager Pod 的运行时间和重启次数,确认它们没有重启:

    kubectl get pods --context "${K8S_CTX}" -n "${MDB_NS}"

如果 MongoDB 资源保持在 Running 阶段并且仍然拥有 StatefulSet,则 MongoDB Ops Manager 资源尚未请求发布。确认您的补丁集 spec.externalApplicationDatabaseRef 到 null 并添加了 spec.applicationDatabase.

将 spec.applicationDatabase.version 设置为应用程序数据库已经运行的版本,以便回收的 StatefulSet 保持相同的二进制文件。

如果您在 MongoDB 资源仍拥有 StatefulSet 时将其删除,Kubernetes 将对 StatefulSet 以及它与 MongoDB Ops Manager 资源共享的机密进行垃圾回收。要进行恢复,请从保留的 Persistent Volume Claims 中重新创建应用程序数据库。此路径会导致停机并轮换应用程序数据库凭证。要了解更多信息,请参阅MongoDB Ops Manager和 AppDB 资源的灾难恢复。

要再次使用外部应用程序数据库,请参阅将应用程序数据库迁移到外部部署。