在Mongodb裡面存在另一種叢集,就是分片技術,可以滿足MongoDB資料量大量增長的需求。
當MongoDB存儲海量的資料時,一台機器可能不足以存儲資料,也可能不足以提供可接受的讀寫吞吐量。這時,我們就可以通過在多台機器上分割資料,使得資料庫系統能存儲和處理更多的資料。
複制所有的寫入操作到主節點
延遲的敏感資料會在主節點查詢
單個副本集限制在12個節點
當請求量巨大時會出現記憶體不足。
本地磁盤不足
垂直擴充價格昂貴
下圖展示了在MongoDB中使用分片叢集結構分布:

上圖中主要有如下所述三個主要元件:
Shard:
用于存儲實際的資料塊,實際生産環境中一個shard server角色可由幾台機器組個一個replica set承擔,防止主機單點故障
Config Server:
mongod執行個體,存儲了整個 ClusterMetadata,其中包括 chunk資訊。
Query Routers:
前端路由,用戶端由此接入,且讓整個叢集看上去像單一資料庫,前端應用可以透明使用。
192.168.1.100 : mongos
192.168.1.110 : config server
192.168.1.101 : Shard1
192.168.1.102 : Shard2
以上四個主機上都以安裝mongodb資料庫。
一.配置config server
編輯配置檔案mongod.conf:
<code>vim </code><code>/etc/mongod</code><code>.conf</code>
添加如下并啟用config server服務:
<code>configsvr=</code><code>true</code>
重新啟動mongodb服務:
<code>service mongod restart</code>
注:預設監聽27019端口。也可以使用如下指令啟動mongod程序。
<code># mongod --configsvr --dbpath <path> --port <port></code>
此時,預設端口由27017變為27019:
<a href="https://s2.51cto.com/wyfs02/M00/8F/26/wKioL1jU5xDSUa-9AABB4cvrN-8860.jpg-wh_500x0-wm_3-wmp_4-s_1114483490.jpg" target="_blank"></a>
二.配置mongos執行個體
安裝mongos:
<code>yum </code><code>install</code> <code>mongodb-org-mongos-2.6.1-1.x86_64.rpm</code>
啟動mongos:
<code>mongos --configdb=192.168.1.110 --fork --logpath=</code><code>/var/log/mongodb/mongos</code><code>.log</code>
注:mongos屬于輕量級應用,完全可以與其它服務運作于同一節點;啟動時,需要為mongos執行個體指明各config伺服器的通路位址;
預設情況下,mongos監聽于27017端口;可以使用如下指令啟動mongos執行個體。
<code># mongos --configdb <config server hostnames((IP|Hostname):Port)></code>
也可以直接編輯配置檔案:
1、注釋dbpath指令;
2、添加configdb指令,并指定config伺服器的位址;
而後使用如下指令啟動mongos執行個體:
<code># mongos -f /etc/mongod.conf</code>
登入mongos并配置shard節點:
<code>mongo --host 192.168.1.100</code>
<code>mongos> sh.addShard(</code><code>"192.168.1.101"</code><code>)</code>
<code>{ </code><code>"shardAdded"</code> <code>: </code><code>"shard0000"</code><code>, </code><code>"ok"</code> <code>: 1 }</code>
<code>mongos> sh.addShard(</code><code>"192.168.1.102"</code><code>)</code>
<code>{ </code><code>"shardAdded"</code> <code>: </code><code>"shard0001"</code><code>, </code><code>"ok"</code> <code>: 1 }</code>
檢視shard狀态:
<code>mongos> sh.status()</code>
<code>--- Sharding Status --- </code>
<code> </code><code>sharding version: {</code>
<code>"_id"</code> <code>: 1,</code>
<code>"version"</code> <code>: 4,</code>
<code>"minCompatibleVersion"</code> <code>: 4,</code>
<code>"currentVersion"</code> <code>: 5,</code>
<code>"clusterId"</code> <code>: ObjectId(</code><code>"58d4bd8a102ad4bdad74aa1d"</code><code>)</code>
<code>}</code>
<code> </code><code>shards:</code>
<code>{ </code><code>"_id"</code> <code>: </code><code>"shard0000"</code><code>, </code><code>"host"</code> <code>: </code><code>"192.168.1.101:27017"</code> <code>}</code>
<code>{ </code><code>"_id"</code> <code>: </code><code>"shard0001"</code><code>, </code><code>"host"</code> <code>: </code><code>"192.168.1.102:27017"</code> <code>}</code>
<code> </code><code>databases:</code>
<code>{ </code><code>"_id"</code> <code>: </code><code>"admin"</code><code>, </code><code>"partitioned"</code> <code>: </code><code>false</code><code>, </code><code>"primary"</code> <code>: </code><code>"config"</code> <code>}</code>
啟動sharding功能:
<code>mongos> sh.enableSharding(</code><code>"testdb"</code><code>);</code>
<code>{ </code><code>"ok"</code> <code>: 1 }</code>
注:mongodb的shard功能實作于collection級别,但若要在collection上啟動shard,還需要事先其相關的資料庫上啟用之。在資料庫上啟用shard功能後,MongoDB會為其指定一個主shard。
啟用過程需要mongos執行個體上實作,可以使用sh.enableSharding()方法,也可以使用db.runCommand()的“enableSharding指令,它們的使用格式分别如下所示:
<code>sh.enableSharding(</code><code>"<database>"</code><code>)</code>
<code>db.runCommand( { enableSharding: <database> } )</code>
此時,再次檢視shard狀态為:
<code>{ </code><code>"_id"</code> <code>: </code><code>"testdb"</code><code>, </code><code>"partitioned"</code> <code>: </code><code>true</code><code>, </code><code>"primary"</code> <code>: </code><code>"shard0000"</code> <code>}</code>
測試:
在collection上進行sharding:
<code>mongos> sh.shardCollection(</code><code>"testdb.student"</code><code>,{</code><code>"age"</code><code>:1})</code>
<code>{ </code><code>"collectionsharded"</code> <code>: </code><code>"testdb.student"</code><code>, </code><code>"ok"</code> <code>: 1 }</code>
插入資料:
<code>mongos> </code><code>for</code> <code>(i=1;i<=100000;i++) db.student.insert({name:</code><code>"student"</code><code>+i,age:(i%120),classes:</code><code>"class+(i%10)"</code><code>});</code>
<code>WriteResult({ </code><code>"nInserted"</code> <code>: 1 })</code>
此時我們再次檢視sharding狀态如下:
<a href="https://s2.51cto.com/wyfs02/M00/8F/28/wKiom1jU7KLzU_tMAAEpDByx8Kk967.jpg-wh_500x0-wm_3-wmp_4-s_1262078485.jpg" target="_blank"></a>
本文轉自 SoulMio 51CTO部落格,原文連結:http://blog.51cto.com/bovin/1910120,如需轉載請自行聯系原作者