AI エージェント向け: ドキュメントインデックスは https://www.mongodb.com/ja-jp/docs/llms.txt で利用できます。すべてのページの markdown バージョンは、いずれかの URL パスに .md を追加することで利用できます。

アプリケーションデータベースを外部配置に移行する

内部でマネージドされるアプリケーションデータベースを使用する MongoDB Ops Manager リソースを、外部アプリケーションデータベースを使用するリソースに変換できます。これは、spec.role が AppDB に設定されている MongoDB カスタムリソースです。これにより、Ops Manager はアプリケーションデータベースをバックアップおよび復元することができます。詳細については、MongoDB Ops Manager アプリケーションデータベースのバックアップ。を参照してください。

この移行により、既存のアプリケーションデータベースStatefulSetとその永続ボリュームの所有権が、MongoDB Ops ManagerリソースからMongoDBリソースに再割り当てされます。Kubernetes演算子はデータを移動または再作成せず、MongoDB Ops Managerポッドを再起動しません。

MongoDB Ops Manager リソースは、内部でマネージドされるアプリケーションデータベースを使用して始まります。また、Kubernetes 演算子は、<primary-om-name>-db という名前の StatefulSet を所有します。移行は次のように進行します。

  1. を に設定し、StatefulSet と同じ名前を持つ MongoDBspec.role AppDBリソースを、マネジメント Ops Manager インスタンスがマネージドするプロジェクト内に作成します。MongoDB リソースはまだ StatefulSet の所有権を取得できないため、アプリケーションデータベース StatefulSet の所有権を取得できないというメッセージが表示され、Pending フェーズのままになります。

  2. spec.externalApplicationDatabaseRefをMongoDB Ops Managerリソースに追加します。Kubernetes 演算子は、MongoDB Ops Managerリソースのオーナー参照を除き、StatefulSetを移行の準備完了としてマークすることで、StatefulSetを切り離します。その後、MongoDBリソースがその所有権を取得します。

Kubernetes 演算子は以前と同じ接続文字列を計算し、同じホスト名を使用するため、Ops Managerポッドは再起動しません。

始める前に、次のタスクを完了してください。

移行する前に、次の検討事項を検討してください。

  • MongoDB リソースに設定するアプリケーションデータベースのバージョンは、内部でマネージドされているアプリケーションデータベースが実行するバージョンと一致している必要があります。また、マネジメント MongoDB Ops Manager インスタンスが提供する MongoDB のバージョンである必要があります。

  • Kubernetes 演算子は移行時に spec.applicationDatabase.passwordSecretKeyRef をサポートしていません。Kubernetes 演算子は新しいパスワードを生成し、提供したパスワードをローテーションします。

  • MongoDBリソース構成が、異なるポッドテンプレートや異なるコンテナセットなど、内部でマネージドされているアプリケーションデータベース構成と異なる場合、アプリケーションデータベースは1〜2分間利用できなくなる可能性があります。2つの構成が意味的に同一である場合、アプリケーションデータベースは利用可能なままです。

  • マルチクラスターのアプリケーション データベースを移行するには、内部で管理されるアプリケーション データベースがspec.applicationDatabase.topology をMultiCluster に設定し、外部のアプリケーション データベースが MongoDB MultiClusterリソースである必要があります。現在のアプリケーション データベースのトポロジーが外部アプリケーション データベースの種類と一致しない場合、 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. プライマリ MongoDB Ops Manager リソースとその内部でマネージドされているアプリケーションデータベースが Running フェーズであることを確認します。

    kubectl get om "${PRIMARY_OM_NAME}" --context "${K8S_CTX}" -n "${MDB_NS}" \ -o jsonpath='{.status.opsManager.phase} / appdb={.status.applicationDatabase.phase}{"\n"}'
  2. 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} を返します。

3

orgIdの値が必要です。空のstringに設定すると、Kubernetes 演算子 はプロジェクトと同じ名前で組織を作成します。

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

既存のアプリケーションデータベースStatefulSetと同じ名前をリソースに付けます。

kubectl apply --context "${K8S_CTX}" -n "${MDB_NS}" -f - <<EOFapiVersion: mongodb.com/v1kind: MongoDBmetadata: 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: trueEOF
5

MongoDB Ops Manager リソースが StatefulSet を解放するまで、MongoDB リソースは Pending フェーズにとどまります。これは予期される動作ですので、エラーではありません。

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

ステータスメッセージによると、リソースはアプリケーションデータベース StatefulSet の所有権を取得できません。

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

