Mongodb大版本升级,最好在测试环境进行测试,再去线上操作,直接升级可能导致异常,需要确认客户端是否支持新版本,新版本更新了哪些功能。

在Mongodb 2.2版本以后,实现了数据库级别的锁,互斥锁应用在数据库级别而不是整个实例。
在Mongodb 3.0版本以后,引入了集合级别的锁机制,对MMAPv1存储引擎可用。
在Mongodb 3.0版本以后,增加了WiredTiger存储引擎,还可以支持文档级别的锁,这是一个更细粒度的锁。

MongoDB版本控制:

1、稳定版本。

MongoDB的版本的形式X.Y.Z在那里X.Y 指的是一个版本系列或开发系列Z 指修订/补丁号。
如果Y是偶数,则X.Y指发布系列;例如, 4.0发行系列和4.2发行系列。发布系列 稳定且适合生产。
如果Y是奇数,则X.Y指一个开发系列;例如, 4.1开发系列和4.3开发系列。开发系列仅用于测试而不是生产。
例如,在MongoDB版本中4.0.12,4.0指的是发行系列,而.12指的是修订版。
最新产品
在发布一系列变化(例如4.0到4.2)通常标志着引进可能破坏向后兼容的新功能。
补丁版本
更改版本号(如4.0.11对4.0.12)一般标注错误修复和向后兼容的改变的释放。
驱动程序版本
MongoDB的版本编号系统与MongoDB驱动程序使用的系统不同

2、 MongoDB版本升级

如果你还在使用2.0版本,那需要你升级到2.8然后升级到3.0版本。
(版本号偶数为稳定版本例如:3.2、3.4)
Mongodb版本升级

3、升级单实例

单实节点:仅推荐本地环境使用

1、确认数据文件版本
2、安装新版本
3、替换老版本
4、更新数据文件版本

二进制版本3.6.9升级4.0
3.1、确认数据文件版本:

[root@10-1-1-77 data]# ps -ef | grep mongodb_new
mongod   22494     1  0 15:21 ?        00:00:01 /data/mongodb3.6.9/bin/mongod -f /data/new/conf/mongodb_new.conf
root     22543 22331  0 15:23 pts/0    00:00:00 grep --color=auto mongodb_new

首先我们先确定兼容性版本是否是3.6

[root@10-1-1-77 ~]# /data/mongodb3.6.9/bin/mongo 10.1.1.77:27030
> db.adminCommand( { getParameter: 1, featureCompatibilityVersion: 1 } )
{ "featureCompatibilityVersion" : { "version" : "3.6" }, "ok" : 1 }
>

3.2、安装新版本:

我这里系统使用的是centos7

[root@10-1-1-77 data]# wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.0.16.tgz
[root@10-1-1-77 data]# tar -zxvf /root/mongodb-linux-x86_64-rhel70-4.0.16.tgz -C .
[root@10-1-1-77 data]# ll
lrwxrwxrwx 1 mongod mongod        33 3月  11 12:00 mongodb3.6.9 -> mongodb-linux-x86_64-rhel70-3.6.9
drwxr-xr-x 3 mongod mongod       100 3月  11 12:00 mongodb-linux-x86_64-rhel70-3.6.9
drwxr-xr-x 3 root   root         135 3月  14 15:03 mongodb-linux-x86_64-rhel70-4.0.16

创建软连接

[root@10-1-1-77 data]# ln -s mongodb-linux-x86_64-rhel70-4.0.16 mongodb4.0.16
[root@10-1-1-77 data]# ll
lrwxrwxrwx 1 mongod mongod        33 3月  11 12:00 mongodb3.6.9 -> mongodb-linux-x86_64-rhel70-3.6.9
lrwxrwxrwx 1 root   root          34 3月  14 15:06 mongodb4.0.16 -> mongodb-linux-x86_64-rhel70-4.0.16

3.3、替换老版本

[root@10-1-1-77 data]# kill 22494; sudo -u mongod /data/mongodb4.0.16/bin/mongod -f  /data/new/conf/mongodb_new.conf
about to fork child process, waiting until server is ready for connections.
forked process: 41146
child process started successfully, parent exiting
[root@10-1-1-77 data]# ps -ef | grep mongo
mongod   41146     1  5 15:12 ?        00:00:01 /data/mongodb4.0.16/bin/mongod -f /data/new/conf/mongodb_new.conf

3.4、更新新版本数据文件:

