从 EBS 快照恢复工作 MongoDB 副本集

Restoring a working MongoDB replica set from a EBS snapshot

我正在使用 Bitnami MongoDB together with MongoDB Helm Chart (version 10.6.10, image tag being 3.6.17-ol-7-r26) to run a Mongo cluster in AWS under Kubernetes, which was initially created using the Helm chart. I am trying to get backups working using EBS Snapshots 以便定期复制主要 MongoDB 成员的整个卷,以防万一发生什么事可以恢复到新的 MongoDB 安装(使用相同的 Helm 图表)。

目前我正在尝试获得一个备份过程,以便将快照放入一个新的卷中,并且可以在同一个 Kubernetes 集群中创建一个新的 Mongo 命名空间,现有的卷将被安装。这有效,因此我能够从快照(Kubernetes Persistent Volume 和 Persistent Volume Claim)手动创建 Kubernetes 卷,并使用 MongoDB Helm 图表 link 它们(因为那些 PV + PVC 包含专有名称),并启动 Mongo 服务器。

但是,一旦 pods 运行ning(主要、次要和仲裁者),先前存在的副本集就位(我猜是旧的本地数据库)并且显然无法正常工作,因为它来自快照状态。

现在我想跟随MongoDB documentation

从主要检查状态,我得到

{
    "stateStr" : "REMOVED",
    "errmsg" : "Our replica set config is invalid or we are not a member of it",
    "codeName" : "InvalidReplicaSetConfig",
    .. other fields as well
}

因此副本集已降级。当我尝试删除本地数据库并将其移动到独立数据库时,我会得到

rs0:OTHER> rs.slaveOk()
rs0:OTHER> show dbs
admin       0.000GB
local       1.891GB
+ some actual databases for data, so I can see data is in place
rs0:OTHER> use local
switched to db local
rs0:OTHER> db.dropDatabase()
"errmsg" : "not authorized on local to execute command { dropDatabase: 1.0, .. few other fields .., $readPreference: { mode: \"secondaryPreferred\" }, $db: \"local\" }"
rs0:OTHER> db.grantRolesToUser('root', [{ role: 'root', db: 'local' }])
2020-12-08T18:25:31.103+0000 E QUERY    [thread1] Error: Primary stepped down while waiting for replication :

当我使用 Bitnami Helm 图表时,它有一些 Kubernetes 集群的启动参数,这些参数可能不同步,无法将其与现有卷 运行 同步,现有卷已经有一些配置到位。

所以我只是想知道我是否试图在这里做所有错误的事情,正确的解决方案是启动一个新的 MongoDB 图表,然后使用 [=44= 恢复数据库]restore(所以基本上不使用 EBS 快照),或者有没有办法从现有的 snapshot/volume 启动它,这样我就可以使用 Helm Chart 和 EBS 快照。

当使用现有数据恢复使用 bitnami/mongodb helm chart 创建的 Mongo 集群时,您需要在安装命令中设置一些值,以确保所有配置在 configmaps、secrets 之间同步, etc 和存储在该卷中的数据。

首先,除了 --set architecture=replicaset 之外,您还必须将现有 PVC 添加到图表中:

--set persistence.existingClaim=my-restored-pvc

如果您没有设置任何其他参数,例如 auth.usernameauth.database,您只需将 --set auth.rootPassword=$MONGODB_ROOT_PASSWORD--set auth.replicaSetKey=$MONGODB_REPLICA_SET_KEY 添加到您的安装命令和值必须是旧的实例值,可以通过

获取
$ export MONGODB_ROOT_PASSWORD=$(kubectl get secret --namespace default mongo-mongodb -o jsonpath="{.data.mongodb-root-password}" | base64 --decode)
$ export MONGODB_REPLICA_SET_KEY=$(kubectl get secret --namespace default mongo-mongodb -o jsonpath="{.data.mongodb-replica-set-key}" | base64 --decode)

另一方面,如果您设置了特定的授权参数,您还需要将这些值添加到图表中,例如:--set auth.password=$MONGODB_PASSWORD,auth.username=myuser,auth.database=mydatabase,您可以通过

获取它
$ export MONGODB_PASSWORD=$(kubectl get secret --namespace default mongo-mongodb -o jsonpath="{.data.mongodb-password}" | base64 --decode)

谢谢!