跳到主要内容

MongoDB 3.4 升级到 4.4

提示
  • 升级级时长与 MongoDB 数据库中集合数量有直接关系
    可通过 find /data/mongodb/ -name '*collection*' | wc -l 查看集合数量
    例如:集合数在1万个以内需1分钟,10万约10分钟,30万约30分钟,另外也会受服务器磁盘性能影响重启升级时长

  • 本文档示例命令中,MongoDB 程序所在路径为 /usr/local/mongodb/ ,数据目录为 /data/mongodb/,如有不同注意修改对应命令

单节点

提前准备

  1. 参考 Docker 安装章节 在 MongoDB 服务器上安装 Docker

  2. 拉取升级辅助镜像(离线包下载):

    docker pull registry.cn-hangzhou.aliyuncs.com/mdpublic/mingdaoyun-sc-upgrade:1.0.0
  3. 下载 MongoDB v4.4.29 安装包,并上传至服务器

    https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.4.29.tgz
  4. 解压 MongoDB v4.4.29安装包,并检查安装包中 mongod 程序是否缺少依赖,如缺少依赖根据实际情况进行安装

    解压 MongoDB v4.4.29 安装包

    tar xvf mongodb-linux-x86_64-rhel70-4.4.29.tgz

    检查安装包中的 mongod 程序是否缺少依赖

    ldd mongodb-linux-x86_64-rhel70-4.4.29/bin/mongod

开始升级

MongoDB 升级需逐版本依次升级。 3.4 升级到 4.4 需要依次升级到 3.6、4.0、4.2、4.4,一共需执行 4 次升级命令。
升级过程中如果提示版本不匹配,则需要重复执行上一个升级命令(如:3.4 升级到 3.6 执行成功后,3.6 升级到 4.0 提示失败,则需要再次执行 3.4 升级到 3.6 的命令,直到输出 exit upgrade),如果尝试多次依然出错则可通过 /data/mongodb/upgrade-xxxx.log 查看具体原因。

  1. 停止微服务

  2. 对 MongoDB 进行数据备份

  3. 停止现有 MongoDB 实例

    systemctl stop mongodb
  4. 升级 MongoDB 版本

    3.4 到 3.6

    docker run -i --rm -v /data/mongodb:/data/mongodb registry.cn-hangzhou.aliyuncs.com/mdpublic/mingdaoyun-sc-upgrade:1.0.0 <<< 'upgradeMongodb.sh 3.4 3.6'

    3.6 到 4.0

    docker run -i --rm -v /data/mongodb:/data/mongodb registry.cn-hangzhou.aliyuncs.com/mdpublic/mingdaoyun-sc-upgrade:1.0.0 <<< 'upgradeMongodb.sh 3.6 4.0'

    4.0 到 4.2

    docker run -i --rm -v /data/mongodb:/data/mongodb registry.cn-hangzhou.aliyuncs.com/mdpublic/mingdaoyun-sc-upgrade:1.0.0 <<< 'upgradeMongodb.sh 4.0 4.2'

    4.2 到 4.4

    docker run -i --rm -v /data/mongodb:/data/mongodb registry.cn-hangzhou.aliyuncs.com/mdpublic/mingdaoyun-sc-upgrade:1.0.0 <<< 'upgradeMongodb.sh 4.2 4.4'
  5. 将现有的安装包替换为 v4.4.29 版本的安装包

    mv /usr/local/mongodb /usr/local/mongodb.bak-v3.4
    cp -r mongodb-linux-x86_64-rhel70-4.4.29 /usr/local/mongodb
    chown -R mongodb:mongodb /usr/local/mongodb /data/mongodb
    • 拷贝 MongoDB v4.4.29 安装包名称以实际为准
  6. 修改 MongoDB 启动命令参数,添加 --bind_ip 0.0.0.0 参数

    vim /etc/systemd/system/mongodb.service

    # 在 ExecStart 启动命令后追加 --bind_ip 0.0.0.0 参数
  7. 重载 systemd 并启动 MongoDB

    systemctl daemon-reload
    systemctl start mongodb
  8. 登录 MongoDB,查询 featureCompatibilityVersion

    /usr/local/mongodb/bin/mongo -u root -p 密码 --authenticationDatabase admin
    > db.adminCommand( { getParameter: 1, featureCompatibilityVersion: 1 } )
    • 输出 { "featureCompatibilityVersion" : { "version" : "4.4" }, "ok" : 1 } 代表升级成功 👏 👏

副本集