[root@10-1-1-77 data]# /data/mongodb4.0.16/bin/mongo  10.1.1.77:27030
MongoDB shell version v4.0.16
connecting to: mongodb://10.1.1.77:27030/test?gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("f00c5de1-0845-4d3f-82f8-ac9b6a92f580") }
MongoDB server version: 4.0.16
Server has startup warnings:
2020-03-14T15:12:27.503+0800 I CONTROL  [initandlisten]
2020-03-14T15:12:27.503+0800 I CONTROL  [initandlisten] ** WARNING: Access control is not enabled for the database.
> db.adminCommand( { getParameter: 1, featureCompatibilityVersion: 1 } )
{ "featureCompatibilityVersion" : { "version" : "3.6" }, "ok" : 1 }   #查看兼容性版本
> db.adminCommand( { setFeatureCompatibilityVersion: "4.0" } )   #修改兼容性版本
{ "ok" : 1 }
> db.adminCommand( { getParameter: 1, featureCompatibilityVersion: 1 } )
{ "featureCompatibilityVersion" : { "version" : "4.0" }, "ok" : 1 }
>

升级完!

4. 升级复制集集群

(4.0.16升级4.2.1,其他版本升级步骤也是一样的. 滚动升级顺序:SECONDARY-->SECONDARY-->PRIMARY

4.1、确认数据版本

rs02:SECONDARY> db.getMongo().setSlaveOk()
rs02:SECONDARY> db.adminCommand( { getParameter: 1, featureCompatibilityVersion: 1 } )
{
    "featureCompatibilityVersion" : {
        "version" : "4.0"
    },
    "ok" : 1,
    "operationTime" : Timestamp(1584521284, 1),
    "$clusterTime" : {
        "clusterTime" : Timestamp(1584521284, 1),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    }
}

4.2、下载解压

下载以后上传到三台服务器,
三台服务器分别执行

tar -zxvf mongodb-linux-x86_64-rhel70-4.2.2.tgz
ln -s mongodb-linux-x86_64-rhel70-4.2.2 mongodb-4.2.2

4.2.1、我们先在SECONDARY执行

杀掉4.0版本启动的mongod进程,使用新版本启动。

[root@10-1-1-159 ~]# sudo -u mongod /data/mongodb-4.2.2/bin/mongod -f /data/mongodb/conf/mongodb.conf
about to fork child process, waiting until server is ready for connections.
forked process: 28761
child process started successfully, parent exiting
[root@10-1-1-159 ~]#

4.2.3、我们在PRIMARY节点进行

使用并使用rs.stepDown()命令让主节点降级,集群会选举出新的节点作为主节点。


[root@10-1-1-77 ~]# sudo -u mongod /data/mongodb-4.0.16/bin/mongo 10.1.1.77:27010
MongoDB shell version v4.0.16
connecting to: mongodb://10.1.1.77:27010/test?gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("8d32e19a-d9ca-4947-a767-772444f7d627") }
MongoDB server version: 4.0.16
Welcome to the MongoDB shell.
rs02:PRIMARY> rs.stepDown()
rs02:SECONDARY>
rs02:SECONDARY> exit

>[root@10-1-1-77 ~]# ps -ef | grep mongo
mongod   13719     1  0 3月18 ?       00:06:04 /data/mongodb-4.0.16/bin/mongod -f /data/mongodb/conf/mongodb.conf
[root@10-1-1-77 ~]# kill 13719
[root@10-1-1-77 ~]# sudo -u mongod /data/mongodb-4.2.2/bin/mongod  -f /data/mongodb/conf/mongodb.conf
about to fork child process, waiting until server is ready for connections.
forked process: 38434
child process started successfully, parent exiting

4.2.4、在仲裁节点执行
kill掉进程,用新的版本启动
[root@10-1-1-178 ~]#    sudo -u mongod /data/mongodb-4.2.2/bin/mongod  -f /data/mongodb/conf/mongodb.conf
about to fork child process, waiting until server is ready for connections.
forked process: 36193
child process started successfully, parent exiting

#### 4.3、更新数据文件版本:
[root@10-1-1-77 ~]# sudo -u mongod /data/mongodb-4.0.16/bin/mongo 10.1.1.159:27010
MongoDB shell version v4.0.16
connecting to: mongodb://10.1.1.159:27010/test?gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("ee437b54-d94f-48ff-9424-d3fca6fcf17c") }
MongoDB server version: 4.2.2
WARNING: shell and server versions do not match
Welcome to the MongoDB shell.

rs02:PRIMARY> db.adminCommand( { setFeatureCompatibilityVersion: "4.2" } )
{
    "ok" : 1,
    "$clusterTime" : {
        "clusterTime" : Timestamp(1584589382, 7),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    },
    "operationTime" : Timestamp(1584589382, 7)
}
rs02:PRIMARY> db.adminCommand( { getParameter: 1, featureCompatibilityVersion: 1 } )
{
    "featureCompatibilityVersion" : {
        "version" : "4.2"               #查看数据版本更新完成
    },
    "ok" : 1,
    "$clusterTime" : {
        "clusterTime" : Timestamp(1584589415, 1),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    },
    "operationTime" : Timestamp(1584589415, 1)
}
rs02:PRIMARY>

更新完成,执行的维护操作一定是在业务低峰期执行,以免影响到业务。

集群升级稍后更新!