Para agentes de IA: hay un índice de documentación disponible en https://www.mongodb.com/es/docs/llms.txt — versiones en markdown de todas las páginas están disponibles agregando .md a cualquier ruta URL.
See how MongoDB 9.0 delivers up to 2x higher throughput.
MongoDB Branding Shape
Register now >
Docs Menu

Migrar una base de datos de la aplicación a una implementación externa

Puede convertir un recurso de MongoDB Ops Manager que utiliza una base de datos de la aplicación gestionada internamente en uno que utiliza una base de datos de la aplicación externa: un recurso personalizado de MongoDB con spec.role establecido en AppDB. Esto permite a MongoDB Ops Manager realizar copias de seguridad y restaurar la base de datos de la aplicación. Para obtener más información, consulte Realizar copias de seguridad de la base de datos de la aplicación de MongoDB Ops Manager.

La migración transfiere la propiedad del StatefulSet de la base de datos de la aplicación existente y sus volúmenes persistentes del recurso de Ops Manager al recurso de MongoDB. El operador de Kubernetes no mueve ni recrea los datos, ni reinicia los pods de Ops Manager.

El recurso de MongoDB Ops Manager comienza con una base de datos de la aplicación gestionada internamente, y el operador de Kubernetes posee un StatefulSet llamado <primary-om-name>-db. La migración procede de la siguiente manera:

  1. Usted crea un recurso de MongoDB con spec.role configurado como AppDB y con el mismo nombre que el StatefulSet, en un proyecto administrado por una instancia de Ops Manager. El recurso de MongoDB aún no puede tomar posesión del StatefulSet, por lo que permanece en la fase Pending con un mensaje que indica que no puede tomar posesión del StatefulSet de la base de datos de la aplicación.

  2. Se agrega spec.externalApplicationDatabaseRef al recurso del Administrador de operaciones. El operador de Kubernetes desvincula el StatefulSet eliminando la referencia de propietario del recurso del Administrador de operaciones y marcando el StatefulSet como listo para la migración. El recurso de MongoDB toma entonces la propiedad del mismo.

Debido a que el operador de Kubernetes calcula la misma cadena de conexión que antes, que utiliza los mismos nombres de host, los pods del administrador de operaciones no se reinician.

Antes de comenzar, cumpla con las siguientes tareas:

Revise las siguientes consideraciones antes de migrar:

  • La versión de la base de datos de la aplicación que configure en el recurso de MongoDB debe coincidir con la versión que ejecuta la base de datos de la aplicación administrada internamente, y debe ser una versión de MongoDB que ofrezca la instancia de administración de Ops Manager.

  • El Kubernetes operador no es compatible con spec.applicationDatabase.passwordSecretKeyRef durante la migración. El Kubernetes operador genera una nueva contraseña y rota cualquier contraseña que haya proporcionado.

  • La base de datos de la aplicación puede no estar disponible durante uno o dos minutos si la configuración de recursos de MongoDB difiere de la configuración de la base de datos de la aplicación gestionada internamente, por ejemplo, debido a una plantilla de pod o un conjunto de contenedores diferentes. Si ambas configuraciones son semánticamente idénticas, la base de datos de la aplicación permanece disponible.

  • El operador de Kubernetes solo admite la migración en un único clúster de Kubernetes.

1
export K8S_CTX="<your-kube-context>"
export MDB_NS="mongodb"
export MANAGEMENT_OM_NAME="management-om"
export PRIMARY_OM_NAME="primary-om"
export APPDB_NAME="${PRIMARY_OM_NAME}-db"
export APPDB_VERSION="8.0.5-ent"
export MANAGEMENT_OM_URL="http://${MANAGEMENT_OM_NAME}-svc.${MDB_NS}.svc.cluster.local:8080"
export MANAGEMENT_OM_ADMIN_KEY_SECRET="<your-operator-credentials-secret>"
export APPDB_PROJECT_CONFIGMAP="${APPDB_NAME}-config"
export APPDB_PROJECT_NAME="external-appdb"
2
  1. Confirme que el recurso principal de Ops Manager y su base de datos de aplicaciones gestionada internamente se encuentran en la fase Running:

    kubectl get om "${PRIMARY_OM_NAME}" --context "${K8S_CTX}" -n "${MDB_NS}" \
    -o jsonpath='{.status.opsManager.phase} / appdb={.status.applicationDatabase.phase}{"\n"}'
  2. Confirme que el recurso de MongoDB Ops Manager es propietario del StatefulSet de la base de datos de la aplicación:

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

    El comando devuelve MongoDBOpsManager/${PRIMARY_OM_NAME}.

