之前文章【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个节点不影响数据库访问,访问正常
- 停掉2个节点后数据库无法访问
- 在对2个节点升级后,刷新后发现数据库版本已经变更为4.4.13,即使另1个节点仍为4.4.5
- 数据没有丢失
之后会在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