這是一種將海量的資料水平擴充套件的資料庫集群系統,資料分表儲存在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請參考我的另一篇文章
config server
為了將乙個特定的collection儲存在多個shard中,需要為該collection指定乙個shard key,例如 ,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
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 --啟動routeserver例項
mongos啟動引數中,chunksize這一項是用來指定chunk的大小的,單位是mb,預設大小為200mb,為了方便測試sharding效果,我們把chunksize指定為 1mb。意思是當這個分片中插入的資料大於1m時開始進行資料轉移
步驟四:
配置sharding
接下來,我們使用mongodb shell登入到mongos,新增shard節點
[root@localhost~]# /opt/mongo/bin/mongo admin --port 40000 --此操作需要連線admin庫
mongodbshell version: 2.0.1
connectingto: 127.0.0.1:40000/admin
>db.runcommand() --新增 shard server
>db.runcommand()
>db.runcommand() --設定分片儲存的資料庫
> db.runcommand(}) --設定分片的集合名稱。且必須指定shard key,系統會自動建立索引
注意這裡我們要注意片鍵的選擇,選擇片鍵時需要根據具體業務的資料形態來選擇,切不可隨意選擇,實際中尤其不要輕易選擇自增_id作為片鍵,除非你很清楚你這麼做的目的,具體原因我不在此分析,根據經驗推薦一種較合理的片鍵方式,「自增字段+查詢字段」,沒錯,片鍵可以是多個欄位的組合。
另外這裡說明一點,分片的基本機制:分片總是試圖將現有資料均分到所有的分片上。舉例說,現在有兩個分片,我已經選擇了id作為片鍵,假定插入的id是自增的,如1——10000,則分片後的結果是均分,即1——5000在片a,5000——10000在片b,當然,不一定有這麼精確,但卻是保證盡量的平均的,以此類推,如果有三塊分片,同樣均分三等分。
還需要說明的是,一開始插入資料時,資料是只插入到其中一塊分片上的,插入完畢後,mongodb內部開始在各片之間進行資料的移動,這個過程可能不是立即的,mongodb足夠智慧型會根據當前負載決定是立即進行移動還是稍後移動。
在插入資料後,立馬執行db.users.stats();兩次可以驗證如上所說。
ok,簡單的分片就是這麼搭建的,連線上mongos,然後開始插入資料進行驗證吧。
mongodb分片搭建
搭建configserver 由於configserver的重要性,強烈推薦由至少3臺機器組成configserver副本集 解壓並建立配置檔案,並複製到3臺機器上 配置檔案中增加 配置檔案 sharding clusterrole configsvr 啟動所有例項,並登入其中一台機器,執行mong...
MongoDB分片集群搭建
1.搭建環境 os centos7 version 4.2.8 主機規劃 sharding role host port replica set mongos mongos 37017 shard1 host1 host2 host3 27117 shard1 shard2 host1 host2 ...
mongodb 集群搭建 分片 副本集
mkdir p home mongodb conf mkdir p home mongodb mongos log mkdir p home mongodb config data mkdir p home mongodb config log mkdir p home mongodb shard1...