天天看點

Mongodb分片(Sharding)功能實作MongoDB 分片概述

在Mongodb裡面存在另一種叢集,就是分片技術,可以滿足MongoDB資料量大量增長的需求。

當MongoDB存儲海量的資料時,一台機器可能不足以存儲資料,也可能不足以提供可接受的讀寫吞吐量。這時,我們就可以通過在多台機器上分割資料,使得資料庫系統能存儲和處理更多的資料。

複制所有的寫入操作到主節點

延遲的敏感資料會在主節點查詢

單個副本集限制在12個節點

當請求量巨大時會出現記憶體不足。

本地磁盤不足

垂直擴充價格昂貴

下圖展示了在MongoDB中使用分片叢集結構分布:

Mongodb分片(Sharding)功能實作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 &lt;path&gt; --port &lt;port&gt;</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 &lt;config server hostnames((IP|Hostname):Port)&gt;</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&gt; 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&gt; 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&gt; 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&gt; 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>"&lt;database&gt;"</code><code>)</code>

<code>db.runCommand( { enableSharding: &lt;database&gt; } )</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&gt; 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&gt; </code><code>for</code> <code>(i=1;i&lt;=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,如需轉載請自行聯系原作者