副本集實現了網站的安全備份和故障的無縫轉移,但是並不能實現數據的大容量存儲,畢竟物理硬件是有極限的,這個時候就需要做分布式部署,把數據保存到其他機器上。Mongodb的分片技術就很完美的實現了這個需求。
理解Mongodb的分片技術即Sharding架構
什么是Sharding?說白了就是把海量數據水平擴展的集群系統,數據分表存儲在Sharding的各個節點上。
Mongodb的數據分開分為chunk,每個chunk都是collection中的一段連續的數據記錄,一般為200MB,超出則生成新的數據塊。
構建Sharding需要三種角色,
shard服務器(Shard Server):Shard服務器是存儲實際數據的分片,每個Shard可以是一個mongod實例,也可以是一組mongod實例構成的Replica Sets,為了實現每個Shard內部的故障自動切換,MongoDB官方建議每個Shard為一組Replica Sets。
配置服務器(Config Server):為了將一個特定的collection存儲在多個Shard中,需要為該collection指定一個Shard key,決定該條記錄屬於那個chunk,配置服務器可以存儲以下信息:
1,所有Shard節點的配置信息
2,每個chunk的Shard key范圍
3,chunk在各Shard的分布情況
4,集群中所有DB和collection的Shard配置信息
路由進程(Route Process):一個前端路由,客戶端由此接入,首先詢問配置服務器需要到那個Shard上查詢或保存記錄,然后連接相應Shard執行操作,最后將結果返回客戶端。客戶端只需 將原本發給mongod的查詢活更新請求原封不動的發給路由器進程,而不必關心所操作的記錄存儲在那個Shard上。
構建Sharding
由上面分析可得出,構建一個Sharding至少需要4個mongodb進程,兩個Shard Server(做分片),一個Config Server,一個Route Process,然后安排如下
進程 端口 文件目錄
Shard Server1 2000 mongodb5
Shard Server2 2001 mongodb6
Config Server 30000 mongodb7
Route Process 40000 mongodb8
現在開始配置:
1,啟動Shard Server


這里啟動只多了一個命令:shardsvr,用這個命令就表示這個進程是Shard進程。
2,啟動Config Server
啟動Config Server用的是configsvr命令

3,啟動Route Process

這里設置chunk大小為1M,方便測試分片效果
4,配置Sharding
所有進程都啟動好以后,剩余的就是把他們串成串兒了
新開個cmd,然后連接到路由器進程中,使用addshard添加到路由器中

通過上面兩次操作,整個架構已經串成了一串,但是,別着急,架構還不知道分片的數據庫和片鍵呢

指定分片的數據庫是Friends,然后指定按照表FriendUserAttach中的_id分片。
至此整個系統配置完畢。
驗證分片情況,我是用程序插入的數據,因為表是我實際所用的表,在cmd里插入就太麻煩了,這里我用客戶端驅動插入10000條數據

用use命令切換到Friends數據庫,然后stats查看當前狀態
字段說明:sharded為true,說明此表是經過分片處理的
shards部分有兩個Shard Server分別是:"shard0000" 和 "shard0001"。"shard0000"的字段count為1016,表明此Shard Server上分布的數據量是1016條,size表示此Shard Server上分布的數據庫大小,單位為b。
