麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 數(shù)據(jù)庫 > MongoDB > 正文

MongoDB分片鍵的選擇和案例實例詳解

2020-03-14 12:50:21
字體:
供稿:網(wǎng)友

前言

分片鍵選擇不好,應(yīng)用程序就無法利用分片集群所提供的諸多優(yōu)勢。在這種情況下,插入和查詢的性能都會顯著下降。下決定時一定要嚴肅,一旦選擇了分片鍵,就必須堅持選擇,分片鍵是不可以修改的。要讓分片鍵提供好的體驗,部分源自了解怎樣才算一個好的分片鍵。

本文將詳細介紹關(guān)于MongoDB分片鍵的選擇和案例,分享出來供大家參考學(xué)習(xí),下面話不多說了,來一起看看詳細的介紹吧。

MongoDB版本:3.6

一、分片鍵類別

1.升序片鍵

升序片鍵例如:日期時間字段、自增字段。

2.隨機分發(fā)片鍵

隨機分發(fā)片鍵例如:用戶名、郵件名、UUID、MD5值或者是其它的一些沒有規(guī)律的值的列。

3.基于位置的片鍵

基于位置的片鍵例如:IP、經(jīng)緯度、居住地址等。

二、分片策略

1.范圍分片

創(chuàng)建分片時,只在主分片上創(chuàng)建了一個塊{ "username" : { "$minKey" : 1 } } -->> { "username" : { "$maxKey" : 1 } } on : rs-a Timestamp(1, 0) 。

MongoDB,分片鍵

至少得3個不同的值才會進行塊切分,相同的值只會在一個分片塊中。比如對一個name字段進行范圍分區(qū),如果一直往name字段插入"a",那么它會一直存儲主分片的{ "username" : { "$minKey" : 1 } } -->> { "username" : { "$maxKey" : 1 } }中,直到name出現(xiàn)三個不同的值,比如“a”,“b”,“c”這個時候就會進行分片。當(dāng)然這只是測試,現(xiàn)實中不會對這種粗粒度的字段單獨做分片。

2.hashed分片

創(chuàng)建分片時,默認在每個分片上創(chuàng)建了兩個數(shù)據(jù)塊。但是當(dāng)前每個塊上面是沒有數(shù)據(jù)的。

MongoDB,分片鍵

3.組合分片

組合分片是比較好的一種分片的選擇,好的組合分片可以同時解決熱點和隨機讀IO問題。例如:

sh.shardCollection("test.bbbb",{"username":1,"_id":1});

4.標(biāo)簽分片

比如對于一些日志非查詢文檔,可以通過標(biāo)簽將其只插入到某個分片中。例如

sh.addTagRange("test.log",{ "_id" : { "$minKey" : 1 } }, { "_id" : { "$maxKey" : 1 } },"tag_rs-a");

可以在config庫中的tag文檔中查看設(shè)置的標(biāo)簽信息。

use configdb.tags.find();

三、標(biāo)簽

可以通過標(biāo)簽將特定范圍的數(shù)據(jù)在指定的分片中。

MongoDB,分片鍵

{ "_id" : 18000 } -->> { "_id" : 26000 }范圍的數(shù)據(jù)保存到rs-a的分片上,這部分數(shù)據(jù)跨越了兩個數(shù)據(jù)塊。

1.為分片指定tag

sh.addShardTag("rs-a","tag_rs-a");sh.addShardTag("rs-b","tag_rs-b");sh.addShardTag("rs-c","tag_rs-c");

2.創(chuàng)建規(guī)則

sh.addTagRange("test.person",{ "_id" : 18000 }, { "_id" : 26000 },"tag_rs-a");

MongoDB,分片鍵

數(shù)據(jù){ "_id" : 18000 } -->> { "_id" : 26000 }已經(jīng)被移動到了rs-a分片上。

四、分片案例

分片策略沒有絕對的好壞,針對不同的業(yè)務(wù)場景選擇不同的分片策略。

1.分片情景

1.所有的分片讀寫都均勻。

2.數(shù)據(jù)訪問均勻,而不是隨機性的訪問;由于新數(shù)據(jù)都是先在內(nèi)存中創(chuàng)建,盡量避免需要從磁盤訪問新數(shù)據(jù)。

3.盡量避免由于數(shù)據(jù)塊的數(shù)據(jù)移動導(dǎo)致數(shù)據(jù)從磁盤加載到內(nèi)存中從而導(dǎo)致熱數(shù)據(jù)被清理出內(nèi)存。

4.組合字段分片可能會是理想的分片方案。

MongoDB,分片鍵

分片鍵公式: {coarseLocality:1,search:1}

coarseLocality:應(yīng)該是一個大粒度的局部字段。比如MONTH月份升序字段。

search:是一個經(jīng)常用來查找的字段。

2.分片案例

案例1.使用日期字段、自增字段、時間戳分片的問題

有一個網(wǎng)站瀏覽記錄表,表中有一個createtime字段用來記錄每天記錄的插入時間。

對于這類文檔不太適合使用createtime字段作為分片字段,因為讀寫可能都會集中在最新的分片上。使用自增字段也存在同樣的問題

案例2.大粒度字段分片問題

有一個五大洲的用戶文檔表,表中有一個continent字段存儲用戶所在洲。

