標籤:blog http io os 使用 ar strong for 資料
搭建mongodb分區
http://gong1208.iteye.com/blog/1622078
Sharding分區概念
這是一種將海量的資料水平擴充的資料庫叢集系統,資料分表格儲存體在sharding的各個節點上,使用者通過簡單的配置就可以很方便地構建一個分布式MongoDB叢集。
MongoDB 的資料分塊稱為 chunk。每個 chunk 都是 Collection 中一段連續的資料記錄,通常最大尺寸是 200MB,超出則產生新的資料區塊。
要構建一個 MongoDB Sharding Cluster,需要三種角色:
Shard Server
即儲存實際資料的分區,每個Shard可以是一個mongod執行個體,也可以是一組mongod執行個體構成的Replica Set。為了實現每個Shard內部的auto-failover,MongoDB官方建議每個Shard為一組Replica Set。關於如何安裝及搭建replica set請參考我的另一篇文章 http://gong1208.iteye.com/blog/1558355
Config Server
為了將一個特定的collection儲存在多個shard中,需要為該collection指定一個shard key,例如{age: 1} ,shard key可以決定該條記錄屬於哪個chunk。Config Servers就是用來儲存:所有shard節點的配置資訊、每個chunk的shard key範圍、chunk在各shard的分布情況、該叢集中所有DB和collection的sharding配置資訊。
Route Process
這是一個前端路由,用戶端由此接入,然後詢問Config Servers需要到哪個Shard上查詢或儲存記錄,再串連相應的Shard進行操作,最後將結果返回給用戶端。用戶端只需要將原本發給mongod的查詢或更新要求原封不動地發給Routing Process,而不必關心所操作的記錄儲存在哪個Shard上。
下面我們在同一台物理機器上構建一個簡單的 Sharding Cluster:
架構圖如下:
- Shard Server 1:27017
- Shard Server 2:27018
- Config Server :27027
- Route Process:40000
實施步驟
步驟一:
啟動Shard Server
mkdir -p /opt/mongodb/data/shard/s0 --建立資料目錄
mkdir -p /opt/mongodb/data/shard/s1
mkdir -p /opt/mongodb/data/shard/log --建立日誌目錄
/Opt/mongodb/bin/mongod --port 27017 --dbpath /opt/mongodb/data/shard/s0 --fork --logpath /opt/mongodb/data/shard/log/s0.log --啟動Shard Server執行個體1
/Opt/mongodb/bin/mongod --port 27018 --dbpath /opt/mongodb/data/shard/s1 --fork --logpath /opt/mongodb/data/shard/log/s1.log --啟動Shard Server執行個體2
步驟二:
啟動Config Server
mkdir -p /opt/mongodb/data/shard/config --建立資料目錄
/Opt/mongodb/bin/mongod --port 27027 –dbpath /opt/mongodb/data/shard/config --fork --logpath /opt/mongodb/data/shard/log/config.log --啟動Config Server執行個體
(注意,這裡我們完全可以像啟動普通mongodb服務一樣啟動,不需要添加—shardsvr和configsvr參數。因為這兩個參數的作用就是改變啟動連接埠的,所以我們自行指定了連接埠就可以)
步驟三:
啟動Route Process
/Opt/mongodb/bin/mongos --port 40000 --configdb localhost:27027 --fork --logpath
/opt/mongodb/data/shard/log/route.log --chunkSize 1 --啟動Route Server執行個體
mongos啟動參數中,chunkSize這一項是用來指定chunk的大小的,單位是MB,預設大小為200MB,為了方便測試Sharding效果,我們把chunkSize指定為 1MB。意思是當這個分區中插入的資料大於1M時開始進行資料轉移
步驟四:
配置Sharding
接下來,我們使用MongoDB Shell登入到mongos,添加Shard節點
[[email protected] ~]# /Opt/mongo/bin/mongo admin --port 40000 --此操作需要串連admin庫
MongoDB shell version: 2.0.1
connecting to: 127.0.0.1:40000/admin
> db.runCommand({ addshard:"localhost:27017" }) --添加 Shard Server
{ "shardAdded" : "shard0000", "ok" : 1 }
> db.runCommand({ addshard:"localhost:27018" })
{ "shardAdded" : "shard0001", "ok" : 1 }
> db.runCommand({ enablesharding:"test" }) --設定分區儲存的資料庫
{ "ok" : 1 }
> db.runCommand({ shardcollection: "test.users", key: { id:1 }}) --設定分區的集合名稱。且必須指定Shard Key,系統會自動建立索引
{ "collectionsharded" : "test.users", "ok" : 1 }
注意這裡我們要注意片鍵的選擇,選擇片鍵時需要根據具體業務的資料形態來選擇,切不可隨意選擇,實際中尤其不要輕易選擇自增_id作為片鍵,除非你很清楚你這麼做的目的,具體原因我不在此分析,根據經驗推薦一種較合理的片鍵方式,“自增欄位+查詢欄位”,沒錯,片鍵可以是多個欄位的組合。
另外這裡說明一點,分區的基本機制:分區總是試圖將現有資料均分到所有的分區上。舉例說,現在有兩個分區,我已經選擇了id作為片鍵,假定插入的id是自增的,如1——10000,則分區後的結果是均分,即1——5000在片A,5000——10000在片B,當然,不一定有這麼精確,但卻是保證盡量的平均的,以此類推,如果有三塊分區,同樣均分三等分。
還需要說明的是,一開始插入資料時,資料是只插入到其中一塊分區上的,插入完畢後,mongodb內部開始在各片之間進行資料的移動,這個過程可能不是立即的,mongodb足夠智能會根據當前負載決定是立即進行移動還是稍後移動。
在插入資料後,立馬執行db.users.stats();兩次可以驗證如上所說。
Ok,簡單的分區就是這麼搭建的,串連上mongos,然後開始插入資料進行驗證吧。
搭建mongodb分區