日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

mongoDB研究笔记:分片集群的工作机制

發布時間:2024/10/12 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mongoDB研究笔记:分片集群的工作机制 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

上面的(http://www.cnblogs.com/guoyuanwei/p/3565088.html)介紹了部署了一個默認的分片集群,對mongoDB的分片集群有了大概的認識,到目前為止我們還沒有在集群上建立其它數據庫,mongoDB的分片是基于集合(表)來進行的,因此要對一個集合分片,必須先使其所在的數據庫支持分片。如何使一個集合分片?如何選擇分片用到的片鍵?平衡器如何使chunks塊在片中遷移?分片的讀寫情況怎么樣?接下來將探討這些問題。

使集合分片

(1)連接到上面所配置集群中的mongos實例

> mongo --port 40009

(2)在集群中創建數據庫eshop和集合users

????? mongos> use eshop

??????????? switched to db eshop

????? mongos> db.users.insert({userid:1,username:"lili",city:"beijing"})

???? 此時在集合users中只有一條記錄:

???? { "_id" : ObjectId("521dcce715ce3967f964c00b"), "userid" : 1, "username" : "lili", "city" :??? "beijing" }

觀察集群的狀態信息,字段databases會增加一條記錄,其它字段與初始化的集群信息相同:

mongos> sh.status()

??????? databases:

??????? {? "_id" : "eshop",? "partitioned" : false,? "primary" : "rs0" }

可以看到此時數據庫eshop還沒支持分片,且數據庫中所有未分片的集合將保存在片rs0中;通過查看磁盤上的數據文件,此時會產生eshop.0、eshop.1、eshop.ns三個文件且位于rs0所對應的數據目錄中,集群中chunks集合為空,因為現在還沒有對集合users分片。

(3)分片

????? mongoDB的分片是基于范圍的,也就是說任何一個文檔一定位于指定片鍵的某個范圍內,一旦片鍵選擇好后,chunks就會按照片鍵來將一部分documents從邏輯上組合在一起。這里對users集合選擇"city"字段作為片鍵來分片,假如現在"city"字段值有"beijing"、"guangzhou"、"changsha",初始的時候隨機的向集群中插入包含以上字段值的文檔,此時由于chunks的大小未達到默認的閾值64MB或100000個文檔,集群中應該只有一個chunk,隨著繼續插入文檔,超過閾值的chunk會被分割成兩個chunks,最終的chunks和片鍵分布可能如下表格所示。表格只是大體上描述了分片的情況,實際可能有所變化,其中-表示所有鍵值小于"beijing"的文檔,表示所有鍵值大于"guangzhou"的文檔。這里還要強調一點就是chunks所包含的文檔,并不是物理上的包含,它是一種邏輯包含,它只表示帶有片鍵的文檔會落在哪個范圍內,而這個范圍的文檔對應的chunk位于哪個片是可以查詢到的,后續的讀寫操作就定位到這個片上的具體集合中進行。

開始鍵值

結束鍵值

所在分片

-

beijing

rs0

beijing

changsha

rs1

changsha

guangzhou

rs0

guangzhou

rs1

下面繼續通過命令使集合users分片,使集合分片必須先使其所在的數據庫支持分片,如下:

mongos> sh.enableSharding("eshop")? //使數據庫支持分片

對已有數據的集合進行分片,必須先在所選擇的片鍵上創建一個索引,如果集合初始時沒有任何數據,則mongoDB會自動在所選擇的的片鍵上創建一個索引。

mongos> db.users.ensureIndex({city:1})? //創建基于片鍵的索引

mongos> sh.shardCollection("eshop.users",{city:1})? //使集合分片

成功執行上面命令后,再次查看集群狀態信息:

mongos> sh.status()

--- Sharding Status ---

? sharding version: {

??????? "_id" : 1,

??????? "version" : 3,

??????? "minCompatibleVersion" : 3,

??????? "currentVersion" : 4,

??????? "clusterId" : ObjectId("521b11e0a663075416070c04")

}

? shards:

??????? {? "_id" : "rs0",? "host" : "rs0/GUO:40000,GUO:40001" }

??????? {? "_id" : "rs1",? "host" : "rs1/GUO:40003,GUO:40004" }

? databases:

??????? {? "_id" : "admin",? "partitioned" : false,? "primary" : "config" }

??????? {? "_id" : "eshop",? "partitioned" : true,? "primary" : "rs0" } //數據庫已支持分片

??????????????? eshop.users //分片的集合

??????????????????????? shard key: { "city" : 1 } //片鍵

??????????????????????? chunks:?? //所有塊信息

??????????????????????????????? rs0???? 1 //當前只有1個塊在片rs0上

??????????????????????? { "city" : { "$minKey" : 1 } } -->> { "city" : { "$maxKe

y" : 1 } } on : rs0 { "t" : 1, "i" : 0 } //此塊的包含鍵值范圍是-,且在片rs0上,因為此時集合中只有一條記錄,還未進行塊的分割、遷移

(4)繼續插入數據使集合自動分片

???? 為了觀察到集合被分成多個chunk,并分布在多個片上,繼續插入一些數據進行分析。

> for(var i = 1; i<10000;i++) db.users.insert({userid:i,username:"lili"+i,city:"beijing"})

> for(var i = 0; i<10000;i++) db.users.insert({userid:i,username:"xiaoming"+i,city:"changsha"})

> for(var i = 0; i<10000;i++) db.users.insert({userid:i,username:"xiaoqiang"+i,city:"guangzhou"})

通過以上三次循環插入文檔后,第一個chunk的大小會超過64MB時,出現chunk分割與遷移的過程。再次觀察集群的狀態信息,字段databases值變為:

? databases:

??????? {? "_id" : "admin",? "partitioned" : false,? "primary" : "config" }

??????? {? "_id" : "eshop",? "partitioned" : true,? "primary" : "rs0" }

??????????????? eshop.users

??????????????????????? shard key: { "city" : 1 }

??????????????????????? chunks:

??????????????????????????????? rs1???? 1

??????????????????????????????? rs0???? 2

??????????????????????? { "city" : { "$minKey" : 1 } } -->> { "city" : "beijing"

} on : rs1 { "t" : 2, "i" : 0 } //塊區間

??????????????????????? { "city" : "beijing" } -->> { "city" : "guangzhou" } on

: rs0 { "t" : 2, "i" : 1 } //塊區間

??????????????????????? { "city" : "guangzhou" } -->> { "city" : { "$maxKey" : 1

} } on : rs0 { "t" : 1, "i" : 4 } //塊區間

說明此時集群中有三個塊,其中在片rs0上有兩個塊,在片rs1上有一個塊,每個塊包含一定區間范圍的文檔。為了更加清楚的知道這些塊是如何分割和遷移的,可以查看changelog集合中的記錄信息進行分析。

從命令db.changelog.find()輸出內容中可以看到有以下幾步:

第一步:分割大于64MB的塊,原來此塊的片鍵的區間范圍是-,分割后區間變為-到"beijing"、"beijing"到兩個區間。

第二步:隨著繼續插入文檔,區間"beijing"到所包含的塊的大小超過64MB,此時這個區間又被分割為"beijing"到"guangzhou"、"guangzhou"到這兩個區間。

第三步:經過上面的分割,現在相當于有三個區間塊了,這一步做的就是將區間-到"beijing"對應的chunk從片rs0遷移到片rs1,最終結果是分片rs0上包含"beijing"到"guangzhou"、"guangzhou"到兩個區間的塊,分片rs1上包含區間-到"beijing"的塊。

上面循環插入文檔時還插入了片鍵值為"changsha"的記錄,這個片鍵的記錄應該都位于區間"beijing"到"guangzhou"所對應的chunk上,只不過由于chunk的大小還未達到64MB,所以還未進行分割,如果繼續插入此片鍵的文檔,區間可能會被分割為"beijing"到"changsha"、"changsha"到"guangzhou"這兩個區間塊。依次類推,mongoDB就是這樣來實現海量數據的分布式存儲的,同時由于每個片又是由復制集組成,保證了數據的可靠性。

轉載于:https://www.cnblogs.com/guoyuanwei/p/3763027.html

總結

以上是生活随笔為你收集整理的mongoDB研究笔记:分片集群的工作机制的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。