簡介
所謂分片,指的就是把數據拆分,將其分散到不一樣機器上的過程。MongoDB支持自動
分片,對應用而言,好像始終和一個單機的服務器交互同樣。
分片和複製
複製是讓多臺服務器擁有相同的數據副本,而分片是每一個分片都擁有整個數據集的
一個子集,且相互是不一樣的數據,多個分片的數據合起來構成整個數據集。
Mongos
用來執行客戶端訪問集羣數據的路由,它維護着一個內容列表,記錄了每一個分片包
含的數據,應用程序只要鏈接上它,就跟操做單臺服務器同樣。
配置服務器
配置服務器就是普通的mongod服務器,保存整個集羣和分片的元數據:集羣中有哪
些分片,分片的是哪些集合,以及數據塊的分佈。它極其重要,必須啓用日誌功能。
在大型的集羣中,建議配置3臺配置服務器,就足夠用了。啓動配置服務器的方式:
1:先建立幾個存放數據的文件夾,好比在前面的dbs下面建立confdb文件夾,而後在confdb下
面建立confdb1,confdb2,confdb3文件夾;
同理在前面的logs下面建立conflogs文件夾數據庫
2:而後分別啓動這三個配置服務器,使用—configsvr指明是配置服務器,以下:服務器
./mongod --configsvr --dbpath ../dbs/confdb/confdb1 --logpath ../logs/conflog/conflog1 --fork --port 30001 ./mongod --configsvr --dbpath ../dbs/confdb/confdb2 --logpath ../logs/conflog/conflog2 --fork --port 30002 ./mongod --configsvr --dbpath ../dbs/confdb/confdb3 --logpath ../logs/conflog/conflog3 --fork --port 30003
3:--configsvr默認的端口爲27019,默認的數據目錄爲/data/configdb,能夠使用--dbpath
和--port本身定義。
4:注意不要使用--replSet選項,配置服務器不是副本集成員。Mongos會向全部的3臺配置服
務器發送寫請求,並確保3臺服務器擁有相同的數據。日誌
啓動mongos進程
1:code
./mongos --configdb localhost:30001,localhost:30002,localhost:30003 --logpath ../logs/conflog/mongoslog --fork
2:能夠啓動任意多個mongos,一般是一個應用服務器使用一個mongos,也就是說mongos一般
與應用服務器運行在一個機器上
3:mongos的默認端口是27017,能夠用chunkSize來指定塊的大小,默認是200M索引
將副本集轉換成爲分片
1:若是沒有副本集,按照前面講的建立並初始化一個;若是有一個副本集,就打開相應的服
務器,把副本集運行起來進程
2:先鏈接到mongos use admin 也就是切換到使用admin的數據庫路由
./mongo localhost:27017 use admin
3:而後鏈接到mongos,把副本集轉換成爲分片,示例以下:io
sh.addShard("myrepl/127.0.0.1:20001,127.0.0.1:20002");
不用把全部副本集的成員都寫出來,mongos會自動檢查整個副本集。副本集的名稱
myrepl就用做了分片的名稱。
4:使用sh.status();察看狀態,會發現整個副本集裏面的服務都加入進來了。
5:注意:添加分片事後,客戶端應該鏈接mongos進行操做,而不是鏈接副本集了。
6:也能夠建立單mongod服務器的分片,但不建議在生產環境中使用
7:至此一個分片就建立好了,而後能夠重複步驟,建立一個新的副本集,加入到分片中來集羣
數據分片
須要明確指定分片的數據庫和集合,MongoDB纔會對數據進行自動分片。
1:對數據庫啓用分片配置
sh.enableSharding(「數據庫名」);
2:而後指定分片的集合,還有分片的鍵,若是對已經存在的集合進行分片,那麼指定的這個
分片鍵上必須有索引;若是集合不存在,mongos會自動在分片鍵上建立索引。例如:
sh.shardCollection("rep1.users",{"userId":1});