提前准备

  1. 下载升级所需各版本的 mongodb 安装包,并上传至各服务器

    https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.6.23.tgz
    https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.28.tgz
    https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.2.25.tgz
    https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.4.29.tgz
  2. 解压各版本安装包,并检测各安装包中的 mongod 程序是否缺少依赖,如缺少依赖根据实际情况进行安装

    解压各版本安装包

    tar xvf mongodb-linux-x86_64-3.6.23.tgz
    tar xvf mongodb-linux-x86_64-4.0.28.tgz
    tar xvf mongodb-linux-x86_64-rhel70-4.2.25.tgz
    tar xvf mongodb-linux-x86_64-rhel70-4.4.29.tgz

    检查各版本安装包中的 mongod 程序是否缺少依赖

    ldd mongodb-linux-x86_64-3.6.23/bin/mongod
    ldd mongodb-linux-x86_64-4.0.28/bin/mongod
    ldd mongodb-linux-x86_64-rhel70-4.2.25/bin/mongod
    ldd mongodb-linux-x86_64-rhel70-4.4.29/bin/mongod

开始升级

提示
  • 升级前先停止微服务,随后对 MongoDB 进行数据备份

  • 升级副本集,必须依次单独升级每个节点,从 SECONDARY 节点开始,到 PRIMARY 节点结束

从 3.4 升级到 3.6

  1. 升级副本集的 SECONDARY 节点(一次升级一个 SECONDARY 节点)

    停止现有 MongoDB 实例,将现有的安装包替换为 3.6 版本的安装包

    systemctl stop mongodb
    mv /usr/local/mongodb /usr/local/mongodb.bak-3.4
    cp -r mongodb-linux-x86_64-3.6.23 /usr/local/mongodb
    chown -R mongodb:mongodb /usr/local/mongodb
    • 拷贝 MongoDB 3.6.23 安装包名称以实际为准
  2. 修改 MongoDB 启动命令参数,添加 --bind_ip 0.0.0.0 参数

    vim /etc/systemd/system/mongodb.service

    # 在 ExecStart 启动命令后追加 --bind_ip 0.0.0.0 参数
  3. 重载 systemd 并启动 MongoDB

    systemctl daemon-reload
    systemctl start mongodb
    • 启动后可以尝试登录此节点,能登录上基本就正常,如果登录不上需要检查程序状态或者可能是数据量大,磁盘性能太低导致启动过慢
  4. 两个 SECONDARY 节点升级步骤一致

  5. 降级 PRIMARY 节点

    登录到 MongoDB 主节点,使用 rs.stepDown() 命令降级主节点并强制选举新的主节点

    /usr/local/mongodb/bin/mongo -u root -p 密码 --authenticationDatabase admin

    > rs.stepDown()
  6. 升级旧 PRIMARY 节点,步骤与升级其他 SECONDARY 节点一致,分别为:

    • 停止现有 MongoDB 实例,将现有的安装包替换为 3.6 版本的安装包
    • 修改 MongoDB 启动命令参数,添加 --bind_ip 0.0.0.0 参数
    • 重载 systemd 并启动 MongoDB
  7. 登录 PRIMARY 节点,设置功能兼容性版本为 3.6

    /usr/local/mongodb/bin/mongo -u root -p 密码 --authenticationDatabase admin

    > db.adminCommand( { setFeatureCompatibilityVersion: "3.6" } )
    • 输出正常包含:{ "ok" : 1 }

    检查各节点状态

    > rs.status()
    • 正常应为一个 PRIMARY,两个 SECONDARY

    查询 featureCompatibilityVersion

    > db.adminCommand( { getParameter: 1, featureCompatibilityVersion: 1 } )
    • 输出包含 { "featureCompatibilityVersion" : { "version" : "3.6" }, "ok" : 1 } 代表升级到 3.6 版本成功 👏 👏

从 3.6 升级到 4.0

  1. 升级副本集的 SECONDARY 节点(一次升级一个 SECONDARY 节点)

    停止现有 MongoDB 实例,将现有的安装包替换为 4.0 版本的安装包后启动 MongoDB

    systemctl stop mongodb
    mv /usr/local/mongodb /usr/local/mongodb.bak-3.6
    cp -r mongodb-linux-x86_64-4.0.28 /usr/local/mongodb
    chown -R mongodb:mongodb /usr/local/mongodb
    systemctl start mongodb
    • 拷贝 MongoDB 4.0.28 安装包名称以实际为准
    • 启动后可以尝试登录此节点,能登录上基本就正常,如果登录不上需要检查程序状态或者可能是数据量大,磁盘性能太低导致启动过慢
  2. 两个 SECONDARY 节点升级步骤一致

  3. 降级 PRIMARY 节点

    登录到 MongoDB 主节点,使用 rs.stepDown() 命令降级主节点并强制选举新的主节点

    /usr/local/mongodb/bin/mongo -u root -p 密码 --authenticationDatabase admin

    > rs.stepDown()
  4. 升级旧 PRIMARY 节点,步骤与升级 SECONDARY 节点一致

  5. 登录 PRIMARY 节点,设置功能兼容性版本为 4.0

    /usr/local/mongodb/bin/mongo -u root -p 密码 --authenticationDatabase admin

    > db.adminCommand( { setFeatureCompatibilityVersion: "4.0" } )
    • 输出正常包含:{ "ok" : 1 }

    检查各节点状态

    > rs.status()
    • 正常应为一个 PRIMARY,两个 SECONDARY

    查询 featureCompatibilityVersion

    > db.adminCommand( { getParameter: 1, featureCompatibilityVersion: 1 } )
    • 输出包含 { "featureCompatibilityVersion" : { "version" : "4.0" }, "ok" : 1 } 代表升级到 4.0 版本成功 👏 👏