如果使用continent作為分片字段會存在以下幾個問題:

1.分片的粒度太大了,會導(dǎo)致最后每一個分片的數(shù)據(jù)都非常的大而且沒有再分的可能。而且也有可能會導(dǎo)致磁盤空間不夠的情況。

2.可能會導(dǎo)致某個分片在某個時間點的訪問量遠遠大于其他分片。

案例3:使用月份和用戶名進行組合分片

有一個用戶操作記錄集合,業(yè)務(wù)需要查詢用戶最近一個月操作記錄。集合有month,userName鍵

使用{month:1,userName:1}分片情景如下:

month保證熱數(shù)據(jù)優(yōu)于內(nèi)存。

userName:保證數(shù)據(jù)的隨機性,避免集中過熱問題。

存在的問題:對于新文檔由于很多月份還不存在,會導(dǎo)致新數(shù)據(jù)都是往最后一個分片上面插入數(shù)據(jù),存在熱讀寫問題,最后通過均衡器對數(shù)據(jù)塊進行移動。

數(shù)據(jù)測試

sh.shardCollection("test.news",{"month":1,"username":1 });

----插入1月數(shù)據(jù)10萬記錄

for(var i=0;i<100000;i++){db.news.insert({"_id":i,"month":"1","username":Math.random(),"createdate":new Date()})}

MongoDB,分片鍵

----插入2月數(shù)據(jù)10萬記錄

for(var i=100000;i<200000;i++){ db.news.insert({"_id":i,"month":"2","username":Math.random(),"createdate":new Date()})}

新數(shù)據(jù)往一直往最末尾的分片(rs-a)上插,因為這個時候"month":2在最大的分片上。 { "month" : "1", "username" : 0.9258836896982892 } -->> { "month" : { "$maxKey" : 1 }, "username" : { "$maxKey" : 1 } } on : rs-a Timestamp(3, 1)

MongoDB,分片鍵

數(shù)據(jù)插入完之后均衡器將rs-c上的一個塊分給了rs-a

----插入全部月份數(shù)據(jù)。

for(var a=1;a<13;a++){for(var i=0;i<20000;i++){ db.news.insert({"month":a,"username":Math.random(),"createdate":new Date()})}}

MongoDB,分片鍵

保證每個月的數(shù)據(jù)都均勻的分布到不同的分片上,并且隨著時間的推移舊的數(shù)據(jù)可能就不會被使用也不會被移動。

注意:這個案例比較特殊,因為對于日志集合比較舊的數(shù)據(jù)基本上是不會被查詢的,所以借助了month鍵作為了分片鍵保證了熱數(shù)據(jù)優(yōu)先存儲于內(nèi)存,對于整張表都是熱數(shù)據(jù)比如登入用戶集合就不適合這種分片方式,hashed會更適合。

案例4:使用隊列

隊列不僅在容災(zāi)中非常的有用,而且在常規(guī)的突發(fā)流量下也非常的有用。隊列可以吸收短時間內(nèi)爆發(fā)的大量請求。也可以把隊列反過來用,即緩存MongoDB返回的結(jié)果。

比如:RabbitMQ

案例5:使用用戶名和創(chuàng)建時間進行組合分片

用戶名:保證數(shù)據(jù)的隨機性,避免熱點問題

創(chuàng)建時間:保證單個數(shù)據(jù)塊過大問題

五、設(shè)計集合注意事項

1.集合的鍵數(shù)量應(yīng)該是固定的,包括嵌套文檔的數(shù)量都應(yīng)該提前規(guī)劃好。

2.盡量都是做原子更新,而不是某個鍵的值受其它鍵值更新的影響。比如num1,num2,total如果num鍵的值是經(jīng)常會被更新的那么這種設(shè)計就不好,因為total也要對應(yīng)跟著變,而mongodb本身計算能力就很弱。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網(wǎng)的支持。


注:相關(guān)教程知識閱讀請移步到MongoDB頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 干一夜综合 | 成人福利视频在线 | 久色网站 | 欧美成人一区二区三区 | 久久精品亚洲国产奇米99 | 久色伊人 | 日本网站一区 | 免费a级网站 | av国产免费 | 美女视频大全网站免费 | 久久久线视频 | 亚洲一区二区三区在线免费观看 | 国产一区二区三区在线观看视频 | 一区二区三区日本在线观看 | 毛片在线免费视频 | 国产高潮失禁喷水爽到抽搐视频 | 久久伊人国产精品 | www.91tv| 国产一级一区二区 | 久久久婷婷一区二区三区不卡 | 高清视频一区二区 | 在线看免费观看av | 久久久一区二区三区视频 | 视频一区免费观看 | 久草视频国产在线 | 黄色毛片免费看 | 亚洲欧美日韩久久精品第一区 | 日韩av电影免费看 | 亚洲乱码精品久久久久 | 精品久久久久久久久久久aⅴ | 欧美日韩中文字幕在线视频 | 欧美国产日韩在线观看成人 | 亚洲国产高清自拍 | 性视频久久 | 91久久在线观看 | 国产精品成人久久久久a级 av电影在线免费 | 青草久久网 | 久久久久亚洲精品国产 | 中文字幕一区2区 | 中文字幕 在线观看 | 日韩.www |