MongoDB Sharding技術(shù)是MongoDB為了解決隨著數(shù)據(jù)量的增加和讀寫請(qǐng)求的增加,單個(gè)MongoDB實(shí)例無法應(yīng)對(duì)的問題.通過使用Sharding,MongoDB將數(shù)據(jù)切分成多個(gè)部分,將數(shù)據(jù)分布存放在多個(gè)shard上.Sharding技術(shù)使單個(gè)shard處理請(qǐng)求減少和存儲(chǔ)容量減小,同時(shí),隨著集群的擴(kuò)大,整個(gè)集群的吞吐量和容量都會(huì)擴(kuò)大.
網(wǎng)站制作、網(wǎng)站建設(shè)介紹好的網(wǎng)站是理念、設(shè)計(jì)和技術(shù)的結(jié)合。創(chuàng)新互聯(lián)擁有的網(wǎng)站設(shè)計(jì)理念、多方位的設(shè)計(jì)風(fēng)格、經(jīng)驗(yàn)豐富的設(shè)計(jì)團(tuán)隊(duì)。提供PC端+手機(jī)端網(wǎng)站建設(shè),用營銷思維進(jìn)行網(wǎng)站設(shè)計(jì)、采用先進(jìn)技術(shù)開源代碼、注重用戶體驗(yàn)與SEO基礎(chǔ),將技術(shù)與創(chuàng)意整合到網(wǎng)站之中,以契合客戶的方式做到創(chuàng)意性的視覺化效果。
Sharded cluster分片集群有以下幾個(gè)組件:shards,query routers,config servers.
shards: 用來存儲(chǔ)數(shù)據(jù),為這個(gè)分片集群提供高可用和數(shù)據(jù)一致性。在一個(gè)生產(chǎn)環(huán)境中,每個(gè)shard都是一個(gè)replica set。
query routers: 或者是mongos實(shí)例,用于與應(yīng)用程序交互,將請(qǐng)求轉(zhuǎn)發(fā)到后端的shards,然后將請(qǐng)求結(jié)果返回給客戶端。一個(gè)分片集群可以有多個(gè)query router即mongos實(shí)例用于分?jǐn)偪蛻舳说恼?qǐng)求壓力。如果使用多個(gè)mongos實(shí)例,可以使用HAProxy或者LVS等代理來轉(zhuǎn)發(fā)客戶端請(qǐng)求到后端的mongos,必須要配置成client affinity模式保證來自同一個(gè)客戶端的請(qǐng)求轉(zhuǎn)發(fā)到后端相同的mongos.通常會(huì)將mongos實(shí)例部署到應(yīng)用服務(wù)器上。
config servers: 用于存儲(chǔ)分片集群的元數(shù)據(jù)。這些元數(shù)據(jù)包含整個(gè)集群的數(shù)據(jù)集合data sets與后端shards的對(duì)應(yīng)關(guān)系。query router使用這些元數(shù)據(jù)來將客戶端請(qǐng)求定位到后端相應(yīng)的shards。生產(chǎn)環(huán)境的分片集群正好有3個(gè)config servers。config servers里的數(shù)據(jù)非常重要,如果config servers全部掛掉,整個(gè)分片集群將不可用。在生產(chǎn)環(huán)境中,每個(gè)config server都必須放置到不同的服務(wù)器上,并且每個(gè)分片集群的config server不能共用,必須分開部署。
MongoDB Sharding是在Collection即集合層面來分布存儲(chǔ)數(shù)據(jù)的,Sharding依據(jù)shard key來講一個(gè)集合的數(shù)據(jù)來分布存儲(chǔ)。
為了將一個(gè)集合的數(shù)據(jù)進(jìn)行分片,首先需要選擇一個(gè)shard key。一個(gè)shard key可以是存在于一個(gè)集合中每個(gè)文檔的索引字段或者符合索引字段。MongoDB將這個(gè)shard key的值切分成多個(gè)數(shù)據(jù)塊,然后將這些數(shù)據(jù)塊均勻分布到后端的shard上。MongoDB使用range based partitioning 或者 hash based partitionning來講一個(gè)shard key的值進(jìn)行切分。shard key一旦選擇好是不能變更的。
Range Based Sharding
Given a range based partitioning system, documents with “close” shard key values e likely to be in the same chunk, and therefore on the same shard.
Hash Based Sharding
對(duì)于hash based partitionning,MongoDB會(huì)先計(jì)算一個(gè)字段值得哈希值,然后使用這些哈希值來創(chuàng)建數(shù)據(jù)塊。
With hash based partitioning, two documents with “close” shard key values are unlikely to be part of t same chunk. This ensures a more random distribution of a collection in the cluster.
Performance Distinctions between Range and Hash Based Partitioning
Range based partitioning支持更有效的范圍查詢。對(duì)于一個(gè)shard key給定一個(gè)范圍查詢,query router可以更容易地判斷將請(qǐng)求只路由到包含相應(yīng)數(shù)據(jù)庫的shard上。
Range based partitioning可能會(huì)導(dǎo)致數(shù)據(jù)分布不均,這樣會(huì)對(duì)sharding產(chǎn)生負(fù)面作用,比如會(huì)出現(xiàn)大部分請(qǐng)求被分發(fā)到同一個(gè)shard的情況發(fā)生。
Hash based partitioning可以確保數(shù)據(jù)平均分布,但是這樣會(huì)導(dǎo)致經(jīng)過哈希處理的值在各個(gè)數(shù)據(jù)塊和shard上隨機(jī)分布,進(jìn)而使制定的范圍查詢r(jià)ange query不能定位到某些shard而是在每個(gè)shard上進(jìn)行查詢。
Customized Data Distribution with Tag Aware Sharding
MongoDB允許使用tag aware sharding來根據(jù)shard key的范圍創(chuàng)建并關(guān)聯(lián)一些tag到后端的shards。主要用于同一個(gè)分片集群數(shù)據(jù)分布到多個(gè)數(shù)據(jù)中心的情況。
Maintaining a Balanced Data Distribution
隨著數(shù)據(jù)的增加或者是服務(wù)器的增加都會(huì)導(dǎo)致整個(gè)分片集群的數(shù)據(jù)分布不均衡,比如一個(gè)shard比其他shard上的數(shù)據(jù)庫chunk明顯多了很多,或者一個(gè)數(shù)據(jù)塊chunk的大小明顯比其他chunk大很多。
MongoDB使用兩個(gè)后臺(tái)進(jìn)程來確保一個(gè)均衡的分片集群,它們分別是splitting和balancer.
Splitting
Splitting是一個(gè)防止chunk變得太大的后臺(tái)進(jìn)程,當(dāng)一個(gè)chunk大小超過了指定的大小,MongoDB將會(huì)把這個(gè)chunk分成兩半。插入和更新操作都會(huì)觸發(fā)split。
Balancing
balancer是一個(gè)用于管理chunk遷移的后臺(tái)進(jìn)程。
當(dāng)一個(gè)分片集群中一個(gè)分片集合的數(shù)據(jù)分布不均衡時(shí),balancer進(jìn)程會(huì)把擁有最多chunk的shard上的chunk遷移到擁有最少chunk的shard上,直到這個(gè)集合的數(shù)據(jù)分布均衡為止。例如,集合user在shard 1上擁有100個(gè)chunk,在shard2上擁有50個(gè)chunk,balancer進(jìn)程會(huì)將shard1上的chunk遷移到shard2,直到兩個(gè)shard上的chunk數(shù)量保持均衡位置。
向一個(gè)分片集群中添加或刪除shard都會(huì)影響整個(gè)集群的均衡性。
Primary shard
每個(gè)數(shù)據(jù)庫都會(huì)有一個(gè)primary shard存儲(chǔ)這個(gè)數(shù)據(jù)庫中所有未被分片的集合數(shù)據(jù)。
MongoDB Sharding技術(shù)的應(yīng)用場景:
A.如果數(shù)據(jù)集data set大小將要或者已經(jīng)超過了單個(gè)MongoDB實(shí)例的容量大小。
B.活動(dòng)的工作集working set大小將要超過最大物理內(nèi)存大小
C.單個(gè)MongoDB實(shí)例無法滿足頻繁的寫操作。
如果以上三種情況沒有滿足,不需要部署sharding,只會(huì)增加復(fù)制度,同時(shí)在設(shè)計(jì)數(shù)據(jù)模型時(shí),也要考慮到以后作分片的情況。
Data Quantity Requirements
Sharding只會(huì)在數(shù)據(jù)量比較大的情況下才會(huì)發(fā)揮作用,默認(rèn)的chunk大小是64MB,只有在滿足特定條件下,balancer進(jìn)程才會(huì)將數(shù)據(jù)遷移到其他shard上,否則數(shù)據(jù)會(huì)一直存儲(chǔ)到單個(gè)shard上。
Broadcast Operations and Targeted Operations
通常情況下,分片集群處理客戶端的請(qǐng)求有以下另種方式:
將操作請(qǐng)求廣播到整個(gè)集群中所有包含集合中的文檔的shard上。
基于shard key將操作請(qǐng)求定位到單個(gè)shard或一組shard
參考文檔:
http://docs.mongodb.org/manual/sharding/
網(wǎng)站欄目:MongoDBSharding學(xué)習(xí)理論篇
網(wǎng)頁網(wǎng)址:http://www.chinadenli.net/article16/jcogdg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制開發(fā)、網(wǎng)站設(shè)計(jì)公司、網(wǎng)站收錄、虛擬主機(jī)、靜態(tài)網(wǎng)站、小程序開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)