#作者:任少近
文章目錄
- 前言:Mongodb版本升級
- 升級步驟
- 環境
- 1.1環境準備
- 1.2standalone升級
- 1.3分片、副本集升級
前言:Mongodb版本升級
在開始升級之前,請參閱 MongoDB下個版本中的兼容性變更文檔,以確保您的應用程序和部署與下個MongoDB兼容。在開始升級之前,請解決部署中的不兼容問題。
在升級 MongoDB 之前,請務必在臨時環境中測試,然后再將升級部署到生產環境。
以下舉例從7升級到8
升級步驟
1.首先確保是副本集狀態
3.先關閉1個從節點
4.升級副本節點的可執行文件
5.更新配置文件
6.啟動升級后的副本節點
7.確保集群工作正常
8.滾動升級其他副本節點
9.最后主節點降級
10.確保集群可用
11.關閉降級的老的主節點
12.升級老的主節點
13.重新加入集群
環境
1.1環境準備
系統系統 BC 21.10
三臺服務器:192.168.123.247/248/249
升級包:
mongodb-linux-x86_64-rhel8-8.0.3.tgz (截止2024年10月30日星期三最新版)
mongosh-2.3.1-linux-x64.tgz
升級之前插入10000條數據,方便升級后驗證。
[direct: mongos] admin>sh.enableSharding("foo");
[direct: mongos] admin>sh.shardCollection("foo.bar", {_id: 'hashed'});
[direct: mongos] admin> use foo
for (var i = 0; i < 10000; i++) {db.bar.insertOne({i: i})};
查看多了一個bar庫狀態:
database: {_id: 'foo',primary: 'shard3',partitioned: false,version: {uuid: UUID('8beea767-f87c-4487-a0cf-8889022dc663'),timestamp: Timestamp({ t: 1730188226, i: 2 }),lastMod: 1}},collections: {'foo.bar': {shardKey: { _id: 'hashed' },unique: false,balancing: true,chunkMetadata: [{ shard: 'shard1', nChunks: 1 },{ shard: 'shard2', nChunks: 1 },{ shard: 'shard3', nChunks: 1 }],chunks: [{ min: { _id: MinKey() }, max: { _id: Long('-3074457345618258602') }, 'on shard': 'shard3', 'last modified': Timestamp({ t: 1, i: 8 }) },{ min: { _id: Long('-3074457345618258602') }, max: { _id: Long('3074457345618258602') }, 'on shard': 'shard1', 'last modified': Timestamp({ t: 1, i: 6 }) },{ min: { _id: Long('3074457345618258602') }, max: { _id: MaxKey() }, 'on shard': 'shard2', 'last modified': Timestamp({ t: 1, i: 7 }) }],
解釋:
foo.bar:表示數據庫 foo 中的集合 bar。
shardKey:表示用于分片的鍵。這里的 { “_id”: “hashed” } 表示使用 _id 字段作為分片鍵,并且使用哈希分片策略(hashed sharding strategy)。
unique:表示是否為唯一索引。這里 false 表示 shardKey 不是唯一索引。
balancing:表示是否開啟自動平衡。這里 true 表示自動平衡是開啟的。
chunkMetadata:表示各個分片上的分塊(chunk)數量。每個分塊代表了一部分數據。這里有三個分片 shard1、shard2 和 shard3,每個分片上有一個分塊。
chunks:具體展示了各個分塊的范圍和所在的分片。每個分塊有一個 min 和 max 值來定義范圍,并且指定了所在分片以及最后修改的時間戳。
總結
foo 數據庫的主分片是 shard3,默認操作將在 shard3 上執行。
foo.bar 集合被分片,使用 _id 字段作為分片鍵,并且開啟了自動平衡。
目前 foo.bar 集合的數據在 shard1、shard2 和 shard3 上分布,每個分片上有一個分塊,具體分塊的范圍和所在分片的信息也已經給出。
查看bar庫數據分布數
Shard1上分布3273 個
Shard2上分布3388個
Shard3上分布3339個
總數一萬個
1.2standalone升級
升級就將數據備份好了,導出一份,直接升級,不再贅述。
1.3分片、副本集升級
如果部署的為分片、副本集,需要升級
分片集升級之前,先升級好副本集,確保在升級過程中保持數據的一致性和高可用性。
建議備份config數據庫。
./mongodump --uri="mongodb://server1:27017,server2:27017,server3:27017" --db config -o /home/rsj/mongodb/config
1.3.1特征兼容性版本檢查
- 所有副本集節點必須運行7.0版本。不然升級到8.0會失敗。
featureCompatibilityVersion設立為"7.0" 。
要檢查featureCompatibilityVersion ,執行
db.adminCommand( { getParameter: 1, featureCompatibilityVersion: 1 } )
該操作返回的結果應包含 “featureCompatibilityVersion” : { “version” : “7.0” }。
對于分片和配置服務器,請確保沒有副本集成員處于 ROLLBACK 或 RECOVERING 狀態。
通過db.adminCommand( { replSetGetStatus: 1 } )查看。
myconfigset [direct: secondary] test> use admin
switched to db admin
myconfigset [direct: secondary] admin> db.adminCommand( { replSetGetStatus: 1 } )
1.3.2下載 8.0 文件
請按照適用于 Linux 系統的 8.0 版本安裝說明進行操作。這里為
mongodb-linux-x86_64-rhel8-8.0.3.tgz,然后執行實際的升級過程。
1.3.3升級副本集程序
使用“滾動”升級從 MongoDB 7.0 升級到 8.0,即在其他成員可用時單獨升級各個成員,從而最大限度地減少停機時間。升級原則:
- 確認從節點
- 升級副本集的從節點,一次必須一個。
1.3.4禁用負載均衡器。
在升級 MongoDB 時,需要禁用負載均衡器(Balancer),以確保數據在升級過程中不會被重新分配,減少潛在的數據不一致風險。
將 mongosh 連接到分片集群中的 mongos 實例,然后運行 sh.stopBalancer() 以禁用負載均衡器。登錄任意一個節點
#mongosh mongodb://server1:27000
sh.stopBalancer()
驗證是否已關閉
1.3.4.1第一步:關閉并升級從副本集之一
要關閉 mongod 進程,請使用 mongosh 連接到副本集節點,并運行以下命令:
根據以上信息,確認副本集從節點為server2.
[root@k8s-node6 bin]# mongosh mongodb://localhost:27017myconfigset [direct: secondary] test> use admin
switched to db admin
myconfigset [direct: secondary] admin> db.adminCommand( { shutdown: 1 } );
MongoNetworkError: connection 2 to 127.0.0.1:27017 closed
已關閉。進程上也看到已不存在,此關閉是最優雅關閉,能確保所有的數據都被持久化到磁盤后才關閉
將 7.0 二進制文件替換為 8.0 二進制文件。bin_7.0.14下為老版本的mongod
mongod啟動進程
mongod --config /usr/local/mongodb/config/conf/mongod.conf
查看server2狀態,等恢復了再進行下一個。查看stateStr狀態,恢復到SECONDARY狀態,
查看本地的版本。
再登錄已經顯示為8版本
1.3.4.2第二步:并閉并升級從副本集之二
相同的方式關閉副本集從節點之server3.
將 7.0 二進制文件替換為 8.0 二進制文件。
mongod啟動
等待恢復到SECONDARY狀態,不再贅述。
結下來再升級最后一個節點:主節點
1.3.4.3第三步:升級主節點
- 降級主節點。
- 關閉server1。
- 并將mongod二進制文件替換為8.0二進制文件。
- 請使用 mongosh 連接到主節點,并運行以下命令:
- 啟server1
1.3.4.3.1 降級主節點。
將 mongosh 連接到主節點,并使用 rs.stepDown() 降級主節點,強制選舉新的主節點:
myconfigset [direct: primary] test> use admin
switched to db admin
myconfigset [direct: primary] admin> rs.stepDown(){ok: 1,
...
如圖:降級完成后,主節點已經成為從節點。
當 rs.status() 顯示主節點已降級,并且server2成員已顯示為 PRIMARY 狀態
1.3.4.3.2 升級主節點server1。
關閉server1,
myconfigset [direct: secondary] admin> db.adminCommand( { shutdown: 1 } )
MongoNetworkError: connection 3 to 127.0.0.1:27017 closed
查看server1,已經為down狀態,此時進程已停止,
替換二進制文件:
將mongod二進制文件替換為8.0二進制文件。
mongod
啟動進程
mongod --config /usr/local/mongodb/config/conf/mongod.conf查看server1狀態,已恢復,變成從,運行正常。