1 MongoDB 升级说明
在之前的博客中我们了解了MongoDB的版本发布规则。
MongoDB 从5.0 开始 版本 命名规则发生改变
https://www.cndba.cn/dave/article/107951
在不同的版本中,都会删除、添加一些命令、方法、参数。 这个在每个版本的Release notes
中有详细的说明。
有时,我们为了解决某些bug,或者想利用新版本的某些特性,那么就需要升级MongoDB的版本。
在MongoDB 5.0 之前,版本号由3个数字位组成:X.Y.Z。
- X.Y是 发行版本序列号 或者 开发版本序列号;
- Z是补丁号 或者 修订号。
因此,我们对MongoDB的升级也就涉及2个级别:
- 大版本号的升级
就是升级X.Y。 MongoDB 不支持跨大版本的升级。 比如从3.6 升级到4.4 是不允许的,必须一级一级升级:3.6 4.0 4.2 4.4。 对于大版本的升级,除了MongoDB 软件之外,还需要注意检查Driver 的兼容性。 - 小版本升级
就是升级Z 的序列号。 这个直接停止实例,替换mongod 文件即可。
因为从v4.4 开始,MongoDB tools和mongosh 都是需要独立部署的,所以只需要替换mongo,mongod,mongos 三个文件即可。
MongoDB 4.4 以后版本安装Database Tools 工具
https://www.cndba.cn/dave/article/107952MongoDB Shell (mongosh) 工具说明
https://www.cndba.cn/dave/article/107986
2 升级操作示例
MongoDB 跨大版本的升级必须一级一级操作。 我们这里当前环境是4.4.14,可以直接升级到5.0.8。
2.1 Standalone 和 Replica Set 环境升级
单机版和副本集版本操作步骤是一样的,对于副本集环境就是多了一个主备切换的步骤。
2.1.1 检查特性兼容版本参数
在升级到5.0 之前,必须确保该参数是4.4。
shard1:SECONDARY> db.adminCommand( { getParameter: 1, featureCompatibilityVersion: 1 } )
{
"featureCompatibilityVersion" : {
"version" : "4.4"
},
……
如果该参数不是4.4。使用如下命令修改成4.4:
db.adminCommand( { setFeatureCompatibilityVersion: “4.4” } )
2.1.2 正常关闭实例
这里必须正常关闭MongoDB 实例。
use admin
db.shutdownServer()
2.1.3 更新MongoDB 二进制文件
从官网下载5.0.8 的安装文件并解压缩:
[dave@www.cndba.cn_3 bin]# pwd
/data/mongodb-linux-x86_64-rhel70-5.0.8/bin
[dave@www.cndba.cn_3 bin]# ll
total 238632
-rwxr-xr-x 1 root root 15205 Apr 22 05:15 install_compass
-rwxr-xr-x 1 root root 58460872 Apr 22 06:01 mongo
-rwxr-xr-x 1 root root 109480888 Apr 22 06:02 mongod
-rwxr-xr-x 1 root root 76396488 Apr 22 05:40 mongos
[dave@www.cndba.cn_3 bin]#
[dave@www.cndba.cn_3 bin]# supervisorctl stop all
mongos: stopped
shard1: stopped
configdb: stopped
shard2: stopped
shard3: stopped
[dave@www.cndba.cn_3 bin]#
替换Bin文件:
[dave@www.cndba.cn_3 ~]# cd /usr/local/mongodb/bin
[dave@www.cndba.cn_3 bin]# ll
total 325224
-rwxr-xr-x 1 root root 13997360 Apr 30 11:31 bsondump
-rwxr-xr-x 1 root root 15205 May 11 14:10 install_compass
-rwxr-xr-x 1 root root 53690928 May 11 14:10 mongo
-rwxr-xr-x 1 root root 83353608 May 11 14:10 mongod
-rwxr-xr-x 1 root root 16769896 Apr 30 11:31 mongodump
-rwxr-xr-x 1 root root 16425456 Apr 30 11:31 mongoexport
-rwxr-xr-x 1 root root 17310776 Apr 30 11:31 mongofiles
-rwxr-xr-x 1 root root 16701752 Apr 30 11:31 mongoimport
-rwxr-xr-x 1 root root 17151264 Apr 30 11:31 mongorestore
-rwxr-xr-x 1 root root 65380944 May 11 14:10 mongos
-rwxr-xr-x 1 root root 16268112 Apr 30 11:31 mongostat
-rwxr-xr-x 1 root root 15931944 Apr 30 11:31 mongotop
[dave@www.cndba.cn_3 bin]# pwd
/usr/local/mongodb/bin
[dave@www.cndba.cn_3 bin]# rm -rf install_compass mongo mongod mongos
[dave@www.cndba.cn_3 bin]#
[dave@www.cndba.cn_3 bin]# cp * /usr/local/mongodb/bin/
[dave@www.cndba.cn_3 bin]# pwd
/data/mongodb-linux-x86_64-rhel70-5.0.8/bin
[dave@www.cndba.cn_3 bin]#
启动实例:
[dave@www.cndba.cn_3 bin]# supervisorctl start all
shard2: started
shard3: started
shard1: started
configdb: started
mongos: started
[dave@www.cndba.cn_3 bin]# mongo_conn 27018
MongoDB shell version v5.0.8
connecting to: mongodb://127.0.0.1:27018/?authSource=admin&compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("463cddb0-b2f8-4dea-9916-675e5e08fabb") }
MongoDB server version: 5.0.8
2.1.4 更新特性兼容性参数
单机直接在admin库中执行,副本集环境在primary 节点的admin 库中执行。
db.adminCommand( { setFeatureCompatibilityVersion: “5.0” } )
对于大版本的升级,必须执行该命令,该命令会向内部的系统集合更新数据。 如果由于某种原因命令没有成功完成,可以重试该命令,因为操作是幂等的,多次执行结果一样。
对于副本集环境,该命令会隐士的执行replSetReconfig命令,以在配置文档中添加term 列。
其实这里也是MongoDB 只能逐级升级的原因,每个大版本的迭代只能在上个版本的基础上才能进行。
2.1.5 副本集环境
对于副本集环境,如果是primary 节点,可以先将主库降级,然后进行操作。 官方手册中也是建议采用副本集环境来进行操作,以避免对业务的影响。
[dave@www.cndba.cn_2 ~]# mongo_conn 27018
MongoDB shell version v4.4.13
shard1:PRIMARY> rs.stepDown(300)
MongoDB 4.4 副本集 维护步骤 说明
https://www.cndba.cn/dave/article/107981
2.2 Sharded Cluster 环境升级[官方步骤]
Shard cluster 环境步骤稍微多一些。 具体如下。
2.2.1 准备工作
对于升级到5.0 环境,所有cluster 成员版本必须是4.4。 并且兼容性参数也是4.4。
db.adminCommand( { getParameter: 1, featureCompatibilityVersion: 1 } )
db.adminCommand( { setFeatureCompatibilityVersion: "4.4" } )
对于shards和 config 节点,必须确保没有副本集成员处于:ROLLBACK 和 RECOVERING 状态。
在升级前,建议备份一下config 数据库。
2.2.2 停止Balancer
连接到mongos 节点,执行如下命令,停止balancer:
sh.stopBalancer()
这里要注意,如果迁移正在进行,那么系统会等待进行中的迁移完成后才会停止balancer。 可以通过sh.isBalancerRunning() 命令来查看balancer 的当前状态。
查看balancer 状态:
sh.getBalancerState()
当该命令返回false时表示balancer 已经停止。
2.2.3 升级config server
在shard cluster 中,config 也是副本集环境,所以先在secondary 节点上执行升级。 然后对primary 节点降级再操作。
这里步骤和standalone 是一样的,需要注意的是每个节点替换bin文件重启后需要检查节点的状态,要确保副本集时正常工作的。
执行命令:
rs.status()
正常会返回SECONDARY 或者 PRIMARY。
2.2.4 升级shards 节点
操作步骤同config server 节点一样。
2.2.5 升级mongos 实例
同standalone 节点操作一样,升级每个mongos 实例。
2.2.6 启用balancer
连接到mongos 节点并执行如下命令:
sh.startBalancer()
2.2.7 更新特性兼容性参数
在mongos 实例上的admin库中执行如下命令:
db.adminCommand( { setFeatureCompatibilityVersion: “5.0” } )
连接Mongos:
[dave@www.cndba.cn_2 bin]# mongo_conn 27000
MongoDB shell version v5.0.8
connecting to: mongodb://127.0.0.1:27000/?authSource=admin&compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("a6a0e85d-3043-49ea-9a08-5a5fb70b06a5") }
MongoDB server version: 5.0.8
mongos> db.adminCommand( { setFeatureCompatibilityVersion: "5.0" } )
{
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1652259883, 1034),
"signature" : {
"hash" : BinData(0,"FNUYDoaj6+cZRrygeS6+XqrluyQ="),
"keyId" : NumberLong("7093529851058978835")
}
},
"operationTime" : Timestamp(1652259883, 1034)
}
mongos>
Shard 上验证:
[dave@www.cndba.cn_2 bin]# mongo_conn 27018
MongoDB shell version v5.0.8
connecting to: mongodb://127.0.0.1:27018/?authSource=admin&compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("7760f820-c3fb-494e-b400-e9443a7afe54") }
MongoDB server version: 5.0.8
shard1:SECONDARY> db.adminCommand( { getParameter: 1, featureCompatibilityVersion: 1 } )
{
"featureCompatibilityVersion" : {
"version" : "5.0"
},
"ok" : 1,
2.3 Sharded Cluster 实际操作
官方手册讲的是理想部署情况,实际生产中, 物理主机一般都是复用的。同一台物理机上会部署多个节点。 因此官网的步骤就需要进行调整。
2.3.1 更换所有节点的MongoDB 二进制文件
在所有实例不关闭的情况下,直接更换MongoDB 的二进制文件。
在Linux系统设计里面遵循一切都是文件的原则,即磁盘文件、目录、网络套接字、磁盘、管道等,所有这些都是文件,在我们进行打开的时候会返回一个fd,即是文件句柄。
文件实际上是一个指向inode的链接, inode链接包含了文件的所有属性, 比如权限和所有者, 数据块地址(文件存储在磁盘的这些数据块中). 当你删除(rm)一个文件, 实际删除了指向inode的链接, 并没有删除inode的内容. 进程可能还在使用. 只有当inode的所有链接完全移去, 然后这些数据块将可以写入新的数据.
因此,即使我们在不停实例的情况直接替换文件,只要对应的进程没有重启,都不会有影响。
2.3.2 按官方步骤操作
然后按官方建议的步骤,逐个重启实例,只是不在需要替换文件。
版权声明:本文为博主原创文章,未经博主允许不得转载。