標籤:
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(自動分區)入門介紹