【问题标题】:Restoring a working MongoDB replica set from a EBS snapshot从 EBS 快照恢复工作的 MongoDB 副本集
【发布时间】:2020-12-09 23:17:25
【问题描述】:

我正在使用 Bitnami MongoDBMongoDB Helm Chart(版本 10.6.10,图像标记为 3.6.17-ol-7-r26)在 AWS 中运行 Kubernetes 下的 Mongo 集群,该集群最初是使用 Helm 创建的图表。我正在尝试使用EBS Snapshots 使备份正常工作,以便定期复制主要 MongoDB 成员的整个卷,以防万一发生某些事情,可以将其恢复到新的 MongoDB 安装(使用相同的 Helm 图表)。

目前我正在尝试获取一个备份过程,以便将快照放入一个新卷中,并且可以在同一个 Kubernetes 集群中创建一个新的 Mongo 命名空间,其中将挂载现有卷。这样我就可以从快照(Kubernetes Persistent Volume 和 Persistent Volume Claim)手动创建 Kubernetes 卷,并将它们与 MongoDB Helm 图表链接起来(因为那些 PV + PVC 包含正确的名称),然后启动 Mongo 服务器.

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

现在我想关注MongoDB documentation

  • 销毁现有副本集
  • 在 arbiter+slave 上重置默认设置
  • 从主/主创建副本集(主数据已到位)
  • 将仲裁器和从属设备附加到副本集以同步类似于文档中的数据。

从主要检查状态,我得到

{
    "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 图表,然后使用 Mongorestore 恢复数据库(所以基本上不使用 EBS 快照),或者有没有办法从现有快照/卷启动它,以便我可以使用 Helm Chart 和 EBS 快照。

【问题讨论】:

    标签: mongodb amazon-web-services kubernetes bitnami amazon-ebs


    【解决方案1】:

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

    首先,除了--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)
    

    谢谢!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-17
      • 2022-01-26
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 2015-07-07
      相关资源
      最近更新 更多