同じパッチ内で spec.applicationDatabase を除くことができます。そのままにしておいても影響はありません。spec.externalApplicationDatabaseRef を設定すると、Kubernetes 演算子はこのリソースの内部アプリケーションデータベースの管理を停止します。

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. 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} を返します。

  2. MongoDB Ops Manager リソースがアプリケーションデータベースを Disabled として報告していることを確認します。これは、Kubernetes 演算子がその内部アプリケーションデータベースをもはやマネージドしていないことを意味します。

    kubectl get om "${PRIMARY_OM_NAME}" --context "${K8S_CTX}" -n "${MDB_NS}" \ -o jsonpath='{.status.applicationDatabase.phase}{"\n"}'
  3. MongoDB Ops Manager ポッドの経過時間と再起動回数を確認し、再起動していないことを確認します。

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

プライマリ Ops Managerリソースが内部で管理されるマルチクラスター アプリケーション データベースを使用する場合は、それを外部の MongoDB MultiClusterリソースに移行できます 。 Kubernetes Operator は各ノードクラスター内のアプリケーション データベース ステートメントをデタッチし、MongoDB MultiClusterリソースはそれぞれを採用します。接続文字列が変更されないため、Ops Manager ポッドは再起動しません。

この手順は、次の違いを除いて、このページの単一クラスターの手順と一致します。

  • 内部で管理されるアプリケーション データベースは、spec.applicationDatabase.topology を MultiCluster に設定する必要があります。

  • 外部アプリケーションspec.role AppDBデータベースは、 が に設定され、名前、ノード、および TLS 構成が内部で管理されるアプリケーション データベースと同じ MongoDB MultiClusterリソースである必要があります。マルチクラスターの外部アプリケーションデータベースでは、サービスメトリクスの有無にかかわらず、TLS暗号化とメンバークラスター間のクロスクラスターネットワークが必要です。詳細については、「 マルチクラスターの外部アプリケーション データベースの配置 」を参照してください。

  • kindMongoDBMultiClusterspec.externalApplicationDatabaseRefを追加するときに、 を に設定します。

    kubectl patch om "${PRIMARY_OM_NAME}" \ --context "${K8S_CTX}" -n "${MDB_NS}" \ --type merge \ -p "{\"spec\":{\"externalApplicationDatabaseRef\":{\"name\":\"${APPDB_NAME}\",\"kind\":\"MongoDBMultiCluster\"}}}"
  • Kubernetes Operator は、各ノード クラスターで所有権の引き継ぎを実行します。移行を確認するには、<primary-om-name>-db-<cluster-index>という名前の各ノードクラスターのアプリケーション データベース ステートメントを調べます。

    kubectl get statefulset "${APPDB_NAME}-0" --context "${K8S_CTX_MEMBER}" -n "${MDB_NS}" \ -o jsonpath='{.metadata.labels.mongodbmulticluster}{"\n"}'

    このコマンドは<namespace>-<appdb-name> を返し、mongodb.com/appdb-migration-ready 注釈はクリアされます。マルチクラスター配置での所有権の追跡の詳細については、「 移行注釈 」を参照してください。

MongoDBリソースがFailedを報告し、MongoDBバージョンが利用できないというメッセージが表示される場合は、spec.versionをマネジメントMongoDB Ops Managerインスタンスが提供するバージョンに設定し、MongoDB Ops Managerバージョンとアプリケーションデータベースバージョンを同じメジャーバージョンに維持してください。

Kubernetes 演算子は、MongoDB リソースが StatefulSet の所有権を取得できるようになる前に、StatefulSet を切り離す必要があります。プライマリ MongoDB Ops Manager リソースに spec.externalApplicationDatabaseRef を適用したことを確認します。また、 spec.externalApplicationDatabaseRef.name の値が正確に <primary-om-name>-db であることを確認します。

MongoDB リソースがプロジェクトまたは登録エラーが発生した状態で Pending フェーズにとどまったままになる場合、リソースを作成した時点でマネジメント MongoDB Ops Manager パブリック API の準備ができていなかった可能性があります。マネジメント MongoDB Ops Manager リソースが Running フェーズにあること、およびその API がリクエストに答えることを確認します。その後、リソースを再調整します。

MongoDB Ops Manager ポッドが再起動すると、計算された接続文字列が変更されます。デフォルトのポートを使用するレプリカセットの場合、接続文字列は移行前と移行後で同じです。Kubernetes 演算子 は、この移行でデフォルト以外のポートをサポートしていません。