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