从 4.0 升级到 4.2

  1. 升级副本集的 SECONDARY 节点(一次升级一个 SECONDARY 节点)

    停止现有 MongoDB 实例,将现有的安装包替换为 4.2 版本的安装包后启动 MongoDB

    systemctl stop mongodb
    mv /usr/local/mongodb /usr/local/mongodb.bak-4.0
    cp -r mongodb-linux-x86_64-rhel70-4.2.25 /usr/local/mongodb
    chown -R mongodb:mongodb /usr/local/mongodb
    systemctl start mongodb
    • 拷贝 MongoDB 4.2.25 安装包名称以实际为准
    • 启动后可以尝试登录此节点,能登录上基本就正常,如果登录不上需要检查程序状态或者可能是数据量大,磁盘性能太低导致启动过慢
  2. 两个 SECONDARY 节点升级步骤一致

  3. 降级 PRIMARY 节点

    登录到 MongoDB 主节点,使用 rs.stepDown() 命令降级主节点并强制选举新的主节点

    /usr/local/mongodb/bin/mongo -u root -p 密码 --authenticationDatabase admin

    > rs.stepDown()
  4. 升级旧 PRIMARY 节点,步骤与升级 SECONDARY 节点一致

  5. 登录 PRIMARY 节点,设置功能兼容性版本为 4.2

    /usr/local/mongodb/bin/mongo -u root -p 密码 --authenticationDatabase admin

    > db.adminCommand( { setFeatureCompatibilityVersion: "4.2" } )
    • 输出正常包含:{ "ok" : 1 }

    检查各节点状态

    > rs.status()
    • 正常应为一个 PRIMARY,两个 SECONDARY

    查询 featureCompatibilityVersion

    > db.adminCommand( { getParameter: 1, featureCompatibilityVersion: 1 } )
    • 输出包含 { "featureCompatibilityVersion" : { "version" : "4.2" }, "ok" : 1 } 代表升级到 4.2 版本成功 👏 👏

从 4.2 升级到 4.4

  1. 升级副本集的 SECONDARY 节点(一次升级一个 SECONDARY 节点)

    停止现有 MongoDB 实例,将现有的安装包替换为 4.4 版本的安装包后启动 MongoDB

    systemctl stop mongodb
    mv /usr/local/mongodb /usr/local/mongodb.bak-4.2
    cp -r mongodb-linux-x86_64-rhel70-4.4.29 /usr/local/mongodb
    chown -R mongodb:mongodb /usr/local/mongodb
    systemctl start mongodb
    • 拷贝 MongoDB 4.4.29 安装包名称以实际为准
    • 启动后可以尝试登录此节点,能登录上基本就正常,如果登录不上需要检查程序状态或者可能是数据量大,磁盘性能太低导致启动过慢
  2. 两个 SECONDARY 节点升级步骤一致

  3. 降级 PRIMARY 节点

    登录到 MongoDB 主节点,使用 rs.stepDown() 命令降级主节点并强制选举新的主节点

    /usr/local/mongodb/bin/mongo -u root -p 密码 --authenticationDatabase admin

    > rs.stepDown()
  4. 升级旧 PRIMARY 节点,步骤与升级 SECONDARY 节点一致

  5. 登录 PRIMARY 节点,设置功能兼容性版本为 4.4

    /usr/local/mongodb/bin/mongo -u root -p 密码 --authenticationDatabase admin

    > db.adminCommand( { setFeatureCompatibilityVersion: "4.4" } )
    • 输出正常包含:{ "ok" : 1 }

    检查各节点状态

    > rs.status()
    • 正常应为一个 PRIMARY,两个 SECONDARY

    查询 featureCompatibilityVersion

    > db.adminCommand( { getParameter: 1, featureCompatibilityVersion: 1 } )
    • 输出包含 { "featureCompatibilityVersion" : { "version" : "4.4" }, "ok" : 1 } 代表升级到 4.4 版本成功 👏 👏