分片是一種在多臺(tái)機(jī)器上存儲(chǔ)數(shù)據(jù)記錄的操作,它是 MongoDB 為應(yīng)對(duì)數(shù)據(jù)增長(zhǎng)需求而采取的辦法。當(dāng)數(shù)據(jù)量增長(zhǎng)時(shí),單臺(tái)機(jī)器有可能無(wú)法存儲(chǔ)數(shù)據(jù)或可接受的讀取寫(xiě)入吞吐量。通過(guò)橫向擴(kuò)展,分片技術(shù)解決了這個(gè)問(wèn)題。利用分片技術(shù),我們可以添加更多的機(jī)器來(lái)應(yīng)對(duì)數(shù)據(jù)量增加以及讀寫(xiě)操作的要求。
為何要分片
- 將所有的寫(xiě)入操作復(fù)制到主節(jié)點(diǎn)
- 對(duì)延遲敏感的查詢將在主節(jié)點(diǎn)上完成
- 單個(gè)副本集的節(jié)點(diǎn)數(shù)限制為 12 個(gè)
- 當(dāng)活躍數(shù)據(jù)集過(guò)大時(shí),內(nèi)存有可能不夠
- 本地磁盤(pán)空間不足
- 縱向擴(kuò)展太過(guò)昂貴
MongoDB 中的分片
下圖展示了 MongoDB 使用分片集群的情形:
http://wiki.jikexueyuan.com/project/mongodb/images/sharding.png" alt="sharding" />
在上圖中,有三個(gè)組件值得說(shuō)明:
- 分片 分片用來(lái)存儲(chǔ)數(shù)據(jù)。它們提供了高可用性與數(shù)據(jù)一致性。在生產(chǎn)環(huán)境中,每個(gè)分片都是一個(gè)獨(dú)立的副本集。
- 配置服務(wù)器 配置服務(wù)器(Config server)保存著集群的元數(shù)據(jù)。該數(shù)據(jù)含有集群數(shù)據(jù)集到分片的映射關(guān)系。查詢路由使用該元數(shù)據(jù)來(lái)定位特定分片的操作。在生產(chǎn)環(huán)境中,分片集群具有 3 個(gè)配置服務(wù)器。
- 查詢路由 查詢路由(Query Router)基本上就是 mongos 實(shí)例,是客戶端的接口,直接操作適當(dāng)?shù)姆制?。查詢路由定位并處理?duì)分片的操作,并將結(jié)果返回至客戶端。分片集群可能含有多個(gè)查詢路由,以便分散客戶端請(qǐng)求負(fù)載。一個(gè)客戶端請(qǐng)求對(duì)應(yīng)著一個(gè)查詢路由。通常一個(gè)分片集群可能有很多查詢路由。