3

El valor orgId es obligatorio. Si lo establece como una cadena vacía, el operador de Kubernetes creará una organización con el mismo nombre que su proyecto.

kubectl create configmap "${APPDB_PROJECT_CONFIGMAP}" \
--context "${K8S_CTX}" -n "${MDB_NS}" \
--from-literal=baseUrl="${MANAGEMENT_OM_URL}" \
--from-literal=projectName="${APPDB_PROJECT_NAME}" \
--from-literal=orgId=""
4

Asigne al recurso el mismo nombre que al StatefulSet de la base de datos de la aplicación existente.

kubectl apply --context "${K8S_CTX}" -n "${MDB_NS}" -f - <<EOF
apiVersion: mongodb.com/v1
kind: MongoDB
metadata:
name: ${APPDB_NAME}
spec:
members: 3
version: ${APPDB_VERSION}
type: ReplicaSet
role: AppDB
opsManager:
configMapRef:
name: ${APPDB_PROJECT_CONFIGMAP}
credentials: ${MANAGEMENT_OM_ADMIN_KEY_SECRET}
persistent: true
security:
authentication:
enabled: true
modes: ["SCRAM"]
ignoreUnknownUsers: true
EOF
5

Hasta que el recurso de MongoDB Ops Manager libere el StatefulSet, el recurso de MongoDB permanece en la fase Pending. Esto es lo esperado y no es un error.

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"}'

El mensaje de estado indica que el recurso no puede asumir la propiedad del StatefulSet de la base de datos de la aplicación.

6
kubectl patch om "${PRIMARY_OM_NAME}" \
--context "${K8S_CTX}" -n "${MDB_NS}" \
--type merge \
-p "{\"spec\":{\"externalApplicationDatabaseRef\":{\"name\":\"${APPDB_NAME}\",\"kind\":\"MongoDB\"}}}"

Puede remover spec.applicationDatabase en el mismo parche. Dejarlo en su lugar no tiene ningún efecto: una vez que configure spec.externalApplicationDatabaseRef, el operador de Kubernetes deja de administrar una base de datos de la aplicación interna para este recurso.

7
kubectl wait --for=jsonpath='{.status.phase}'=Running \
mdb/"${APPDB_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
8
  1. Confirme que el recurso MongoDB es propietario del StatefulSet de la base de datos de la aplicación:

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

    El comando devuelve MongoDB/${APPDB_NAME}.

  2. Confirme que el recurso de MongoDB Ops Manager informa su base de datos de la aplicación como Disabled, lo que significa que el operador de Kubernetes ya no gestiona una base de datos de la aplicación interna para él:

    kubectl get om "${PRIMARY_OM_NAME}" --context "${K8S_CTX}" -n "${MDB_NS}" \
    -o jsonpath='{.status.applicationDatabase.phase}{"\n"}'
  3. Confirme que los pods de Ops Manager no se hayan reiniciado comprobando su antigüedad y el número de reinicios:

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

Si el recurso MongoDB informa Failed con un mensaje que indica que la versión de MongoDB no está disponible, establezca spec.version en una versión que ofrezca la instancia de administración de Ops Manager y mantenga la versión de Ops Manager y la versión de Application Database en la misma versión principal.

El operador de Kubernetes debe desvincular el StatefulSet antes de que el recurso de MongoDB pueda tomar posesión de él. Confirme que ha aplicado spec.externalApplicationDatabaseRef al recurso primario de MongoDB Ops Manager y que el valor de spec.externalApplicationDatabaseRef.name es exactamente <primary-om-name>-db.

Si el recurso de MongoDB permanece en la fase Pending con un error de proyecto o registro, es posible que la API pública de administración de Ops Manager no estuviera lista cuando creó el recurso. Confirme que el recurso de administración de Ops Manager se encuentre en la fase Running y que su API responda a las solicitudes; luego, vuelva a conciliar el recurso.

Si los pods de Ops Manager se reinician, la cadena de conexión calculada cambia. Para un conjunto de réplicas que usa el puerto predeterminado, la cadena de conexión es idéntica antes y después de la migración. El operador de Kubernetes no admite puertos distintos al predeterminado para esta migración.