搭建mongodb分片
搭建mongodb分片
?http://gong1208.iteye.com/blog/1622078
Sharding分片概念
這是一種將海量的數(shù)據(jù)水平擴展的數(shù)據(jù)庫集群系統(tǒng),數(shù)據(jù)分表存儲在sharding的各個節(jié)點上,使用者通過簡單的配置就可以很方便地構(gòu)建一個分布式MongoDB集群。
MongoDB?的數(shù)據(jù)分塊稱為?chunk。每個?chunk?都是?Collection?中一段連續(xù)的數(shù)據(jù)記錄,通常最大尺寸是?200MB,超出則生成新的數(shù)據(jù)塊。
要構(gòu)建一個?MongoDB Sharding Cluster,需要三種角色:
Shard Server
即存儲實際數(shù)據(jù)的分片,每個Shard可以是一個mongod實例,也可以是一組mongod實例構(gòu)成的Replica Set。為了實現(xiàn)每個Shard內(nèi)部的auto-failover,MongoDB官方建議每個Shard為一組Replica Set。關(guān)于如何安裝及搭建replica set請參考我的另一篇文章?http://gong1208.iteye.com/blog/1558355
?
Config Server
為了將一個特定的collection存儲在多個shard中,需要為該collection指定一個shard key,例如{age: 1}?,shard key可以決定該條記錄屬于哪個chunk。Config Servers就是用來存儲:所有shard節(jié)點的配置信息、每個chunk的shard key范圍、chunk在各shard的分布情況、該集群中所有DB和collection的sharding配置信息。
?
Route Process
這是一個前端路由,客戶端由此接入,然后詢問Config Servers需要到哪個Shard上查詢或保存記錄,再連接相應(yīng)的Shard進行操作,最后將結(jié)果返回給客戶端。客戶端只需要將原本發(fā)給mongod的查詢或更新請求原封不動地發(fā)給Routing Process,而不必關(guān)心所操作的記錄存儲在哪個Shard上。
下面我們在同一臺物理機器上構(gòu)建一個簡單的?Sharding Cluster:
架構(gòu)圖如下:
?
?
?
?
- ? ? ? Shard Server 1:27017
- ? ? ? Shard Server 2:27018
- ? ? ? Config Server?:27027
- ? ? ? Route Process:40000
?
?
實施步驟
步驟一:
啟動Shard Server
mkdir -p /opt/mongodb/data/shard/s0 --創(chuàng)建數(shù)據(jù)目錄
mkdir -p /opt/mongodb/data/shard/s1
mkdir -p /opt/mongodb/data/shard/log --創(chuàng)建日志目錄
?
/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 --創(chuàng)建數(shù)據(jù)目錄
/Opt/mongodb/bin/mongod --port 27027 –dbpath /opt/mongodb/data/shard/config --fork???????? --logpath /opt/mongodb/data/shard/log/config.log --啟動Config Server實例
(注意,這里我們完全可以像啟動普通mongodb服務(wù)一樣啟動,不需要添加—shardsvr和configsvr參數(shù)。因為這兩個參數(shù)的作用就是改變啟動端口的,所以我們自行指定了端口就可以)
?
步驟三:
啟動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啟動參數(shù)中,chunkSize這一項是用來指定chunk的大小的,單位是MB,默認大小為200MB,為了方便測試Sharding效果,我們把chunkSize指定為?1MB。意思是當(dāng)這個分片中插入的數(shù)據(jù)大于1M時開始進行數(shù)據(jù)轉(zhuǎn)移
?
步驟四:
?配置Sharding
接下來,我們使用MongoDB Shell登錄到mongos,添加Shard節(jié)點
[root@localhost ~]# /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" }) --設(shè)置分片存儲的數(shù)據(jù)庫
{ "ok" : 1 }
> db.runCommand({ shardcollection: "test.users", key: { id:1 }}) --設(shè)置分片的集合名稱。且必須指定Shard Key,系統(tǒng)會自動創(chuàng)建索引
{ "collectionsharded" : "test.users", "ok" : 1 }
?
注意這里我們要注意片鍵的選擇,選擇片鍵時需要根據(jù)具體業(yè)務(wù)的數(shù)據(jù)形態(tài)來選擇,切不可隨意選擇,實際中尤其不要輕易選擇自增_id作為片鍵,除非你很清楚你這么做的目的,具體原因我不在此分析,根據(jù)經(jīng)驗推薦一種較合理的片鍵方式,“自增字段+查詢字段”,沒錯,片鍵可以是多個字段的組合。
另外這里說明一點,分片的基本機制:分片總是試圖將現(xiàn)有數(shù)據(jù)均分到所有的分片上。舉例說,現(xiàn)在有兩個分片,我已經(jīng)選擇了id作為片鍵,假定插入的id是自增的,如1——10000,則分片后的結(jié)果是均分,即1——5000在片A,5000——10000在片B,當(dāng)然,不一定有這么精確,但卻是保證盡量的平均的,以此類推,如果有三塊分片,同樣均分三等分。
?????????還需要說明的是,一開始插入數(shù)據(jù)時,數(shù)據(jù)是只插入到其中一塊分片上的,插入完畢后,mongodb內(nèi)部開始在各片之間進行數(shù)據(jù)的移動,這個過程可能不是立即的,mongodb足夠智能會根據(jù)當(dāng)前負載決定是立即進行移動還是稍后移動。
在插入數(shù)據(jù)后,立馬執(zhí)行db.users.stats();兩次可以驗證如上所說。
?
Ok,簡單的分片就是這么搭建的,連接上mongos,然后開始插入數(shù)據(jù)進行驗證吧。?
轉(zhuǎn)載于:https://www.cnblogs.com/DjangoBlog/p/3993341.html
總結(jié)
以上是生活随笔為你收集整理的搭建mongodb分片的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: T-SQL编程基础-基本语法
- 下一篇: 20个开源项目托管站点推荐