玩轉(zhuǎn)MongoDB從入門到實(shí)戰(zhàn)_第1頁
玩轉(zhuǎn)MongoDB從入門到實(shí)戰(zhàn)_第2頁
玩轉(zhuǎn)MongoDB從入門到實(shí)戰(zhàn)_第3頁
玩轉(zhuǎn)MongoDB從入門到實(shí)戰(zhàn)_第4頁
玩轉(zhuǎn)MongoDB從入門到實(shí)戰(zhàn)_第5頁
已閱讀5頁,還剩68頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

玩轉(zhuǎn)MongoDB1玩轉(zhuǎn)MongoDB從入門到實(shí)戰(zhàn)2阿里云NoSQL數(shù)據(jù)庫負(fù)責(zé)人的提升。我和同事們經(jīng)過一番調(diào)研,確定時(shí)機(jī)成熟,隨即敲定了將MongoDB放到阿里云上,作為在整個(gè)產(chǎn)品的上線研發(fā)過程中,對MongoDB的學(xué)習(xí)愈加深入,就愈加的喜愛它。其靈活的3玩轉(zhuǎn)MongoDB從入門到實(shí)戰(zhàn)4微信關(guān)注公眾號:阿里云數(shù)據(jù)庫微信關(guān)注公眾號:阿里云數(shù)據(jù)庫第一時(shí)間,獲取更多技術(shù)干貨16復(fù)制集使用及原理介紹2534ChangeStreams使用及原理阿里云開發(fā)者“藏經(jīng)閣”海量免費(fèi)電子書下載47阿里云開發(fā)者“藏經(jīng)閣”海量免費(fèi)電子書下載55玩轉(zhuǎn)MongoDB從入門到實(shí)戰(zhàn)走進(jìn)MongoDB一、MongoDB的相關(guān)概念在生產(chǎn)環(huán)境中,MongoDB經(jīng)常會(huì)部署成一個(gè)三節(jié)點(diǎn)的復(fù)制集,為一個(gè)復(fù)制集時(shí),應(yīng)用程序通過驅(qū)動(dòng),直接請求復(fù)制集中的主節(jié)點(diǎn),完成讀寫操作。另外兩個(gè)從節(jié)點(diǎn),會(huì)自動(dòng)和主節(jié)點(diǎn)同步,保持?jǐn)?shù)據(jù)的更新。在集群運(yùn)行的過程中,萬一主節(jié)點(diǎn)遇到故障,兩個(gè)從節(jié)點(diǎn)會(huì)在幾秒的時(shí)間內(nèi)選舉出新的主節(jié)點(diǎn),繼續(xù)支持應(yīng)用的讀寫操作。我們再來看右邊,當(dāng)MongoDB被部署為一個(gè)分片集群時(shí)結(jié)果合并,返回給應(yīng)用程序。那集群中的數(shù)據(jù)是如何分布的呢?這些元數(shù)據(jù)記錄在ConfigServer中走進(jìn)MongoDB一、MongoDB的相關(guān)概念MongoDB的功能定位(二)MongoDBMongoDB的功能定位MemcachedScalability&PerformanceJoinTableScalability&PerformanceJoinTableParent-ChildTablesIndexRowColumnViewMulti-RecordACIDTransactionRDBMSRDBMSDatabaseMulti-DocumentACIDMulti-DocumentACIDEmbeddingLinking,SlookupNestedSub-EmbeddingLinking,SlookupNestedSub-DocumentorArrayViewIndexCollectionDatabaseDocumentFieidOn-DemandMaterializedIndexCollectionDatabaseDocumentFieidTransactionViewMongDB定位上,MongoDB介于Memcached和關(guān)系型數(shù)據(jù)庫之間,擴(kuò)展性和性能上,MongoDB更接近于Memcached,功能上,MongoDB更接近于關(guān)系型數(shù)據(jù)庫。ViewMongDB(一)MongoDB部署模型MongoDB部署模型ReplicaSetShardClusterApplicationApplication通常使用內(nèi)嵌的子文檔或內(nèi)嵌數(shù)組;關(guān)系型數(shù)據(jù)里有Index索引,MongoDB也有類似面經(jīng)常使用Join連接操作,對應(yīng)MongoDB通常使用內(nèi)嵌也可支持左外鏈接;關(guān)系型數(shù)據(jù)庫里面還有視圖,對應(yīng)MongoDB也有只讀視圖和按需物化視圖;關(guān)系型數(shù)據(jù)庫里面會(huì)有(一)MongoDB部署模型MongoDB部署模型ReplicaSetShardClusterApplicationApplicationApplicationDriverReadWriteReadWriteReadWriteMongoDMongoDB里面數(shù)據(jù)主要分為三層,文檔(Documents),集合(Collections),和數(shù)據(jù)庫(Databases),多個(gè)文檔是存儲(chǔ)在一個(gè)集合中,多個(gè)集合存放在一個(gè)數(shù)據(jù)庫里,MongoD例如:ConfigShardServersConfigShardServers(replicaset)·集合(Collections):Books,Movies,Music7玩轉(zhuǎn)MongoDB從入門到實(shí)戰(zhàn)數(shù)據(jù)庫和集合的組合,構(gòu)成MongoDB的命名空·Products.Books·Products.Movies·Products.Music*數(shù)據(jù)庫名最長不能超過64個(gè)字節(jié),命名空間最長不能超過120字節(jié)*FCV>=4.4,命名空間長度限制為255字節(jié)(四)MongoDB的數(shù)據(jù)結(jié)構(gòu)MongoDB采用JSON文檔結(jié)構(gòu):·JSON的全稱:JavaScriptObjectNotation·JSON的格式:支持如下數(shù)據(jù)格式·字符串:e.g.,“Thomas”·數(shù)字:e.g.,29,3.7)·布爾:True/false·空值:Null·數(shù)組:e.g.,[88.5,91.3,67.1]·對象:Object{}(五)MongoDB采用BSON格式保存數(shù)據(jù)MongoDB數(shù)據(jù)類型TypeTypeNumberAlias1“double”String2“string”3“object”Array4“array”Binarydata5“binData”6“undefined”7“objectld”Boolean8“bool”Date9“date”RegularExpression“null”“regex”DBPointer“dbPointer”JavaScript“javascript”Symbol“symbol”JavaScript(withscope)“javascriptWithScope”32-bitinteger“int”Timestamp“timestamp”64-bitinteger“l(fā)ong”Decimal128“deciml”-1“minKey”“maxKey”上圖是MongoDB數(shù)據(jù)類型的一些列表,常見類型MongoDB幾乎都支持。二、集群部署安裝你的第一個(gè)MongoDB系統(tǒng)第一個(gè)命令:下載linux-x86__64-rhel70-4.4.2.tgz第二個(gè)命令:解壓tarxzvfmongodb-linux-x86__64-rhel70-4.4.2.tgz第三個(gè)命令:改個(gè)目錄名mvmongodb-linux-x86__64-rhel70-4.4.2mongodb第四個(gè)命令:沒了!運(yùn)行MongoDB訪問MongoDB錄MongoDBshellversion:4.4.2...Serverhasstartupwarnings:2020-12-15T04:23:25.268+0000ICONTROL[initandlisten]2020-12-15T04:23:25.268+0000ICONTROL[initandlisten]**WARNING:Accesscontrolisnotenabledforthedatabase....創(chuàng)建復(fù)制集練習(xí)1.創(chuàng)建數(shù)據(jù)目錄:2.啟動(dòng)三個(gè)MongoDB服務(wù)mongod--replSetrs--dbpath./rs1--port27017--fork--logpath./rsmongod--replSetrs--dbpath./rs2--port27018--fork--logpath./rsmongod--replSetrs--dbpath./rs3--port27019--fork--logpath./rs3.連接MongoDB服務(wù):4.指定復(fù)制集配置rs.add('<HOSTNAME>:27018')//增加一個(gè)節(jié)點(diǎn)配置rs.add('<HOSTNAME>:27019')//增加一個(gè)節(jié)點(diǎn)配置rs.status()創(chuàng)建分片集群練習(xí)1.創(chuàng)建ConfigServer復(fù)制集2.創(chuàng)建一個(gè)或多個(gè)分片(每個(gè)分片為一個(gè)復(fù)制集)3.啟動(dòng)Mongos(一個(gè)或多個(gè))4.訪問Mongos,把分片添加到集群5.選擇片鍵,啟用分片以上就完成整個(gè)分片集群的部署。生產(chǎn)環(huán)境當(dāng)中,大家應(yīng)該遵循生產(chǎn)環(huán)境部署的一些最佳實(shí)踐。比如:網(wǎng)絡(luò)帶寬2.高可用:部署復(fù)制集或分片集群3.節(jié)點(diǎn)個(gè)數(shù):復(fù)制集部署奇數(shù)個(gè)節(jié)點(diǎn),避免腦裂4.應(yīng)用生產(chǎn)環(huán)境的最佳實(shí)踐,如:·使用主機(jī)名而不是IP·文件系統(tǒng)(Linux環(huán)境推薦XFS)·禁用NUMA·禁用THP·調(diào)高資源限制·Swappiness·Readahead·Tcp__Keepalive__Time·時(shí)鐘同步·安全配置·…9玩轉(zhuǎn)MongoDB從入門到實(shí)戰(zhàn)db.orders.deleteOne({"_id":ObjectId("563237a41a4d68582c2509da")});ISODate("2015-11-01T12:40:15Z")}});使用Drop刪除集合·使用DB.<COLLECTION>.Drop()來刪除一個(gè)集合·集合中的全部文檔都會(huì)被刪除.·集合相關(guān)的索引也會(huì)被刪除db.colToBeDropped.drop()使用DropDatabase刪除數(shù)據(jù)庫·使用DB.dropDatabase()來刪除數(shù)據(jù)庫·數(shù)據(jù)庫相應(yīng)文件也會(huì)被刪除,磁盤空間將被釋放usetempDBdb.dropDatabase()使用Find查詢數(shù)據(jù)文檔Find返回?cái)?shù)據(jù)的游標(biāo)(Cursor)使用Find查詢數(shù)據(jù)文檔Find返回?cái)?shù)據(jù)的游標(biāo)(Cursor)SQL查詢條件對照aISNULL->{a:{$exists:false}}aIN(1,2,3)->{a:{$in:[1,2,3]}}$ne:不存在或存在但不等于·查詢參數(shù)·更新參數(shù)db.movies.insert([}Update更新數(shù)組操作$Push:增加一個(gè)對象到數(shù)組底部$PushAll:增加多個(gè)對象到數(shù)組底部.$Pop:從數(shù)組底部刪除一個(gè)對象$Pull:如果匹配指定的值或條件,從數(shù)組中刪除相應(yīng)的對象.的對象.$AddToSet:如果不存在則增加一個(gè)值到數(shù)組使用{Upsert:True}更新或插入如果希望沒有就添加,指定Upsert:True參數(shù):5}},{upsert:t{“_id”:ObjectId("5847f65f83432667e51e5ea8"),}11玩轉(zhuǎn)MongoDB從入門到實(shí)戰(zhàn)MongoDB聚合框架聚合框架(AggregationFramework)是用于在一個(gè)或幾個(gè)集合上進(jìn)行的一系列運(yùn)算從而得到期望的數(shù)據(jù)集的運(yùn)算框架。從效果而言,聚合框架相當(dāng)于SQL查詢中的:·GROUPBY·LEFTOUTERJOIN·AS·…·但聚合框架的作用不限于此(二)管道(Pipeline)和步驟(Stage)管道(Pipeline):·聚合框架對數(shù)據(jù)進(jìn)行處理的過程;·與Linux管道有類似之處;步驟(Stage):·步驟(Stage)是指管道中的一步操作。每個(gè)步·接受一系列文檔(原始數(shù)據(jù));·在這些文檔上進(jìn)行一系列運(yùn)算;·生成下一個(gè)步驟所需的文檔;中間結(jié)果1原始數(shù)據(jù)集中間結(jié)果2中間結(jié)果1原始數(shù)據(jù)集中間結(jié)果2結(jié)果集管道聚合框架聚合框架管道和步驟的示意,一個(gè)原始的數(shù)據(jù)集,有很多的數(shù)據(jù),中間有對應(yīng)的結(jié)果,1和2是每一個(gè)階段執(zhí)行的結(jié)果,最后處理作為最終的一個(gè)結(jié)果集返回給應(yīng)用程序。每一次的處理過程對應(yīng)的一個(gè)處理的步驟,這些步驟按照順序整合起來,就是聚合框架的管道,從原始的數(shù)據(jù)集經(jīng)過每一個(gè)步驟的處理,整個(gè)處理的方式和流程,就是MongoDB聚合框架。pipeline=[$stage1,$stage2,...$stageN];db.<COLLECTION>.aggregate();聚合框架的基本使用,在MongoDB聚合框架里面最重要的一個(gè)參數(shù)就是Pipeline,Pipeline是一個(gè)數(shù)組的形式,在數(shù)組里面每一個(gè)元素表示一個(gè)對應(yīng)的步驟,然后把整個(gè)Pipeline傳給數(shù)據(jù)庫進(jìn)行執(zhí)行,然后就按照這些步驟進(jìn)行執(zhí)行,最后把結(jié)果返回給客戶端。(二)常用步驟(stage)運(yùn)算符1TypeNumberAlias$match過濾WHERE$project投影AS$sort排序ORDERBY$group分組GROUPBY$skip/$limit結(jié)果限制SKIP/LIMIT$lookup左外連接LEFTOUTERJOIN聚合框架的基本使用,在MongoDB聚合框架里面最重要的一個(gè)參數(shù)就是Pipeline,Pipeline是一個(gè)數(shù)組的形式,在數(shù)組里面每一個(gè)元素表示一個(gè)對應(yīng)的步驟,然后把整個(gè)Pipeline傳給數(shù)據(jù)庫進(jìn)行執(zhí)行,然后就按照這些步驟進(jìn)行執(zhí)行,最后把結(jié)果返回給客戶端。$and$or$not$in$geoWithin/$intersect選擇需要的或排除不需要的字段$and$or$not$in$geoWithin/$intersect選擇需要的或排除不需要的字段$map/$reduce/$filter$range$substract/$add$year/$month/$dayOfMonth/$hour/$minute/$second$sum/$avg$push/$addToSet$first/$last/$max/$min在每一個(gè)步驟里面還包含很多的子運(yùn)算符,在$Match里面經(jīng)常會(huì)用到了EQ,表示某個(gè)條件相等,$GT大于$GTE大于等于等;還有$And/$All這些邏輯運(yùn)算符,還有表示地理位置的,例如$Geowithin/$Intersect,表示地理位置運(yùn)算的運(yùn)算符,$Project階段步驟,可能會(huì)用到$Map,$Reduce來對數(shù)組的每個(gè)元素進(jìn)行還有進(jìn)行加減乘除的,例如$Multiply、$Divide、$Subtract、$Add等;進(jìn)行日期運(yùn)算的像$Year、$Month等子的運(yùn)算符,在$Group里面經(jīng)常進(jìn)行聚合操作,例如子運(yùn)算符經(jīng)常會(huì)用到$Sum來進(jìn)行匯總、$Avg求平均值、$Push、$AddToSet來對數(shù)組進(jìn)行操作。(三)常用步驟(stage)運(yùn)算符2SQL等價(jià)運(yùn)算符云算符$unwind$graphLookup$facet/$bucket作用展開數(shù)組圖搜索分面搜索還有其他的常用步驟運(yùn)算符$Unwind可以展開數(shù)組,例如在數(shù)組中有三個(gè)元素,到了$Unwind后就會(huì)展開成三個(gè)文檔,形成三條記錄。$GraphLookUp可以進(jìn)行圖搜索,$Facet和$Bucket,進(jìn)行分面搜索?!ぴ蛞唬悍捶妒皆O(shè)計(jì);Type$project$group·原因二:讀取效率低下;·原因三:分布式環(huán)境;右表左表分片1右表左表分片1左表右表左表右表分片2單機(jī)JOIN分單機(jī)JOIN分片3MongoDB里面連接Join操作只有左外連接,因?yàn)镴oin這種操作上是違反MongoDB設(shè)計(jì)的初衷的,這樣操作經(jīng)常要對兩個(gè)表的不同數(shù)據(jù)進(jìn)行連接操作,這些數(shù)據(jù)在物理存儲(chǔ)的時(shí)候,通常不是在相鄰的區(qū)域里面,讀取的此外MongoDB是一個(gè)分布式的環(huán)境,校驗(yàn)操作的左右兩邊如果都是一個(gè)分片的表,當(dāng)進(jìn)行Join操作的時(shí)候,左邊有一個(gè)又有一條數(shù)據(jù),它可能在分片一上要連接的一個(gè)數(shù)據(jù)可能在分片二上,下一條數(shù)據(jù)可能又是另外一種情況,這種情況下數(shù)據(jù)庫很難保證整個(gè)操作的性基于這些原因,MongoDB只提供左外連接,并且要求From表不能是分片表,左邊的表主表可以是分片表,在SQL里面會(huì)使用類似于左邊這樣的一個(gè)查詢語句。SELECTFIRST_NAMEAS'名'LAST_NAMEAS'姓'FROMUsersWHEREGENDER='男'SKIP100db.users.aggregate([{$match:{gender:'女'}},_id:'DEPARTMENT'emp_qty:{$sum:1}},{$match:{emp_qty:{It:10}}}]};在SQL里面還會(huì)使用GroupBY類似于左邊這樣的一個(gè)運(yùn)算符,對應(yīng)的在MongoDB里面是使用聚合運(yùn)算Aggregate。13玩轉(zhuǎn)MongoDB從入門到實(shí)戰(zhàn)(一)$unwind{score:[{subject:'語文',score:84},{subject:'數(shù)學(xué)',score:90},{subject:'外語',score:69}]}db.students.aggregate([{$unwind:'score'}]){name:'張三',score:{subject:'語文',score:84}}{name:'張三',score:{subject:'數(shù)學(xué)',score:90}}{name:'張三',score:{subject:'外語',score:69}}db.students.aggregate([{$unwind:'$score'},{$sort:{name:1,"score.score":-1}}{name:'張三',score:{subject:'數(shù)學(xué)',score:90}}{name:'張三',score:{subject:'語文',score:84}}{name:'張三',score:{subject:'外語',score:69}}$Unwind的操作符,這里有示例一條數(shù)據(jù),Name等于張三,張三的成績放在Score這個(gè)數(shù)組里面,分別對應(yīng)有三個(gè)元素,第一個(gè)是語文成績,第二個(gè)是數(shù)學(xué)成績,第三個(gè)是外語成績。如果只使用$Unwind的操作符,就會(huì)把這一個(gè)數(shù)據(jù)一條文檔展開成三個(gè)文檔,分別是語文、數(shù)學(xué)和外語的成績,進(jìn)一步在$Unwind的下面加一個(gè)$Sort的操作符,按照姓名Name進(jìn)行排序,在Name相同的情況下,按照Score進(jìn)行降序??梢钥吹椒祷氐牡谝粭l結(jié)果就是張三并且是他科目當(dāng)中成績最高的,數(shù)學(xué)的得分在三科目當(dāng)中最高,所以數(shù)學(xué)的成績會(huì)排在最前面。分面搜索(facetedsearch)用于對結(jié)果文檔進(jìn)行分類以縮小搜索結(jié)果。例如:Top:World:ChineseSimplified(30,507)桶(bucket)地區(qū)(13,604)桶(bucket)地區(qū)(610)體育(270)健康(798)兒童與青少年@(259)參考(2,316)商業(yè)(5,940)家庭(125)新聞(464)游戲(566)社會(huì)(1,647)科學(xué)(983)藝術(shù)(1,028)計(jì)算機(jī)(1,727)購物(429)·Regional:AsiaChina(1,830)·World:ChineseTraditional(10,498)·World:Taiwanese(54)還有常用的像分面搜索,例如逛一些論壇,或者是博客網(wǎng)站的時(shí)候,經(jīng)常會(huì)看到帖子或者是文章,會(huì)按照不同的地區(qū),不同的內(nèi)容板塊,不同的類別,不同的標(biāo)簽來進(jìn)行統(tǒng)計(jì)。每一個(gè)內(nèi)容板塊對應(yīng)到MongoDB里,可以把它認(rèn)為一個(gè)是Bucket。120條[0,10)120條[0,10)20條[10,20)20條[10,20)價(jià)格300條[20,30)價(jià)格300條[20,30)500條[30,40)500條[30,40)10條[40,)10條[40,)例一:有很多的商品,我們希望按照商品的價(jià)格來進(jìn)行分類統(tǒng)計(jì),想按照價(jià)格在0~10之間,10~20之間,還有20~30,30~40以及大于40的,希望能夠統(tǒng)計(jì)每一個(gè)區(qū)間里面商品的個(gè)數(shù),對應(yīng)可以用Aggregation,然后使用$Bucket這樣的階段操作符。ducts.aggregate([ducts.aggregate([{$bucket:{groupBy:"$price",boundaries:[0,10,20,30,40],default:"Other"output:{count:{$sum:1}}}}])$Bucket主要有這幾個(gè)參數(shù),第一個(gè)是GroupBy,也就是要進(jìn)行分組,使用$Price,基于價(jià)格字段進(jìn)行分組。第二個(gè)參數(shù)是Boundaries,在進(jìn)行分組的時(shí)候,每個(gè)分割的區(qū)間有00:00、2:00、3:00、4:00這幾個(gè)分區(qū)的點(diǎn),其他的放在Default,它的值是Other.針對每一個(gè)分組的操作,要執(zhí)行$Sum,求和的操作,返回的結(jié)果放在Count里面。例二:商品按照不同的價(jià)格區(qū)間來進(jìn)行分組的同時(shí)還希望商品按照年份來進(jìn)行分組。[0,10)120條[0,10)120條價(jià)格[10,20)20條Other10條數(shù)據(jù)[1890,1901)80條[1901,1920)年份30條Unknown40條ducts.aggregate([{$facet價(jià)格[10,20)20條Other10條數(shù)據(jù)[1890,1901)80條[1901,1920)年份30條Unknown40條ducts.aggregate([{$facet:{price:{$bucket:{...}},year:{$bucket:{...}}}}])在MongoDB里面,可以通過$Facet查詢操作來完成這樣的統(tǒng)計(jì),可先按照Price也就是價(jià)格進(jìn)行一個(gè)$Bucket的操作,此外除了Price之外,還按照年份進(jìn)行另外一個(gè)的運(yùn)算。如果有其他的一個(gè)統(tǒng)計(jì)的需要,可以繼續(xù)加在后面,通過一個(gè)$Facet的操作,就可以把商品按照不同的維度進(jìn)行分類統(tǒng)計(jì)。(三)圖搜素$graphLookup(from表暫不支持分片)A認(rèn)識(shí)aA與a互相熟識(shí)A認(rèn)識(shí)aA與a互相熟識(shí)可以使用$GraphLookUp操作符來進(jìn)行圖搜索。15玩轉(zhuǎn)MongoDB從入門到實(shí)戰(zhàn)·基于一個(gè)或多個(gè)其他集合創(chuàng)建·預(yù)定義聚合查詢·類似于SQL中的視圖·數(shù)據(jù)抽象·保護(hù)敏感數(shù)據(jù)的一種方法·將敏感數(shù)據(jù)投影到視圖之外·只讀·結(jié)合基于角色的授權(quán),可按角色訪問信息{$project:{_id:0,first_name:1,Iast_name:1,} }#viewsmetadataisstoredinthesystem.viewsdb.system.views.find()對于敏感數(shù)據(jù),把數(shù)據(jù)的敏感字段放到視圖之外,查詢的結(jié)果里面就不會(huì)包含視圖之外的字段,視圖還是只讀的。結(jié)合上MongoDB里基于角色的權(quán)限授權(quán),可以按角色去控制數(shù)據(jù)的訪問,保護(hù)這些敏感的數(shù)據(jù),讓沒有獲得授權(quán)的人通過訪問視圖不能夠訪問到敏感的信息。創(chuàng)建視圖的命令對應(yīng)的是CreateView,其中包含的參數(shù)視圖的名稱和對應(yīng)的聚合表達(dá)式,這里使用的是$Project,排除_ID,保留First__Name、Last__Name、Gender、Email、Phone。(三)刪除刪除視圖的話和刪除一個(gè)集合是類似的,我們用“DB.+視圖的名稱+.Dorp()”就可以刪除視圖。一、MongoDB副本集概念及創(chuàng)建(一)MongoDB副本集的概念一、MongoDB副本集概念及創(chuàng)建(一)MongoDB副本集的概念·擴(kuò)展性的進(jìn)程去維持的復(fù)制協(xié)議保官方概念:副本集是一組MongoDB同樣的一份數(shù)據(jù)集,通過MongoDB證主備之間的數(shù)據(jù)一致性。的進(jìn)程去維持的復(fù)制協(xié)議保官方概念:副本集是一組MongoDB同樣的一份數(shù)據(jù)集,通過MongoDB證主備之間的數(shù)據(jù)一致性。ClientApplication·維護(hù)性ClientApplicationDriverWriteReadsRecommendMongoD務(wù)所受到的影響,比如版本升級與可能會(huì)影響用戶流量DriverWriteReadsRecommendMongoDClientApplicationDriverWriteReadsWriteReads2.客戶端讀取SecondaryClientApplicationDriverClientApplicationDriverPrimaryPrimaryReadsReadsWriteReadsRecommendPrimaryReplicationReplication SecondarySecondaryPrimaryReplicationReplication Secondary Secondary Secondary如上圖所示,MongoDB有兩種部署方式,如上圖所示,MongoDB有兩種部署方式,一個(gè)是Standalone部署模式,另外一個(gè)是副本級,有不同角色的節(jié)點(diǎn),像Primary節(jié)點(diǎn)和Secondary節(jié)點(diǎn)。生產(chǎn)環(huán)境不建議部署Standalone模式。關(guān)鍵詞:可用性、拓展性、維護(hù)性·可用性屬性一:Priority=0當(dāng)Priority等于0時(shí),它不可以被副本集選舉為主,Priority的值越高,則被選舉為主的概率更大。屬性二:Vote=0不可以參與選舉投票,此時(shí)該節(jié)點(diǎn)的Priority也必須17玩轉(zhuǎn)MongoDB從入門到實(shí)戰(zhàn)為0,即它也不能被選舉為主。{"host":"localhost:27017","arbiterOnly":false,},"slaveDelay":NumberLong(0),},{"host":"localhost:"arbiterOnly":false,},"slaveDelay":NumberLong(0),},成員角色:·Primary:主節(jié)點(diǎn),可以接受讀寫,整個(gè)副本集某個(gè)時(shí)刻只有一個(gè)?!econdary:只讀節(jié)點(diǎn),分為以下三個(gè)不同類型:·Hidden=False:正常的只讀節(jié)點(diǎn),是否可選為主,是否可投票,取決于Priority,Votes的值;·Hidden=True:隱藏節(jié)點(diǎn),對客戶端不可見,可以參與選舉,但是Priority必須為0,即不能被提·DelayedSecondary:延遲只讀節(jié)點(diǎn),會(huì)延遲一定的時(shí)間(SlaveDelay配置決定)從上游復(fù)制增量,常用于快速回滾場景?!rbiter:仲裁節(jié)點(diǎn),只用于參與選舉投票,本身不承基于工具搭建測試實(shí)例目的:業(yè)務(wù)要做線下測試,需要在本地環(huán)境搭建一個(gè)副本級或去探索新版本,比如4.4新增的功能。使用工具M(jìn)tools:·MongoDB官方工程師個(gè)人作品,功能強(qiáng)大;·包含:實(shí)例部署,日志解析/可視化,數(shù)據(jù)遷移等功·Github:/rueckstiess/mtools基于mtools部署副本集,一條命令:community/4.4.0/bin'--replicaset--nodes3--namereplset44--dir~/work/mtools_data/data執(zhí)行Mlaunch,Init然后指定Binarypath還有一些副本集相關(guān)參數(shù),Mtools會(huì)一鍵創(chuàng)建副本集,具體命令執(zhí)行演示如下:~mlaunchinit--binarypath'/usr/local/Cellar/mongodb-community/4.4.0/bin'>--replicaset--nodes3--namereplset44--dir~/work/mtools__data/data2launching:"/usr/local/Cellar/mongodb-community/4.4.0/bin/mongod"onport27017launching:"/usr/local/Cellar/mongodb-community/4.4.0/bin/mongod"onport27018launching:"/usr/local/Cellar/mongodb-community/4.4.0/bin/mongod"onport27019replicaset'replset44'initialized.-~mongo--eval"rs.status()"MongoDBshellversionv4.2.0connectingto:mongodb://:27017/?compressors=disabled&gssapiServiceName=mongodbImplicitsession:session{"id":UUID("5104295a-30d4-4d02-8836-5a76eb81c93c")}MongDBserverversion:4.4.0WARNING:shellandserverversionsdonotmatch{"set":"replset44","date":ISODate("2020-12-02T07:43:54.249Z"),"myState":"replset44","term":NumberLong(1),"syncSourceHost":"","syncSourceId":-1,"heartbeatIntervalMillis":NumberLong(2000),"majorityVoteCount":2,"writeMajorityCount":2,"votingMembersCount":3,"writableVotingMembersCount":3,創(chuàng)建云上實(shí)例·MongoDB的運(yùn)維門檻較高,需要對相關(guān)原理有比較深刻的理解,才能運(yùn)維好MongoDB副本集實(shí)例;·推薦更便捷、可靠的方式:使用MongoDB云服務(wù),一站式的解決方案。阿里云MongoDB具有社區(qū)版不具備的高級功能,如審計(jì)日志、按時(shí)間點(diǎn)恢復(fù)等,詳情如下:方式二(強(qiáng)烈推薦):通過高可用Uri的方式連接MongoDB,當(dāng)Primary故障切換后,MongoDBDriver可自動(dòng)感知并把流量路由到新的Primary節(jié)點(diǎn),如下圖所示。·阿里云方式二(強(qiáng)烈推薦):通過高可用Uri的方式連接MongoDB,當(dāng)Primary故障切換后,MongoDBDriver可自動(dòng)感知并把流量路由到新的Primary節(jié)點(diǎn),如下圖所示。二、MongoDB副本集使用介紹(一)MongoDB副本集連接方式/document__detail/44623.html19玩轉(zhuǎn)MongoDB從入門到實(shí)戰(zhàn)(二)MongoDB副本集狀態(tài)查看查看副本集整體狀態(tài):rs.status()查看當(dāng)前節(jié)點(diǎn)角色:db.isMaster()查看同步進(jìn)度/oplog信息:rs.printSlaveReplicationInfo()/rs.printReplicationInfo()共兩個(gè)命令,第一個(gè)命令返回一個(gè)匯總的各Secondary(三)副本集的基本讀寫連接副本集實(shí)例,來執(zhí)行例如Insert,F(xiàn)ind命令,和Standalone模式無差異,重點(diǎn)看副本集(四)擴(kuò)展副本集的讀能力——ReadPreferenceDriverDriverDriverReadwithReadwithReadPreference(nearest)ReadPreference(ReadwithReadwithReadPreference(nearest)SecondaryPrioritySecondaryPriority:0Priority:1PrimaryPriority:1DataCenter1DataCenter2如上圖所示,左邊為一個(gè)三節(jié)點(diǎn)的副本集,它部署在兩個(gè)數(shù)據(jù)中心,Primary和其中一個(gè)Secondary部署在DataCenter1,另一個(gè)Secondary部署在DataCenter2,當(dāng)用默認(rèn)的ReadPreference時(shí),直接讀寫Primary節(jié)點(diǎn)。如果在DataCenter2也有業(yè)務(wù)進(jìn)程存在時(shí),也需要讀取MongoDB時(shí),則需要用ReadPreference模式自動(dòng)識(shí)別節(jié)點(diǎn)的遠(yuǎn)近,讀取DataCenter2的Secondary。ReadPreference共有以下五種模式:模式一Primary模式二PrimaryPreferred模式三Secondary只從從節(jié)點(diǎn)讀取。模式四SecondaryPreferred模式五Nearest(五)控制寫操作的持久性級別——WriteConcern{w:<{w:<value>,<boolean>,wtimeout:<number>}w決定了寫操作返回前需要等待多少個(gè)副本集節(jié)點(diǎn)的確認(rèn)j決定寫操作產(chǎn)生的日志是否已經(jīng)落盤wtimeout決定了寫操作等待的超時(shí)時(shí)間,避免客戶端一直阻塞·w:決定了寫操作返回前需要等待多少個(gè)副·wtimeout:決定了寫操作等待的超時(shí)時(shí)間,避免客戶DriverDriverWriteConcern:WriteConcern:{w:{w:1}ResponseWriteApplyDriverDriverWriteConcern:WriteConcern:{w:{w:1}Response于寫操作在本地執(zhí)行完成后,需要等待日志(Journal)DriverDriverWriteConcern:WriteConcern:{w:{w:1}ResponsePrimaryPrimaryReplicateReplicateReplicateReplicateSecondarySecondarySecondarySecondary如上圖,當(dāng)W:"Majority",當(dāng)下發(fā)了這個(gè)寫操作之后,除了需要在Primary節(jié)點(diǎn)Apply完成,還需要復(fù)制到其中一個(gè)Secondary節(jié)點(diǎn)去Apply完成,才能向Driver反饋寫操作成功。在三節(jié)點(diǎn)副本集情況下,"Majority"相當(dāng)于兩個(gè)節(jié)點(diǎn),等同于W:2。(六)控制讀操作的一致性級別——ReadConcernReadConcern有五個(gè)級別如下:·"Local":讀操作直接讀取本地最新提交的數(shù)據(jù),返回的數(shù)據(jù)可能被回滾?!?Available":含義和"Local"類似,但是用于Sharding場景可能會(huì)返回孤兒文檔?!?Majority":讀操作返回已經(jīng)在多數(shù)節(jié)點(diǎn)確認(rèn)應(yīng)用完成的數(shù)據(jù),返回的數(shù)據(jù)不會(huì)被回滾,但可能會(huì)讀到歷史數(shù)據(jù)?!?Linearizable":讀取最新的數(shù)據(jù),且能夠保證數(shù)據(jù)不會(huì)被回滾,是所謂的線性一致性,是最高的一致性級別?!?Snapshot":只用于多文檔事務(wù)中,和"Majority"語義類似,但額外提供真正的一致性快照語義。21玩轉(zhuǎn)MongoDB從入門到實(shí)戰(zhàn)22PrimaryPrimaryX=1X=1X=2X=3X=4X=5Driverlocal:x=5available:x=5snapshot:(onlyintransaction)linearizable:x=5(needwait)local:x=4available:snapshot:ClientClientClientClientSecondaryPrimarySwitchSecondarySwitchPrimaryPrimaryCompactcollectionPrimarySecondaryPrimarySwitchSecondarySwitchPrimaryPrimaryCompactcollectionPrimary(onlyintransaction)local:x=3available:x=3snapshot:(onlyintransaction)ClientSecondarySecondaryClientSecondarySecondary(七)基于副本集的維護(hù)性操作舉例——RolloverCompact背景:集合頻繁的插入和刪除會(huì)導(dǎo)致“碎片率”上升,浪費(fèi)存儲(chǔ)空間。Tips:碎片率計(jì)算方式Https://developer.aliyun.(七)基于副本集的維護(hù)性操作舉例——RolloverCompact背景:集合頻繁的插入和刪除會(huì)導(dǎo)致“碎片率”上升,浪費(fèi)存儲(chǔ)空間。Tips:碎片率計(jì)算方式Https://developer.aliyun.com/article/769536MongoDB提供Compact命令來回收碎片,但會(huì)阻塞讀寫,對業(yè)務(wù)有影響,在副本集模式下,滾動(dòng)的方式來進(jìn)行Compact操作,避免影響業(yè)務(wù)。SecondrayX=1X=2X=3X=4SecondaryX=1X=2X=3Compactcollection上圖為一個(gè)三節(jié)點(diǎn)副本集,每個(gè)Secondary節(jié)點(diǎn)的復(fù)寫到5,第一個(gè)Secondary節(jié)點(diǎn)復(fù)制到x=4,第二個(gè)Secondary節(jié)點(diǎn)復(fù)制到x=3,在不同的ReadConcern也就是其中兩個(gè)節(jié)點(diǎn)。當(dāng)用Majority讀的時(shí)候,在Primary上只能讀到x=4,在第一個(gè)Secondary上能讀到x=4,但在第二個(gè)Secondary只能讀到x=3。Linearizable也比較特殊,只能在Primary節(jié)點(diǎn)上使用,因此也能讀取到x=5,但大家可能有疑惑,x=5并沒有復(fù)制到多數(shù)派節(jié)點(diǎn),MongoDB的解決方法是,當(dāng)使用Linearizable時(shí),在讀到x=5之后,會(huì)等x=5復(fù)制到多數(shù)派節(jié)點(diǎn),才會(huì)向客戶端返回成功。Compactcollection不同ReadConcemLevel的TradeoffCompactcollection舉個(gè)例子,上圖為一個(gè)三節(jié)點(diǎn)副本集,舉個(gè)例子,上圖為一個(gè)三節(jié)點(diǎn)副本集,在最左邊的副本集,用戶可以在Hidden節(jié)點(diǎn)完成CompactCollection操作。因?yàn)镠idden對客戶端不可見,因而對業(yè)務(wù)沒有影響。當(dāng)Hidden節(jié)點(diǎn)操作后,可以把Secondary節(jié)點(diǎn)切換成Hidden節(jié)點(diǎn),在新的節(jié)點(diǎn)上做CompactCollection操作(如上圖中間所示),最后將Primary節(jié)點(diǎn)也切換成Hidden節(jié)點(diǎn)(如上圖右邊所示),最終完成CompactCollection操作。切換節(jié)點(diǎn)會(huì)對業(yè)務(wù)產(chǎn)生些許影響,但Driver能夠自動(dòng)Handle,避免直接在Primary節(jié)點(diǎn)完成CompactCollection操作,導(dǎo)致業(yè)務(wù)對DB不可訪問。三、MongoDB副本集原理介紹(一)什么是MongoDBOplog·MongoDBOplog是Local庫下的一個(gè)集合,用來保存寫操作所產(chǎn)生的增量日志(類似于MySQL中·它是一個(gè)CappedCollection,即超出配置的最大值后,會(huì)自動(dòng)刪除最老的歷史數(shù)據(jù),MongoDB針對Oplog的刪除有特殊優(yōu)化,以提升刪除效率;·主節(jié)點(diǎn)產(chǎn)生新的OplogEntry,從節(jié)點(diǎn)通過復(fù)制Oplog并應(yīng)用來保持和主節(jié)點(diǎn)的狀態(tài)一致;·Oplog中包含的有:O——插入或更新的內(nèi)容secondarysecondary{t:2,ts:7,op:"u"}{t:2,ts:7,op:"u"}{t:1,ts:2,op:"u"}{t:2,ts:8,op:"i"}{t:2,ts:7,op:"u"}{t:1,ts:2,op:"u"}linearizablegetMorelocal/availablelinearizablegetMoredatadatadatadataFAST......SAFEFAST......{t:2,ts:8,op:"i"}primarysecondarymajority{t:2,ts:8,op:"i"}primarysecondary{{////Theoplogentrytimestamp."ts":Timestamp(1518036537,2),//Thetermofthisentry."t":NumberLong("i"),//Theoperationtype.//Thecollectionname."ns":"test.collectionidentifier".//Auniquecollectioniden"ui":UUID("c22f2fe6")),//Thedocumenttoinsert.LATEST:能讀到多新的數(shù)據(jù);FAST:能多快地返回?cái)?shù)據(jù);SAFE:讀的數(shù)據(jù)是否會(huì)發(fā)生回滾;Majority:能夠保證FAST,也就是數(shù)據(jù)不會(huì)被回滾。Linearizable:能夠保證數(shù)據(jù)不回滾,同時(shí)讀取最新數(shù)據(jù),但犧牲了延遲。"__id",Objectld("5a7b6639176928f52231db8d"),"__id",Objectld("5a7b6639176928f52231db8d"),}}MongoDBOplogEntry樣例總結(jié):ReadConcernLevel越高,一致性保證越好,但訪問延遲也更高。}MongoDBOplogEntry樣例23玩轉(zhuǎn)MongoDB從入門到實(shí)戰(zhàn)(二)Oplog保留策略——根據(jù)大小及根據(jù)時(shí)間范圍·4.4之前·根據(jù)Replication.OplogSizeMB的配置值決定Oplog集合的大小上限,默認(rèn)為磁盤空間的5%,如果用戶是單機(jī)多實(shí)例的部署形態(tài),需要調(diào)整默認(rèn)值;·當(dāng)Oplog集合大小超過上限時(shí),會(huì)自動(dòng)刪除最老的OplogEntry?!?.4刪除策略增強(qiáng):MongoDB提供了按時(shí)間段來保依次克隆所有DB·刪除時(shí),即使Oplog集合大小超過了配置的最大值,但最老的Oplog仍然在Storage.OplogMinRetenti依次克隆所有DBMongoDB目前提供在線修改OplogMinRetention-在線修改opMinRetentionHours11//First,showcurrentconfiguredvalue\2db.getSiblingDB("admin").serverStatus().oplogTruncation.oplogMinRetentionHours35db.adminCommand({6"replSetResizeOplog":1,7"minRetentionHours":27})(三)MongoDB副本集同步原理MongoDB副本集同步原理分為兩部分:全量同步與增量同步。·發(fā)生時(shí)機(jī):·新節(jié)點(diǎn)剛加入副本集時(shí)·老的節(jié)點(diǎn)因?yàn)橥綔蠖M(jìn)入Recovering狀態(tài)時(shí)·全量同步包含兩個(gè)階段:·數(shù)據(jù)克隆階段:記錄開始時(shí)間T1,從源端拉取所有的集合數(shù)據(jù),不保證數(shù)據(jù)和源的一致性,記錄結(jié)束時(shí)間·增量應(yīng)用階段:應(yīng)用從T1-T2期間的Oplog,達(dá)到一致性狀態(tài),全量同步結(jié)束。具體全量同步流程圖如下:數(shù)據(jù)數(shù)據(jù)克隆階段進(jìn)入STARTUP2失敗,1s后重新失敗,1s后重新選擇同步源選擇同步源克隆階段結(jié)束,從同步源獲取選擇同步源克隆階段結(jié)束,從同步源獲取stopTimestamp從同步源獲取從同步源獲取從beginApplying-Timestamp從beginApplying-Timestamp開始批量并發(fā)應(yīng)用到stopTimestamp如果發(fā)生如果發(fā)生需要重新全量同步Anotherbgthread獲取所有獲取所有DB列表DatabaseCloner,DatabaseCloner,獲取所有集合列表檢查同步源是否進(jìn)入Secondary狀態(tài)(一致性狀態(tài))進(jìn)入Secondary狀態(tài)(一致性狀態(tài))CollectionCloner,克隆集合和索引依次克隆DB下所有集合增量應(yīng)用增量應(yīng)用階段4.4增強(qiáng)——全量同步斷點(diǎn)續(xù)傳returnqueryresultandresumetokenupstreamdownstream{find:{},upstreamdownstream$__requestResumeToken:true}returnqueryresultfromlastbreakpointandresumetokenupstreamdownstream{find:{},upstreamdownstream$__resumeAfter:resumeToken}·4.4之前:全量同步期間,如果發(fā)生網(wǎng)絡(luò)異常,導(dǎo)致同步中斷,需要重頭開始,網(wǎng)絡(luò)環(huán)境比較差時(shí),大數(shù)據(jù)量很難完成全量同步,可用節(jié)點(diǎn)數(shù)變少,實(shí)例可用·4.4:基于「ResumeToken」機(jī)制,記錄全量拉取的位點(diǎn),網(wǎng)絡(luò)異常導(dǎo)致同步中斷后,重連時(shí)帶上ResumeToken;·Replication.initialSyncTransientErrorRetryPeriodSeconds參數(shù)決定了同步中斷后重試的超時(shí)時(shí)間,默認(rèn)24h。原理二:增量同步 cappedcollectionsyncsourcedatainitialsyncsyncsourceoplog cappedcollectionsyncsourcedatainitialsyncsyncsourceoplogtailablecursorreplBatcherstd:deque ·replBatcherstd:deque ·BlockQueueproducerwriteOpsToOplogwriteOpsToOplogreplWriter(applyOps)replWriter(applyOps)...default16threads...replWriter(applyOps)replWriter(applyOps)·發(fā)生時(shí)機(jī):全量同步結(jié)束后,持續(xù)同步,保持和主節(jié)點(diǎn)數(shù)據(jù)一致,可以從不同工作職責(zé)的角度分析增量·OplogFetcher線程負(fù)責(zé)拉取OplogFind命令創(chuàng)建TailableCursor,GetMore命令批量從同步源拉取Oplog,單個(gè)Batch最大16MB;·拉取的OplogBatch放到內(nèi)存中的BlockingQueue中;·ReplBatcher線程負(fù)責(zé)從BlockingQueue中取出Batch生成新的可Apply的Batch放到Deque中,這里主要是因?yàn)樾枰刂撇l(fā),有些操作需要放到一個(gè)單獨(dú)的Batch;·OplogApplier線程負(fù)責(zé)從Deque中取出Batch寫Oplog,然后把Batch拆分,分發(fā)到Worker線程進(jìn)行并發(fā)Apply;·為了保持一致性,中間需要保存多個(gè)不同的Oplog應(yīng)用位點(diǎn)信息。(四)MongoDB副本集高可用原理PrimaryPrimaryElectionforNewPrimarySecondarySecondaryHeartbeatSecondarySecondaryElectionforNewPrimaryPrimaryPrimaryReplicationHeartbeatSecondarySecondarytimesout,startselectiontimesout,timesout,startselectiontimesout,newelectionstartsupCandidateLeaderFollowerCandidateLeaderFollowerdiscoversserverwithhighertermdiscoversserverwithhighertermRaft:server狀態(tài)轉(zhuǎn)換·主備切換時(shí)機(jī):·主節(jié)點(diǎn)不可用;·新增節(jié)點(diǎn)(更高的Priority);·主動(dòng)運(yùn)維,rs.stepDown()orrs.reconfig()·MongoDB基于Raft協(xié)議實(shí)現(xiàn)了自己的高可用機(jī)·副本集之間保持心跳(默認(rèn)2秒探測一次);·如果超出ElectionTimeoutMillis(默認(rèn)10秒)沒有探測到主節(jié)點(diǎn),Secondary節(jié)點(diǎn)會(huì)發(fā)起選舉,發(fā)起前檢查自身?xiàng)l件:·Priority是否大于0·當(dāng)前狀態(tài)是否夠新·在真正選舉前,會(huì)先進(jìn)行一輪空投(Dry-Run),避免當(dāng)前Primary無意義的降級(StepDown),因?yàn)椤ry-Run成功后,會(huì)增加自身的Term發(fā)起真正的選舉,如果收到多數(shù)派的選票則選舉成功,把新的拓?fù)湫畔⑼ㄟ^心跳廣播到整個(gè)副本。四、總結(jié)(一)什么是MongoDBOplog·副本集是可用性、擴(kuò)展性、維護(hù)性的有效保證,中等業(yè)務(wù)規(guī)模,生產(chǎn)環(huán)境建議優(yōu)先選擇部署該形態(tài),如果是大型業(yè)務(wù)規(guī)模,建議使用Sharing形態(tài);·副本集使用務(wù)必使用高可用連接串的方式,避免業(yè)務(wù)訪問單點(diǎn);·默認(rèn)情況下的Read/WriteConcern可以滿足絕大部分業(yè)務(wù)需求,特殊情況需要在一致性和性能之間·Oplog是MongoDB的重要基礎(chǔ)設(shè)施,除了用于同步(全量+增量),還可用于構(gòu)建數(shù)據(jù)生態(tài)(ChangeStream);·MongoDB以Raft協(xié)議為指導(dǎo)實(shí)現(xiàn)了自己的高可用機(jī)制,大部分情況下,主節(jié)點(diǎn)故障15秒內(nèi)可選出新主。25玩轉(zhuǎn)MongoDB從入門到實(shí)戰(zhàn)一、分片集群的基本架構(gòu)為什么要使用分片集群?副本集遇到的問題:副本集(ReplicaSet)幫助我們解決讀請求擴(kuò)展、高可用等問題。隨著業(yè)務(wù)場景進(jìn)一步增長,可能會(huì)出現(xiàn)以下問題:·存儲(chǔ)容量超出單機(jī)磁盤容量·活躍數(shù)據(jù)集超出單機(jī)內(nèi)存容量:很多讀請求需要從磁盤讀取·寫入量超出單機(jī)IOPS上限垂直擴(kuò)容(ScaleUp)VS水平擴(kuò)容(ScaleOut·垂直擴(kuò)容:用更好的服務(wù)器,提高CPU處理核數(shù)、內(nèi)存數(shù)、帶寬等·水平擴(kuò)容:將任務(wù)分配到多臺(tái)計(jì)算機(jī)上什么是MongoDB分片集群:·MongoDB分片集群(ShardedCluster)是對數(shù)據(jù)進(jìn)行水平擴(kuò)展的一種方式?!ongoDB使用分片集群來支持大數(shù)據(jù)集和高吞吐量的業(yè)務(wù)場景。CostScaleUpCostCapabilityCostScaleOutCostCapabilityAppServerRouter(AppServerRouter(mongos)Shard(replicaset)分片集群的基本架構(gòu)·Mongos·分片集群的訪問入口·對請求進(jìn)行路由、分發(fā)、合并·部署多個(gè)Mongos來保證高可用·ConfigServer·存儲(chǔ)元信息和集群配置·部署為副本集來保證高可用·Shard·存儲(chǔ)用戶數(shù)據(jù),不同Shard保存不同用戶數(shù)據(jù)·部署為副本集來保證高可用AppServerRouter(mongos)IorIormoreRoutersConfigServersConfigServers(mongos)2ormore2ormoreShardsShardShard(replicaset)如何鏈接分片集群來達(dá)到和整個(gè)集群交互的目的,而Mongos則會(huì)根據(jù)客戶端的請求來向后端不同的Shard進(jìn)行請求的發(fā)起。比如對集合一進(jìn)行讀寫,Mongos會(huì)和ShardA和ShardB進(jìn)行請求交互,如果讀寫集合二,那么Mongos只會(huì)和ShardA進(jìn)行數(shù)據(jù)交互。如下圖所示:在阿里云Mongos的鏈接地址,并且拼接好了上申請的一個(gè)分片集群,列舉了每個(gè)如下圖所示:在阿里云Mongos的鏈接地址,并且拼接好了ConnectionStringURIConnectionStringURI,如果使用單個(gè)MongoConnectionStringURIShardAShardADriversReads/WritesRouterReads/WritesRouterReads/WritesReads/WritesShardShardBprimaryshardprimaryshard的選擇:mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]當(dāng)創(chuàng)建一個(gè)新的mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]ShardAShardAllectionllection1-1llection1-2DatabaseDatabase1Connection·mongodb://:前綴,代表這是一個(gè)StringURI連接地址。實(shí)例llection3-1Database3·Connection·mongodb://:前綴,代表這是一個(gè)StringURI連接地址。實(shí)例llection3-1Database3·hostX:portX:實(shí)例的連接地址和端口號。ShardB·/databaseShardBllection2-1llection2-1llection2-2llection3-2·?options:指定額外的連接選項(xiàng)。Database2Database2mongodb://user:password@mongosmongodb://user:password@mongos1:3717,mongos2:3717/adminmongoDB將數(shù)據(jù)進(jìn)行分片支持集合級別,已經(jīng)被分片的集合被切分成多份保存在shard上。sh.enableSharding("<database>")·<database>//mongoDB將數(shù)據(jù)進(jìn)行分片支持集合級別,已經(jīng)被分片的集合被切分成多份保存在shard上。sh.enableSharding("<database>")·<database>//eg:"record"Example:sh.enableSharding("records")sh.shardCollection("<database>.<collection>",{<key>:<direction>,...})·<key>:分片鍵字段的名字·<direction>:{1|-1|"hashed"}。1|-1:基于范圍分片鍵,"hashed":哈希分片鍵database的主分片(primaryshard)PrimaryShard的定義:默認(rèn)情況下,每個(gè)database的集合都是未分片的,存儲(chǔ)在一個(gè)固定的shard上,稱為primaryshard。27玩轉(zhuǎn)MongoDB從入門到實(shí)戰(zhàn)28{x{x:23}{x:26}{x:25}{x:27} “Example:sh.shardCollection("records.people",{zipcode:“Example:sh.shardCollection("records.people",{zipcode:1})”對records.people集合進(jìn)行分片,這是一個(gè)基于zipcode的范圍分片。HashFunctionShardBShardAminKey≤<ShardBShardAminKey≤<1010≤<2010≤<2020≤<maxKeyChunk1Chunk2Chunk3Chunk4Chunk1Chunk2Chunk3Chunk4key:{<existingkeyspecification>,<suffix1>:<1|"hashed">,...}})·MonotonicallyChanging(單調(diào)變化):使

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論