您可以将 外部应用程序数据库返回由 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。迁移如下进行:
您从 MongoDB Ops Manager 资源中删除
spec.externalApplicationDatabaseRef并添加spec.applicationDatabase。Kubernetes 操作符 要求 MongoDB 资源释放 StatefulSet。MongoDB 资源在等待 MongoDB Ops Manager 资源回收时报告
Pending阶段。Kubernetes 操作符回收 StatefulSet 并将其托管作为内部应用程序数据库。由于连接字符串未变,Ops Manager Pod 不会重启。
您删除了 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。
Considerations
在迁移之前,请查看以下考虑因素:
将
spec.applicationDatabase.version设置为应用程序数据库已经运行的版本。重用相同版本可以保留相同的二进制文件和数据。不同版本在交接同时启动应用程序数据库升级。Kubernetes Operator 不会删除它为外部应用程序数据库创建的 Ops Manager 项目。删除该项目会使应用程序数据库的历史指标无法读取,因此是否清理它由您决定。
步骤
确认起始省/市/自治区。
确认 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"}' 确认 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}。
重新配置 MongoDB Ops Manager 资源,使用内部应用程序数据库。
此补丁删除 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}\"}}}"
等待 MongoDB Ops Manager 资源回收 StatefulSet。
确认 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"}' 等待 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
验证迁移。
确认 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}。确认 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}" 通过检查 Ops Manager Pod 的运行时间和重启次数,确认它们没有重启:
kubectl get pods --context "${K8S_CTX}" -n "${MDB_NS}"
常见迁移问题
MongoDB 资源不释放 StatefulSet
如果 MongoDB 资源保持在 Running 阶段并且仍然拥有 StatefulSet,则 MongoDB Ops Manager 资源尚未请求发布。确认您的补丁集 spec.externalApplicationDatabaseRef 到 null 并添加了 spec.applicationDatabase.
应用程序数据库版本不匹配
将 spec.applicationDatabase.version 设置为应用程序数据库已经运行的版本,以便回收的 StatefulSet 保持相同的二进制文件。
您过早删除了 MongoDB 资源
如果您在 MongoDB 资源仍拥有 StatefulSet 时将其删除,Kubernetes 将对 StatefulSet 以及它与 MongoDB Ops Manager 资源共享的机密进行垃圾回收。要进行恢复,请从保留的 Persistent Volume Claims 中重新创建应用程序数据库。此路径会导致停机并轮换应用程序数据库凭证。要了解更多信息,请参阅MongoDB Ops Manager和 AppDB 资源的灾难恢复。
后续步骤
要再次使用外部应用程序数据库,请参阅将应用程序数据库迁移到外部部署。