需要更改副本集的mongodb辅助节点中的存储dbpath

Posted

技术标签:

【中文标题】需要更改副本集的mongodb辅助节点中的存储dbpath【英文标题】:Need to change storage db path in mongo secondary node of replica set 【发布时间】:2022-01-22 18:05:17 【问题描述】:

我们有 3 个成员的 mongo db 副本集(MongoDB 服务器版本:4.2.9)。其中一个成员(辅助)正在默认存储数据库路径上运行,并且该存储几乎已满。我们需要更改 3 成员副本集的特定辅助节点的路径。我是 mongodb 的新手。我需要你的专业知识来完成这项任务。

MongoDB 服务器版本:4.2.9 操作系统版本:CentOS Linux release 7.8.2003 (Core)。

问候,

【问题讨论】:

可能是Perform Maintenance on Replicaset Members。 【参考方案1】:

选项1:(保留当前已经同步的数据)

    停止mongod服务:

    mongo --host xxxx --port yyyy  
    use admin
    db.shutdownServer()
    

    将数据从旧位置复制到新位置:

    cp -R /oldPath/ /newPath/
    

    在 /etc/mongodb.conf 中更改 dbPath 以指向新位置。

    启动mongodb服务。


选项 2) 初始化从其他成员同步成员。

与选项 1) 相同,只是省略第 2) 点,只是您需要等待直到成员初始化同步(复制数据)从其他成员,这取决于数据大小和压缩。


选项 3) 更好的高可用性:

    从 PRIMARY 成员中添加另一个将使用新路径的成员:

    rs.add("newMember:XXXX")
    

    等到新成员初始化同步。

    删除旧的 SECONDARY 成员:

    rs.remove("oldMember:YYYY")
    

    清理旧文件和配置。 (此选项的小缺点是,如果在同一主机上,您需要更改新成员的端口)

选项 2) 似乎最适合您的情况...

【讨论】:

感谢您提供的解决方案。关于使用选项# 2 的另一个问题。init.sync 进程是否会自动启动以进行同步,或者我们必须以任何方式启动它。如果我们必须通过设置任何参数或执行任何命令手动启动 init.sync,请与我们分享步骤/文档。 mongo 会识别出 data 文件夹是空的,并会自动启动 init 进程,所以你不需要做任何事情来触发进程...,你可以通过 rs.status( ) 不时查看会员何时再次成为 SECONDARY ... 非常感谢。您提供的解决方案工作正常,除了一件事。当我们应用选项#2 中提供的解决方案时,PRIMARY 角色被分配给剩余的 SECONDARY,而 PRIMARY 成为 SECONDARY。能否请您为我们解释一下。 啊,在停止 PRIMARY 成员以使用 rs.stepDown() 将它们切换到 SECONDARY 之前更安全,以避免在关闭期间进行选举,所以如果你的成员是 PRIMARY,那么当你停止它时,另一个成员将触发选举过程并投票给新的 PRIMARY(接受写入的成员),即使您将成员切换为 HIDDEN 也是最好的,这样应用程序在维护活动期间根本看不到它......,但一般来说你做的很好......

以上是关于需要更改副本集的mongodb辅助节点中的存储dbpath的主要内容,如果未能解决你的问题,请参考以下文章

mongodb--选举失败

MongoDB副本集的常用操作及原理

Mongodb集群架构之副本集

Mongodb副本集管理

MongoDB 副本集的常用操作及原理

Mongodb的入门副本集