MongoDB Auto-Sharding(自動分區)入門介紹

來源:互聯網
上載者:User

標籤:

MongoDB是10gen團隊開發的一款面向文檔的NoSQL資料庫。最近一年多以來,MongoDB被越來越多的大型網站應用程式到生產環境中,比較著名的有Foursquare, bit.ly, SourceForge, Boxed等。MongoDB提供了Auto-Sharding功能,使用者通過簡單的配置就可以很方便地構建一個分布式MongoDB叢集。

MongoDB的Auto-Sharding能夠做到:

·       當各Sharding間負載和資料分布不平衡時,自動rebalancing

·       簡單方便的添加和刪除節點

·       自動容錯移轉(auto failover)

·       可擴充至上千台節點

 

一個MongoDB Sharding由三部分組成:

1. Shards

Shard即儲存實際資料的分區,每個Shard可以是一個mongod執行個體,也可以是一組mongod執行個體構成的Replica Set。為了實現每個Shard內部的auto-failover,MongoDB官方建議每個Shard為一組Replica Set。

2. Config Servers

為了將一個collection拆分為多個chunk,儲存在多個shard中,需要為該collection指定一個shard key. 例如{name: 1}, {_id: 1}, {lastname:1, firstname:1}等。shard key決定了該條記錄屬於哪個chunk,例如當1 < shard key < 100時為一個chunk,該chunk儲存在shard1上。而Config Servers就是用來儲存:所有shard節點的配置資訊;每個chunk的shard key範圍;chunk在各shard的分布;該叢集中所有DB和collection的sharding配置。

3. Routing Process

MongoDB的二進位包中有一個mongos程式,它是用來做為MongoDB叢集的Routing Process的。它相當於一個透明代理,接收來自用戶端的查詢或更新要求,然後詢問Config Servers需要到哪個Shard上查詢或儲存記錄,再串連相應的Shard進行操作,最後將結果返回給用戶端。用戶端只需要將原本發給mongod的查詢或更新要求原封不動地發給Routing Process,而不必關心所操作的記錄儲存在哪個Shard上。

 

接下來我就為大家介紹一下如何搭建一個簡單的MongoDB叢集用來測試MongoDB的Auto-Sharding功能。

這個MongoDB叢集將包含兩個Shards,一個Config Server和一個Routing Process。我們將使用MongoDB 1.6.5來做這個測試,為: http://www.mongodb.org/downloads

首先,我們為兩個Shards和一個Config Server建立資料目錄:

sudo mkdir -p /data0/mongo/shard1 /data0/mongo/shard2 /data0/mongo/config

然後,我們依次啟動兩個mongod進程作為Shard,一個mongod進程作為Config Server,一個mongos進程作為Routing Process:

sudo mongod --port 27017 --fork --logpath /var/log/mongo_shard1.log --dbpath /data0/mongo/shard1 --shardsvr

sudo mongod --port 27018 --fork --logpath /var/log/mongo_shard2.log --dbpath /data0/mongo/shard2 --shardsvr

sudo mongod --port 27217 --fork --logpath /var/log/mongo_config.log --dbpath /data0/mongo/config --configsvr

sudo mongos --port 27417 --fork --logpath /var/log/mongos.log --configdb 127.0.0.1:27217 --chunkSize 1

mongos啟動參數中,chunkSize這一項是用來指定chunk的大小的,單位是MB,預設大小為200MB,為了方便測試Sharding效果,我們把chunkSize指定為 1MB。

接下來,我們使用mongo shell登入到mongos,添加Shard節點:

mongo --port 27417

MongoDB shell version: 1.6.5

connecting to: 127.0.0.1:27417/test

> use admin;

switched to db admin

> db.runCommand({addshard:"127.0.0.1:27017"})

{ "shardAdded" : "shard0000", "ok" : 1 }

> db.runCommand({addshard:"127.0.0.1:27018"})

{ "shardAdded" : "shard0001", "ok" : 1 }

下面我們為DataBase "foo"啟用Sharding,並將其中的 Collection "col" 的 shard key設定為"{_id: 1}",用來測試Sharding功能:

> db.runCommand({enablesharding:‘foo‘});

{ "ok" : 1 }

> db.runCommand({shardcollection:"foo.col", key:{_id:1}});

{ "collectionsharded" : "foo.col", "ok" : 1 }

為了測試Sharding的balance效果,我陸續插入了大約200M的資料,插入過程中使用db.stats() 查詢資料分布情況。發現在資料量較小,30M以下時,所有trunk都儲存在了shard0000上,但繼續插入後,資料開始平均分布,並且mongos會對多個shard之間的資料進行rebalance 。在插入資料達到200M,剛插入結束時,shard0000上大約有135M資料,而shard0001上大約有65M資料,但過一段時間之後,shard0000上的資料量減少到了115M,shard0001上的資料量達到了85M。

 

MongoDB的Auto-Sharding功能自1.6版本開始才production-ready,至今不過半年多的時間,大多數公司仍在觀望中,不 敢將其用到生產環境,因此目前網上並沒有太多相關資料可以參考。今後我們會陸續為大家分享更多MongoDB使用過程中的經驗心得。

MongoDB Auto-Sharding(自動分區)入門介紹

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.