首先了解大致瞭解mongodb複製集和分片的做用,簡單來講複製集是保證數據的安全性,分片提升了數據庫的併發性。(隨便提一下對於數據安全性這裏,mongodb是經過複製集實現的,固然也能夠經過計算機的硬件來實現好比有的公司硬盤採用磁盤陣列冗餘存儲,沒見過這東東是啥)mongodb
mongodb安裝目錄下新建data目錄用於存放數據數據庫
data下對應五個文件夾,分別對應配置父親,mongos服務器以及三個分片服務器,因爲每一個分片又是經過複製集來實現的,全部每一個shard下面又有三臺mongod實例。gulp
 安全
因爲在配置過程當中會有大量重複的命令,全部我經過腳本形式來啓動。bash
因爲複製集是分片的基礎,先說複製集服務器
shard1.sh併發
/usr/local/mongodb/bin/mongod --dbpath=/usr/local/mongodb/data/shard1/db1/db --logpath=/usr/local/mongodb/data/shard1/db1/log.log --logappend --fork --port 2000 --replSet=shard1app
/usr/local/mongodb/bin/mongod --dbpath=/usr/local/mongodb/data/shard1/db2/db --logpath=/usr/local/mongodb/data/shard1/db2/log.log --logappend --fork --port 2001 --replSet=shard1性能
/usr/local/mongodb/bin/mongod --dbpath=/usr/local/mongodb/data/shard1/db3/db --logpath=/usr/local/mongodb/data/shard1/db3/log.log --logappend --fork --port 2002 --replSet=shard1測試
其實就是啓動一個mongodb實例,—replSet=shard1,是要建立的複製集的標誌。
執行後並無造成一個複製集,仍是須要初始化。
登錄任意一個mongod實例,/usr/local/mongodb/bin/mongod 127.0.0.1:2000/admin
執行rs.status(),會有相應的報錯提示,大致意思是複製集尚未初始化,請先初始化
那輸入配置config = {_id: 「shard1」,members: [_{id: 0, host: 「127.0.0.1:2000」},{_id: 1, host: 「127.0.0.1:2001」},{_id:2, host: 「127.0.0.1:2002」}]}
而後執行rs.initiate(config);
OK,第一個複製集就建立好了。其餘三個複製集相似,須要注意的是每一個分片的複製集的名字。爲了好記,我是用shard1 shard2 shard3,另外端口我也是每一個shard分別用2001 2001 2002,3000 3001 3002,4000 401 4002
配置服務器
首先啓動配置服務器
/usr/local/mongodb/bin/mongod --dbpath=/usr/local/mongodb/data/conf/db --logpath=/usr/local/mongodb/data/conf/log.log --logappend --fork -port 5000 –configsvr
而後相似複製集同樣須要分片配置的初始化
/usr/local/mongodb/bin/mongod 127.0.0.1:5000/admin
經過命令 db.runCommand({addshard: 「replicaSetName/[serverhost[: port], …]」}),添加複製集分片
db.runCommand({addshard: 「shard1/127.0.0.1:2000,127.0.0.1:2001,127.0.0.1:2002」})
db.runCommand({addshard: 「shard2/127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002」})
db.runCommand({addshard: 「shard3/127.0.0.1:4000,127.0.0.1:4001,127.0.0.1:4002」})
分片添加成功,查看 db.runCommand({listshards:1});
或是 show dbs
use conf
db.conf.find();
mongos服務器
啓動服務器 /usr/local/mongodb/bin/mongos –port 5001 –configdb 127.0.0.1:5000
鏈接 /usr/local/mongodb/bin/mongo 127.0.0.1:5001/admin
使分片生效 db.runCommand({enablesharding: 「sand」}),指定數據庫
db.runCommand({shardcollection: 「sand.decision」, key: {order: 1}}); 指定要分片的collection以及片鍵,由於並非須要全部的collection都不要分片,分片的片鍵也不同。
至此,分片工做以及完成
鏈接mongos,如上
use sand
for(var i=1;i<100000000;i++){db.decision.save({name: 「decision」+i, order: i});}
千萬級仍是要等老久了。。。
db.decision.count()
而後分別鏈接每一個複製集的任意一個mongod的實例,執行db.decision.count()查看
複製集的secondary級別的默認是不容許操的,能夠經過命令rs.status0k(),使之臨時能夠操做,此時會發現每一個分片上都有數據且不一樣,但同一個分片上不一樣的mongod上數據是同樣的。
 
本身目前能夠經過gulp實現簡單的自動化部署,因爲對gulp沒有深刻研究,一致在想能不能經過gulp實現所有的自動化呢?
公司沒有這樣的需求,只是本身平時玩玩,對穩定性,性能上都沒有什麼經驗,若是有寫過這方便的親們給發個連接。