MongoDB 更新主副本时副本集丢失数据库(Kubernetes + Bitnami Helm Chart)

MongoDB replicaset loses database when updating primary replica (Kubernetes + Bitnami Helm Chart)

我正在使用 Microk8s 和 bitnami helm chart here

我设置了一个包含 3 个副本的副本集 mongo-0(根据定义这是主要的),mongo-1 和 mongo-2

Bitnami 使副本集始终使用 mongo-0(如果可用)作为主副本。然而接下来可能会发生:我发现我需要更新节点,比方说增加存储。为此,我需要:

  1. 排空节点 运行 mongo-0。这会自动触发新的选举,假设 mongo-1 是新的主要成员。
  2. 我将向集群添加一个新节点(具有更多容量)。

这将使 mongodb 副本集将 mongo-0 pod 分配给新节点。但是,新节点是空的,所以我存储数据库的持久卷(比方说 /mnt/mongo)是空的。

我希望当前的主副本完成将数据库填充到新副本(mongo-0,因此它的持久卷),并且只有在完成后,才使 mongo-0 初级。

但是我看到 mongo-0 成为主节点,没有任何数据从以前的主节点复制到它,实际上删除了整个数据库,因为现在主节点声明数据库为空。

这怎么可能?我在这里错过了什么?

我不熟悉您的确切管理工具,但您描述的缩放过程是错误的。您不应在任何时候从副本集中删除 3 个节点中的 1 个,至少在生产环境中不应如此。

更换RS节点:

  1. 添加具有所需参数的第四个节点。
  2. 设置节点优先级,使您要删除的节点的优先级低于任何其他节点。
  3. 等待新添加的节点有可接受的replication lag.
  4. 确保主节点不是您要删除的节点。
  5. 从 RS 中删除要删除的节点。

我认为,期望通用软件自动确定#3 何时完成并正确地继续#4 是相当乐观的。也许 MongoDB 运营经理会那样做。

您的 post 包含许多关于 MongoDB 运作方式的其他错误陈述。例如,没有数据的节点不能成为有数据的副本集中的主节点。也许您还有其他配置问题,并且您实际上在您认为的单个部署中拥有独立的 nodes/multiple 副本集。