時(shí)間:2024-03-26 14:41作者:下載吧人氣:25
前言
分片(sharding)是MongoDB將大型集合分割到不同服務(wù)器(或者說(shuō)集群)上所采用的方法,主要為應(yīng)對(duì)高吞吐量與大數(shù)據(jù)量的應(yīng)用場(chǎng)景提供了方法。
將數(shù)據(jù)分散到不同的機(jī)器上,不需要功能強(qiáng)大的服務(wù)器就可以存儲(chǔ)更多的數(shù)據(jù)和處理更大的負(fù)載。基本思想就是將集合切成小塊,這些塊分散到若干片里,每個(gè)片只負(fù)責(zé)總數(shù)據(jù)的一部分,最后通過(guò)一個(gè)均衡器來(lái)對(duì)各個(gè)分片進(jìn)行均衡(數(shù)據(jù)遷移)。通過(guò)一個(gè)名為mongos的路由進(jìn)程進(jìn)行操作,mongos知道數(shù)據(jù)和片的對(duì)應(yīng)關(guān)系(通過(guò)配置服務(wù)器)。大部分使用場(chǎng)景都是解決磁盤(pán)空間的問(wèn)題,對(duì)于寫(xiě)入有可能會(huì)變差(+++里面的說(shuō)明+++),查詢(xún)則盡量避免跨分片查詢(xún)。
使用分片的時(shí)機(jī):
1,機(jī)器的磁盤(pán)不夠用了。使用分片解決磁盤(pán)空間的問(wèn)題。
2,單個(gè)mongod已經(jīng)不能滿(mǎn)足寫(xiě)數(shù)據(jù)的性能要求。通過(guò)分片讓寫(xiě)壓力分散到各個(gè)分片上面,使用分片服務(wù)器自身的資源。
3,想把大量數(shù)據(jù)放到內(nèi)存里提高性能。和上面一樣,通過(guò)分片使用分片服務(wù)器自身的資源。
和既有的分庫(kù)分表、分區(qū)方案相比,MongoDB的最大區(qū)別在于它幾乎能自動(dòng)完成所有事情,只要告訴MongoDB要分配數(shù)據(jù),它就能自動(dòng)維護(hù)數(shù)據(jù)在不同服務(wù)器之間的均衡。
一. 分片的集群組件
1.Mongos 【路由】
作為請(qǐng)求的訪問(wèn)入口,所有的請(qǐng)求都由mongos來(lái)路由、分發(fā)、合并,這些動(dòng)作對(duì)客戶(hù)端driver透明,用戶(hù)連接mongos就像連接mongod一樣使用。Mongos會(huì)根據(jù)請(qǐng)求類(lèi)型及shard key將請(qǐng)求路由到對(duì)應(yīng)的Shard。
2.Config Server 【配置服務(wù)器】
存儲(chǔ)Sharding Cluster 的所有元數(shù)據(jù),所有的元數(shù)據(jù)都存儲(chǔ)在config數(shù)據(jù)庫(kù);
*保存每個(gè)分片上的chunk的信息 * 保存chunk上的片鍵范圍。
3. Shard 【分片】
存儲(chǔ)應(yīng)用數(shù)據(jù)記錄。
二. 分片優(yōu)勢(shì)
1.對(duì)集群進(jìn)行抽象,讓集群“不可見(jiàn)”,分片對(duì)應(yīng)用系統(tǒng)是透明的。
Mongos是專(zhuān)有路由進(jìn)程,其會(huì)將客戶(hù)端發(fā)來(lái)的請(qǐng)求準(zhǔn)確無(wú)誤的路由到集群中的一個(gè)或者一組服務(wù)器上,同時(shí)會(huì)把接收到的響應(yīng)拼裝起來(lái)發(fā)回到客戶(hù)端。
2.保證集群總是可讀寫(xiě)
將MongoDB的分片和復(fù)制集功能結(jié)合使用,在確保數(shù)據(jù)分片到多臺(tái)服務(wù)器的同時(shí),也確保了每分?jǐn)?shù)據(jù)都有相應(yīng)的備份,可以確保有服務(wù)器壞掉時(shí),其他的從庫(kù)可以立即接替壞掉的部分繼續(xù)工作。提高了集群的可用性和可靠性。
3.使集群易于擴(kuò)展
當(dāng)系統(tǒng)需要更多的空間和資源的時(shí)候,MongoDB使我們可以按需方便的擴(kuò)充系統(tǒng)容量。
三. 分片部署注意事項(xiàng)(常見(jiàn)錯(cuò)誤)
1.配置可復(fù)制集作為分片節(jié)點(diǎn)與配置單獨(dú)使用的可復(fù)制集基本一樣。但啟動(dòng)參數(shù)中需指定—shardsvr參數(shù)。
否則,在啟動(dòng)數(shù)據(jù)庫(kù)分片時(shí)報(bào)錯(cuò): {"code" : 193,"ok" : 0, "errmsg" : "Cannot accept sharding commands if not started with --shardsvr“}
。
2.創(chuàng)建配置服務(wù)器集群時(shí),不能設(shè)置見(jiàn)證節(jié)點(diǎn)。
否則,報(bào)錯(cuò) “errmsg” : "Arbiters are not allowed in replica set configurations being used for config servers"
。
3.配置Mongos 實(shí)例時(shí),請(qǐng)不要配置dbpath參數(shù)。
否則,設(shè)置dbpath參數(shù),服務(wù)無(wú)法正常啟動(dòng),報(bào)錯(cuò):Error parsing INI config file: unrecognised option 'dbpath'
。
4.配置Mongos 實(shí)例時(shí),需設(shè)置Keyfile。
否則,不設(shè)置Keyfile,Service無(wú)法正常啟動(dòng), 報(bào)錯(cuò):2018-05-10T15:30:26.791+0800 W SHARDING [mongosMain] Error initializing sharding state, sleeping for 2 seconds and trying again :: caused by :: Unauthorized: Error loading clusterID :: caused by :: not authorized on config to execute command { find: “version”, readConcern: { level: “majority”, afterOpTime: { ts: Timestamp 1525937413000|2, t: 1 } }, maxTimeMS: 30000
5.分片集合設(shè)置。
分片不會(huì)默認(rèn)生成,需要先在數(shù)據(jù)庫(kù)中啟動(dòng)分片(sh.enableSharding(“DBName”)
),然后再設(shè)置集合分片(sh.shardCollection(“Collection”{片鍵})
)
四. 分片管理的注意事項(xiàng)(常用命令)
1.檢查shards 配置及狀態(tài)
db.runCommand({listshards:1})
網(wǎng)友評(píng)論