【MongoDB】基于Docker的MongoDB replica set(副本集)升级

21 篇文章 0 订阅
14 篇文章 0 订阅

之前文章【MongoDB】基于Docker的MongoDB replica set(副本集)搭建介绍了如何基于Docker搭建MongoDB副本集,当时的MongoDB版本号为4.4.5
在这里插入图片描述
最近MongoDB最新版本号已经来到了5.0.8
在这里插入图片描述
考虑对MongoDB进行一次升级

但问题出现了,树莓派无法适配最新的大版本5,详见【MongoDB】MongoDB 5.0官方版本不再支持现有树莓派
故只能先尝试升级至版本4的最新版4.4.13


为了减少对现有数据库访问造成影响,需要对三台主机依次进行如下操作,而不能同时下线多台服务

删除旧容器及镜像

由于之前创建容器的时候是使用下面的代码,指定了volumes,故不用担心容器删除后数据丢失

# 10.8.15.51
>>> docker run --name mongo0 -d -p 27017:27017 --restart always -v mongo0:/data/db  mongo:latest --replSet "rs0" --bind_ip_all
# 10.8.15.52
>>> docker run --name mongo1 -d -p 27017:27017 --restart always -v mongo1:/data/db  mongo:latest --replSet "rs0" --bind_ip_all
# 10.8.15.54
>>> docker run --name mongo2 -d -p 27017:27017 --restart always -v mongo2:/data/db  mongo:latest --replSet "rs0" --bind_ip_all

通过如下代码下线服务

# 停
>>> docker stop mongo0
# 删容器
>>> docker rm mongo0
# 删镜像
>>> docker rmi mongo:latest

启动新服务

我们使用docker-compose方式替换掉之前的docker run

version: "3.9"
services:
  mongo0:
    container_name: mongo0
    image: mongo
    expose:
      - 27017
    ports:
      - 27017:27017
    volumes:
      - mongo0:/data/db
    restart: always
    entrypoint:
      [
        "/usr/bin/mongod",
        "--bind_ip_all",
        "--replSet",
        "rs0",
        "--journal",
        "--enableMajorityReadConcern",
        "false"
      ]
    networks:
      - mongo_rs
volumes:
  mongo0:
networks:
  mongo_rs:
    name: mongo_rs

通过如下命令上线服务

>>> docker-compose up -d

验证

依次对三台服务器进行上面的操作后,可以发现

  1. 仅停掉1个节点不影响数据库访问,访问正常
  2. 停掉2个节点后数据库无法访问
  3. 在对2个节点升级后,刷新后发现数据库版本已经变更为4.4.13,即使另1个节点仍为4.4.5
  4. 数据没有丢失

在这里插入图片描述
之后会在x86服务器上进行4.4.5到5.0.8版本的升级,成功后文章会再进行更新


2022-05-12更新

MongoDB自5.0版本开始版本迭代有所变化,在5.0之前,奇数版本号为开发版本,偶数版本号为稳定版本
在这里插入图片描述
而5.0之后版本发布变为

  • Major Releases
  • Rapid Releases

其中Major Releases 一年为周期进行迭代,提供Atlas和本地部署,而Rapid Releases迭代周期更快,且仅提供Atlas。比如目前的Major Releases为5.0,而5.1、5.2、5.3则为Rapid Releases,所以今年将要发布的6.0为5.0之后的Major Releases(看来刷版本号上头了)

继昨天升级成功4.4.13后,今天打算趁热打铁直接升级到5.0.8
方法还用上文中的docker-compose.yml

version: "3.9"
services:
  mongo0:
    container_name: mongo0
    image: mongo:5.0.8
    expose:
      - 27017
    ports:
      - 27017:27017
    volumes:
      - mongo0:/data/db
    restart: always
    entrypoint:
      [
        "/usr/bin/mongod",
        "--bind_ip_all",
        "--replSet",
        "rs0",
        "--journal",
        "--enableMajorityReadConcern",
        "false"
      ]
    networks:
      - mongo_rs
volumes:
  mongo0:
networks:
  mongo_rs:
    name: mongo_rs

但启动时出现

Creating network "mongo_rs" with the default driver
Creating mongo1 ... done
Attaching to mongo1
mongo1    | {"t":{"$date":"2022-05-12T00:09:25.151Z"},"s":"F",  "c":"CONTROL",  "id":5324700, "ctx":"-","msg":"** ERROR: Starting in 5.0, disabling enableMajorityReadConcern setting is no longer available because of MongoDB's resiliency enhancements. If your environment was previously running with eMRC=f, please see https://docs.mongodb.com/v5.0/reference/read-concern-majority/#disable-read-concern-majority"}

查了一下这是因为5.0版本开始强制开启了read concern majority
在这里插入图片描述
read concern majority保证了读取到的数据一定是已经写入了主要的主要副本集节点中,所以能够避免脏读。
在这里插入图片描述
所以需要将上面docker-compose.yml中的entrypoint改为

...
    entrypoint:
      [
        "/usr/bin/mongod",
        "--bind_ip_all",
        "--replSet",
        "rs0",
        "--journal"
      ]
...

一切就正常了,最后顺利升级到5.0.8
在这里插入图片描述
参考:
https://www.mongodb.com/docs/manual/reference/versioning/
https://www.mongodb.com/docs/v5.0/reference/read-concern-majority/#disable-read-concern-majority
https://www.mongodb.com/docs/v5.0/reference/program/mongod/#std-option-mongod.–enableMajorityReadConcern

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值