如何為MongoDB添加分片副本集
背景是這樣的:線上一個(gè)MongoDB集群保存了很多歷史數(shù)據(jù),這些歷史數(shù)據(jù)是按照時(shí)間字段進(jìn)行分片的,最近到了2021年,有些分片的截止時(shí)間要到了,為了能容納更多的數(shù)據(jù),需要在當(dāng)前分片的基礎(chǔ)上增加相應(yīng)的分片。
線上環(huán)境中,每個(gè)分片本身也是一個(gè)3副本的副本集,所以添加的時(shí)候有些特定的流程需要注意,我再測(cè)試環(huán)境中簡(jiǎn)單測(cè)了一下這個(gè)過程,記錄下來。
整個(gè)過程大概的流程是:
1、新建分片副本集
2、使用addShard命令將分片副本集添加到集群中
3、使用addShardTag命令為分片打標(biāo)簽
4、使用addTagRange命令為打好標(biāo)簽的分片設(shè)置片鍵的數(shù)值區(qū)間,注意,各個(gè)分片的數(shù)值區(qū)間不能有重復(fù)。
目前測(cè)試環(huán)境的架構(gòu)是:
01 新建副本集
由于我們即將加入集群的分片是一個(gè)副本集,因此,需要提前將這個(gè)副本集創(chuàng)建好,創(chuàng)建的過程相對(duì)比較容易,按照之前的步驟來進(jìn)行搭建,這里給出鏈接:
02 副本集添加到已有的集群中(addShard)
這一步也比較簡(jiǎn)單,可以直接在mongos上的admin數(shù)據(jù)庫使用命令addShard即可:
db.runCommand({addShard:"sharding_yeyz1/127.0.0.1:27024,127.0.0.1:27025,127.0.0.1:27026"})
當(dāng)然,你也可以直接使用db.adminCommand命令來代替db.runCommand命令,這兩個(gè)命令的區(qū)別是adminCommand命令默認(rèn)是在admin數(shù)據(jù)庫下面執(zhí)行的,而runCommand默認(rèn)的是當(dāng)前數(shù)據(jù)庫。
上面的命令,將本地的:
27024、27025、27026端口加入到集群中。到這里架構(gòu)會(huì)變成:
03 添加分片時(shí)間標(biāo)簽(addShardTag)
分片加入到集群之后,還需要對(duì)分片添加Tag,添加Tag的目的,是讓我們知道,當(dāng)前分片上保留的業(yè)務(wù)數(shù)據(jù)是哪一個(gè)時(shí)間段的。在測(cè)試環(huán)境中,我使用1_1000和1000_2000這兩個(gè)tag來測(cè)試,命令如下:
sh.addShardTag("sharding_yeyz", "1_1000") sh.addShardTag("sharding_yeyz1", "1000_2000")
對(duì)上面的命令簡(jiǎn)單進(jìn)行解釋,其中:
sharding_yeyz和sharding_yeyz1是分片副本集的名稱;
1_1000和1000_2000是tag的名稱。
添加完畢之后,我們可以通過系統(tǒng)的config庫下面的tag表看到tag的情況,如下:
mongos> db.shards.find() { "_id" : "sharding_yeyz", "host" : "sharding_yeyz/127.0.0.1:27018,127.0.0.1:27019,127.0.0.1:27020", "state" : 1, "tags" : [ "1_1000" ] } { "_id" : "sharding_yeyz1", "host" : "sharding_yeyz1/127.0.0.1:27024,127.0.0.1:27025,127.0.0.1:27026", "state" : 1, "tags" : [ "1000_2000" ] }
04 給打好的標(biāo)簽添加具體的數(shù)值范圍(addTagRange)
設(shè)定好標(biāo)簽之后,需要設(shè)置每個(gè)標(biāo)簽所代表的分片上具體的數(shù)值范圍,這就要用到addTagRange函數(shù),使用方法如下:
sh.addTagRange( "new.test", { number: 1}, { number: 1000}, "1_1000" ) sh.addTagRange( "new.test", { number: 1000}, { number: 2000}, "1000_2000" )
注意,這里數(shù)值范圍是指分片的那個(gè)集合的片鍵的數(shù)值范圍。
分片永遠(yuǎn)是針對(duì)集合說的。
上面的命令是說,我們對(duì)數(shù)據(jù)庫new下面的test集合做了分片,它的片鍵值是number這個(gè)字段:
當(dāng)number屬于[1,1000)的時(shí)候,該文檔存放在tag是"1_1000"的這個(gè)分片上,也就是sharding_yeyz;
當(dāng)number屬于[1000,2000)的時(shí)候,該文檔存放在tag是"1000_2000"的這個(gè)分片上,也就是sharding_yeyz1;
注意,區(qū)間為左閉右開。
05 查看結(jié)果
添加分片并設(shè)置分片的數(shù)值范圍之后,我們可以使用:
db.printShardingStatus()命令或者sh.status()命令來查看當(dāng)前集群中的分片情況:
mongos> sh.status() --- Sharding Status --- sharding version: { "_id" : 1, "minCompatibleVersion" : 5, "currentVersion" : 6, "clusterId" : ObjectId("5fafaf4f5785d9965548f687") } shards: { "_id" : "sharding_yeyz", "host" : "sharding_yeyz/127.0.0.1:27018,127.0.0.1:27019,127.0.0.1:27020", "state" : 1, "tags" : [ "1_1000" ] } { "_id" : "sharding_yeyz1", "host" : "sharding_yeyz1/127.0.0.1:27024,127.0.0.1:27025,127.0.0.1:27026", "state" : 1, "tags" : [ "1000_", "1000_2000" ] } active mongoses: "4.0.6" : 1 autosplit: Currently enabled: yes balancer: Currently enabled: yes Currently running: no Failed balancer rounds in last 5 attempts: 0 Migration Results for the last 24 hours: No recent migrations databases: { "_id" : "config", "primary" : "config", "partitioned" : true } config.system.sessions shard key: { "_id" : 1 } unique: false balancing: true chunks: sharding_yeyz 1 { "_id" : { "$minKey" : 1 } } -->> { "_id" : { "$maxKey" : 1 } } on : sharding_yeyz Timestamp(1, 0) { "_id" : "new", "primary" : "sharding_yeyz", "partitioned" : true, "version" : { "uuid" : UUID("68c70c64-f732-4478-8851-06dad4b94d6b"), "lastMod" : 1 } } new.test shard key: { "number" : 1 } unique: false balancing: true chunks: sharding_yeyz 3 sharding_yeyz1 1 { "number" : { "$minKey" : 1 } } -->> { "number" : 1 } on : sharding_yeyz Timestamp(2, 1) { "number" : 1 } -->> { "number" : 1000 } on : sharding_yeyz Timestamp(1, 2) { "number" : 1000 } -->> { "number" : 2000 } on : sharding_yeyz1 Timestamp(2, 0) { "number" : 2000 } -->> { "number" : { "$maxKey" : 1 } } on : sharding_yeyz Timestamp(1, 5) tag: 1_1000 { "number" : 1 } -->> { "number" : 1000 } tag: 1000_2000 { "number" : 1000 } -->> { "number" : 2000 }
到了這里,我們開始驗(yàn)證最終的結(jié)果,先通過下面的命令生成一組測(cè)試數(shù)據(jù),如下:
for (var i=1 ;i<=2000 ; i++){ db.test.insert({"number":i})}
去查看每個(gè)分片上的內(nèi)容,可以發(fā)現(xiàn):
sharding_yeyz
sharding_yeyz:PRIMARY> db.test.find().sort({"number":-1}) { "_id" : ObjectId("5ffc051dd4c416daac620af5"), "number" : 2000 } { "_id" : ObjectId("5ffc0511d4c416daac620325"), "number" : 2000 } { "_id" : ObjectId("5ffc051bd4c416daac62070c"), "number" : 999 } { "_id" : ObjectId("5ffc050fd4c416daac61ff3c"), "number" : 999 } { "_id" : ObjectId("5ffc051bd4c416daac62070b"), "number" : 998 } { "_id" : ObjectId("5ffc050fd4c416daac61ff3b"), "number" : 998 } { "_id" : ObjectId("5ffc051bd4c416daac62070a"), "number" : 997 } { "_id" : ObjectId("5ffc050fd4c416daac61ff3a"), "number" : 997 } { "_id" : ObjectId("5ffc051bd4c416daac620709"), "number" : 996 } { "_id" : ObjectId("5ffc050fd4c416daac61ff39"), "number" : 996 } { "_id" : ObjectId("5ffc051bd4c416daac620708"), "number" : 995 }
這里需要注意,為什么2000這個(gè)值還是出現(xiàn)在分片一上呢?
這個(gè)原因是在設(shè)置分片的數(shù)值范圍的時(shí)候,我們?cè)O(shè)置的區(qū)間是左閉右開的。而我們?cè)O(shè)置的分片范圍分別是[1,1000)和[1000,2000),因此2000這個(gè)數(shù)字就被隨機(jī)分配到這兩個(gè)分片中,實(shí)際的情況是,它被分配到了分片一中。
sharding_yeyz1
sharding_yeyz1:PRIMARY> db.test.find().sort({"number":-1}) { "_id" : ObjectId("5ffc051dd4c416daac620af4"), "number" : 1999 } { "_id" : ObjectId("5ffc0511d4c416daac620324"), "number" : 1999 } { "_id" : ObjectId("5ffc051dd4c416daac620af3"), "number" : 1998 } { "_id" : ObjectId("5ffc0511d4c416daac620323"), "number" : 1998 } { "_id" : ObjectId("5ffc051dd4c416daac620af2"), "number" : 1997 } { "_id" : ObjectId("5ffc0511d4c416daac620322"), "number" : 1997 } { "_id" : ObjectId("5ffc051dd4c416daac620af1"), "number" : 1996 } { "_id" : ObjectId("5ffc0511d4c416daac620321"), "number" : 1996 } { "_id" : ObjectId("5ffc051dd4c416daac620af0"), "number" : 1995 } { "_id" : ObjectId("5ffc0511d4c416daac620320"), "number" : 1995 } { "_id" : ObjectId("5ffc051dd4c416daac620aef"), "number" : 1994 } { "_id" : ObjectId("5ffc0511d4c416daac62031f"), "number" : 1994 } { "_id" : ObjectId("5ffc051dd4c416daac620aee"), "number" : 1993 } { "_id" : ObjectId("5ffc0511d4c416daac62031e"), "number" : 1993 } { "_id" : ObjectId("5ffc051dd4c416daac620aed"), "number" : 1992 } { "_id" : ObjectId("5ffc0511d4c416daac62031d"), "number" : 1992 }
這個(gè)結(jié)果看著就比較正常了。
今天的內(nèi)容就到這里吧。
以上就是如何為MongoDB添加分片副本集的詳細(xì)內(nèi)容,更多關(guān)于為MongoDB添加分片副本集的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
MongoDB數(shù)據(jù)庫查詢性能提高40倍的經(jīng)歷分享
大家在使用 MongoDB 的時(shí)候有沒有碰到過性能問題呢?下面這篇文章主要給大家分享了MongoDB數(shù)據(jù)庫查詢性能提高40倍的經(jīng)歷,需要的朋友可以參考借鑒,下面來一起看看吧。2017-02-02mongodb基礎(chǔ)入門_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要為大家詳細(xì)介紹了mongodb基礎(chǔ)入門的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08cgroup限制mongodb進(jìn)程內(nèi)存大小
這篇文章主要介紹了cgroup限制mongodb進(jìn)程內(nèi)存大小,需要的朋友可以參考下2014-07-07Windows系統(tǒng)下安裝MongoDB并內(nèi)網(wǎng)穿透遠(yuǎn)程連接
這篇文章主要給大家介紹了關(guān)于Windows系統(tǒng)下安裝MongoDB并內(nèi)網(wǎng)穿透遠(yuǎn)程連接的相關(guān)資料,文中通過圖文將步驟介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用MongoDB具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2023-03-03CentOS 6.5系統(tǒng)中使用yum安裝MongoDB 2.6 教程
這篇文章主要介紹了CentOS 6.5系統(tǒng)中使用yum安裝MongoDB 2.6 教程,本文共分5個(gè)步驟完成MongoDB的安裝,需要的朋友可以參考下2015-01-01mongodb如何對(duì)文檔內(nèi)數(shù)組進(jìn)行過濾的方法步驟
這篇文章主要介紹了mongodb如何對(duì)文檔內(nèi)數(shù)組進(jìn)行過濾的方法步驟,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-10-10mongodb在建立一個(gè)T級(jí)別的數(shù)據(jù)庫時(shí),進(jìn)程掛掉的解決方法
這篇文章主要介紹了mongodb在建立一個(gè)T級(jí)別的數(shù)據(jù)庫時(shí),進(jìn)程掛掉,需要的朋友可以參考下2017-03-03將MongoDB加入到Windows的本地服務(wù)項(xiàng)的方法
下面主要針對(duì)MongoDB在Windows下加入本地服務(wù)項(xiàng)做一些簡(jiǎn)單的分享。以方便剛接觸MongoDB并在Windows環(huán)境下進(jìn)行開發(fā)的同學(xué)2014-08-08express使用Mongoose連接MongoDB操作示例【附源碼下載】
這篇文章主要介紹了express使用Mongoose連接MongoDB操作,結(jié)合實(shí)例形式分析了express使用Mongoose連接MongoDB的具體步驟與相關(guān)實(shí)現(xiàn)技巧,并附帶源碼供讀者下載參考,需要的朋友可以參考下2019-07-07