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(如果可用)作为主副本。然而接下来可能会发生:我发现我需要更新节点,比方说增加存储。为此,我需要:
- 排空节点 运行 mongo-0。这会自动触发新的选举,假设 mongo-1 是新的主要成员。
- 我将向集群添加一个新节点(具有更多容量)。
这将使 mongodb 副本集将 mongo-0 pod 分配给新节点。但是,新节点是空的,所以我存储数据库的持久卷(比方说 /mnt/mongo)是空的。
我希望当前的主副本完成将数据库填充到新副本(mongo-0,因此它的持久卷),并且只有在完成后,才使 mongo-0 初级。
但是我看到 mongo-0 成为主节点,没有任何数据从以前的主节点复制到它,实际上删除了整个数据库,因为现在主节点声明数据库为空。
这怎么可能?我在这里错过了什么?
我不熟悉您的确切管理工具,但您描述的缩放过程是错误的。您不应在任何时候从副本集中删除 3 个节点中的 1 个,至少在生产环境中不应如此。
更换RS节点:
- 添加具有所需参数的第四个节点。
- 设置节点优先级,使您要删除的节点的优先级低于任何其他节点。
- 等待新添加的节点有可接受的replication lag.
- 确保主节点不是您要删除的节点。
- 从 RS 中删除要删除的节点。
我认为,期望通用软件自动确定#3 何时完成并正确地继续#4 是相当乐观的。也许 MongoDB 运营经理会那样做。
您的 post 包含许多关于 MongoDB 运作方式的其他错误陈述。例如,没有数据的节点不能成为有数据的副本集中的主节点。也许您还有其他配置问题,并且您实际上在您认为的单个部署中拥有独立的 nodes/multiple 副本集。
我正在使用 Microk8s 和 bitnami helm chart here
我设置了一个包含 3 个副本的副本集 mongo-0(根据定义这是主要的),mongo-1 和 mongo-2
Bitnami 使副本集始终使用 mongo-0(如果可用)作为主副本。然而接下来可能会发生:我发现我需要更新节点,比方说增加存储。为此,我需要:
- 排空节点 运行 mongo-0。这会自动触发新的选举,假设 mongo-1 是新的主要成员。
- 我将向集群添加一个新节点(具有更多容量)。
这将使 mongodb 副本集将 mongo-0 pod 分配给新节点。但是,新节点是空的,所以我存储数据库的持久卷(比方说 /mnt/mongo)是空的。
我希望当前的主副本完成将数据库填充到新副本(mongo-0,因此它的持久卷),并且只有在完成后,才使 mongo-0 初级。
但是我看到 mongo-0 成为主节点,没有任何数据从以前的主节点复制到它,实际上删除了整个数据库,因为现在主节点声明数据库为空。
这怎么可能?我在这里错过了什么?
我不熟悉您的确切管理工具,但您描述的缩放过程是错误的。您不应在任何时候从副本集中删除 3 个节点中的 1 个,至少在生产环境中不应如此。
更换RS节点:
- 添加具有所需参数的第四个节点。
- 设置节点优先级,使您要删除的节点的优先级低于任何其他节点。
- 等待新添加的节点有可接受的replication lag.
- 确保主节点不是您要删除的节点。
- 从 RS 中删除要删除的节点。
我认为,期望通用软件自动确定#3 何时完成并正确地继续#4 是相当乐观的。也许 MongoDB 运营经理会那样做。
您的 post 包含许多关于 MongoDB 运作方式的其他错误陈述。例如,没有数据的节点不能成为有数据的副本集中的主节点。也许您还有其他配置问题,并且您实际上在您认为的单个部署中拥有独立的 nodes/multiple 副本集。