栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

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

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

之前文章【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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/882097.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号