在生產環境下,部署一臺mongodb服務的話,會存在如下問題:mongodb
生產環境是一個發雜的環境,在這個過程當中會產生不少的問題,發生網絡故障,服務器宕機,機房停電等,若是是部署單機服務的話,均會致使服務不可用的問題數據庫
當咱們的業務 數據愈來愈多,這樣單臺服務器的硬盤大小已經沒法知足業務需求,硬盤容量不可能無限增大,這時候就須要部署多臺服務器,分佈式部署來應對緩存
全部的操做壓力都在這臺服務器上,致使服務器壓力變大,甚至服務死掉,沒法再提供服務,須要採用分而治之的策略安全
因爲一些特殊的緣由,可能致使服務器數據的損壞,因爲數據都是比較重要的數據,損壞之後沒法恢復是不能接受的,所謂狡兔三窟,這種數據咱們必定要有備份,只是採用何種備份策略的問題bash
爲了保證服務的高可用,應對數據量的快速增加,出現問題能快速的從錯誤中恢復,本文接下來就對如何搭建一個高可用的mongodb集羣一步一步的作一個詳細的說明服務器
1、Mongodb集羣中的角色說明網絡
對外提供服務,屏蔽後臺數據節點,是一個請求分發中心,咱們使用的時候只須要鏈接mongos便可,它會準確的路由到相應的分片上,mongos能夠部署多個。分佈式
存儲多有的數據庫配置,路由,分片信息,mongos自己沒有物理存儲分片服務器和數據路由信息,只緩存在內存中,配置服務器則能夠實際存儲這些數據。Mongos第一次啓動或者關掉重啓就會從config server 中加載配置信息,之後若是配置服務器信息變化,會通知到mongos更新本身的狀態,這樣mongos就能繼續準確的路由。測試
一臺機器能力是有天花板的,而且數據量比較大的時候全部的請求都會在一臺機器上,這樣壓力太大,1T的數據進行分紅4片,每片承擔250G,這樣壓力壓力就分散。spa
爲了達到高可用的的目的,數據節點一般都會有備份節點或者副本集(stand by),對於每片構建replicat set副本保證分片的可靠性。生產環境一般採用兩個副本加一個仲裁節點。
2、高可用集羣搭建
Mongos 3個,configure server 3個,數據分爲3片,數據分片中有兩個副本外加一個仲裁節點,也就是副本集中有9個實例,以上全部 3+3+3*3=15個實例。
因爲沒有那麼多物理機器,實際上也沒有必要這麼多物理機器來進行部署這些實例,若是把一些實例放到同一臺機器上,只須要端口不一樣便可。咱們使用三臺物理機,拓撲圖以下:
以上咱們有三臺機器,host 和ip分別是m1 192.168.1.140,m2 192.168.1.141,m2 192.168.1.142
實例及端口分配
Mongos 端口:27300
Configure server 端口:27017
Shard primary 端口:27018
Shard arbiter 端口:27019
Shard secondary 端口:27020
文件夾分配:
日誌地址:/var/log/mongodb/
配置地址:/etc/mongodb/conf/
數據地址:/var/lib/mongodb/db/
在以上文件夾中均創建 2701七、2701八、2701九、27020、27300文件夾,用於存儲各個實例的相關文件
以上文件夾須要在三臺服務器上均要建立。
一、下載mongodb 3.2.6 壓縮文件(能夠在mongodb官網直接下載),上傳到三臺服務器,均解壓到/usr/local/mongodb文件夾下
二、實例配置及啓動
每臺機器上均運行
/usr/local/mongodb/bin/mongod --configsvr --dbpath /var/lib/mongodb/db/27017/ --port 27017 --logpath /var/log/mongodb/27017/mongo.log --fork
三、啓動mongos
在每臺機器上運行
(要確保其餘機器上的端口打開可訪訪問,在測試環境能夠把防火牆關閉了(service iptables stop))
默認不是後臺運行,後臺運行須要以下方式
/usr/local/mongodb/bin/mongos --configdb 192.168.1.140:27017,192.168.1.141:27017,192.168.1.142:27017 --port 27300 --logpath /var/log/mongodb/27300/mongos.log --chunkSize 5 --fork
四、分片服務器啓動
每臺服務器有三個分片 (shard1 ,shard2 ,shard3)
#在服務器m1(192.168.1.40運行) /usr/local/mongodb/bin/mongod --shardsvr --replSet shard1 --port 27018 --dbpath /var/lib/mongodb/db/27018/ --logpath /var/log/mongodb/27018/shard1.log --fork --nojournal --oplogSize 10 /usr/local/mongodb/bin/mongod --shardsvr --replSet shard1 --port 27019 --dbpath /var/lib/mongodb/db/27019/ --logpath /var/log/mongodb/27019/shard1.log --fork --nojournal --oplogSize 10 /usr/local/mongodb/bin/mongod --shardsvr --replSet shard1 --port 27020 --dbpath /var/lib/mongodb/db/27020/ --logpath /var/log/mongodb/27020/shard1.log --fork --nojournal --oplogSize 10 #在服務器m1(192.168.1.41運行) /usr/local/mongodb/bin/mongod --shardsvr --replSet shard2 --port 27018 --dbpath /var/lib/mongodb/db/27018/ --logpath /var/log/mongodb/27018/shard1.log --fork --nojournal --oplogSize 10 /usr/local/mongodb/bin/mongod --shardsvr --replSet shard2 --port 27019 --dbpath /var/lib/mongodb/db/27019/ --logpath /var/log/mongodb/27019/shard1.log --fork --nojournal --oplogSize 10 /usr/local/mongodb/bin/mongod --shardsvr --replSet shard2 --port 27020 --dbpath /var/lib/mongodb/db/27020/ --logpath /var/log/mongodb/27020/shard1.log --fork --nojournal --oplogSize 10 #在服務器m1(192.168.1.42運行) /usr/local/mongodb/bin/mongod --shardsvr --replSet shard3 --port 27018 --dbpath /var/lib/mongodb/db/27018/ --logpath /var/log/mongodb/27018/shard1.log --fork --nojournal --oplogSize 10 /usr/local/mongodb/bin/mongod --shardsvr --replSet shard3 --port 27019 --dbpath /var/lib/mongodb/db/27019/ --logpath /var/log/mongodb/27019/shard1.log --fork --nojournal --oplogSize 10 /usr/local/mongodb/bin/mongod --shardsvr --replSet shard3 --port 27020 --dbpath /var/lib/mongodb/db/27020/ --logpath /var/log/mongodb/27020/shard1.log --fork --nojournal --oplogSize 10
至此,15個服務所有啓動完畢
五、配置副本集
設置shard1分片副本集(登陸192.168.1.140)
>/usr/local/mongodb/bin/mongo 127.0.0.1:27018 #使用admin數據庫 use admin #定義副本集配置 config = { _id:"shard1", members:[ {_id:0,host:"192.168.1.140:27018"}, {_id:1,host:"192.168.1.140:27019"}, {_id:2,host:"192.168.1.140:27020",arbiterOnly:true} ] } #初始化副本集配置 rs.initiate(config); //只在初始化的時候運行一次
設置shard2分片副本集(登陸192.168.1.141)
>/usr/local/mongodb/bin/mongo 127.0.0.1:27018 #使用admin數據庫 use admin #定義副本集配置 config = { _id:"shard2", members:[ {_id:0,host:"192.168.1.141:27018"}, {_id:1,host:"192.168.1.141:27019"}, {_id:2,host:"192.168.1.141:27020",arbiterOnly:true} ] } #初始化副本集配置 rs.initiate(config); //只在初始化的時候運行一次
設置shard3的副本集(登陸192.168.1.142)
>/usr/local/mongodb/bin/mongo 127.0.0.1:27018 #使用admin數據庫 use admin #定義副本集配置 config = { _id:"shard3", members:[ {_id:0,host:"192.168.1.142:27018"}, {_id:1,host:"192.168.1.142:27019"}, {_id:2,host:"192.168.1.142:27020",arbiterOnly:true} ] } #初始化副本集配置 rs.initiate(config); //只在初始化的時候運行一次
六、分片
目前搭建了mongodb配置服務器、路由服務器,各個分片服務器,不過應用程序鏈接到 mongos 路由服務器並不能使用分片機制,還須要在程序裏設置分片配置,讓分片生效。
進入任意一臺mongos ,我進入的是141環境的mongos
/usr/local/mongodb/bin/mongo 192.168.1.141:27300
進入之後,運行如下命令
db.runCommand( { addshard : "shard1/192.168.1.140:27018,192.168.1.140:27019,192.168.1.140:27020"}); db.runCommand( { addshard : "shard2/192.168.1.141:27018,192.168.1.141:27019,192.168.1.141:27020"}); db.runCommand( { addshard : "shard3/192.168.1.142:27018,192.168.1.142:27019,192.168.1.142:27020"});
這樣就分配好了三個片,能夠經過如下方式進行查看
mongos> db.runCommand( { listshards : 1 } ); { "shards" : [ { "_id" : "shard1", "host" : "shard1/192.168.1.140:27018,192.168.1.140:27019" }, { "_id" : "shard2", "host" : "shard2/192.168.1.141:27018,192.168.1.141:27019" }, { "_id" : "shard3", "host" : "shard3/192.168.1.142:27018,192.168.1.142:27019" } ], "ok" : 1 }
七、指定分片數據庫和集合片鍵
目前配置服務、路由服務、分片服務、副本集服務都已經串聯起來了,咱們指望在實際中指定須要分片的數據庫以及數據庫的集合採用何種片鍵來進行自動分配
#指定testdb分片生效 db.runCommand( { enablesharding :"clusterDB"}); #指定數據庫裏須要分片的集合和片鍵 db.runCommand( { shardcollection : "clusterDB.testcol",key : {id: 1} } )
八、測試
咱們設置clusterDB的 testcol集合須要分片,根據 id 自動分片到 shard1 ,shard2,shard3 上面去。要這樣設置是由於不是全部mongodb 的數據庫和表 都須要分片!
for (var i = 1; i <= 10000; i++)db. testcol .save({id:i,"testkey":"testval"});
#插入完成之後,能夠運行如下命令,看看具體的分片信息 db.table1.stats();
至此,一個高可用的mongodb集羣就搭建起來了,文章比較長,有些也比較囉嗦,看到這個地方,感謝你的耐心,不過我相信你只要你跟着上面一步一步來作的話,本身也能搭建起來了一個強大的mongodb集羣。
不過………… 這個集羣裏面仍是缺了一個重要的步驟的,那就是認證,如今若是咱們的集羣是放在外網環境上的,那麼任何人都能訪問到咱們的數據,接下來這篇文章《 mongodb 高可用集羣搭建-認證 》,咱們嘗試把這個集羣更改成帶安全校驗的。若是須要的話,請盡情點擊。