《Mongodb集群搭建》要點(diǎn):
本文介紹了Mongodb集群搭建,希望對(duì)您有用。如果有疑問(wèn),可以聯(lián)系我們。
相關(guān)主題:非關(guān)系型數(shù)據(jù)庫(kù)
《Mongodb集群搭建》是否對(duì)您有啟發(fā),歡迎查看更多與《Mongodb集群搭建》相關(guān)教程,學(xué)精學(xué)透。維易PHP學(xué)院為您提供精彩教程。
MongoDB是時(shí)下流行的NoSql數(shù)據(jù)庫(kù),它的存儲(chǔ)方式是文檔式存儲(chǔ),并不是Key-Value形式.關(guān)于mongodb的特點(diǎn),這里就不多介紹了,大家可以去看看官方說(shuō)明:http://docs.mongodb.org/manual/
今天主要來(lái)說(shuō)說(shuō)Mongodb的三種集群方式的搭建:Replica Set / Sharding / Master-Slaver.這里只說(shuō)明最簡(jiǎn)單的集群搭建方式(生產(chǎn)環(huán)境),如果有多個(gè)節(jié)點(diǎn)可以此類推或者查看官方文檔.OS是Ubuntu_x64系統(tǒng),客戶端用的是Java客戶端.Mongodb版本是mongodb-Linux-x86_64-2.2.2.tgz
Replica Set
中文翻譯叫做副本集,不過(guò)我并不喜歡把英文翻譯成中文,總是感覺(jué)怪怪的.其實(shí)簡(jiǎn)單來(lái)說(shuō)就是集群當(dāng)中包含了多份數(shù)據(jù),保證主節(jié)點(diǎn)掛掉了,備節(jié)點(diǎn)能繼續(xù)提供數(shù)據(jù)服務(wù),提供的前提就是數(shù)據(jù)需要和主節(jié)點(diǎn)一致.如下圖:
Mongodb(M)表示主節(jié)點(diǎn),Mongodb(S)表示備節(jié)點(diǎn),Mongodb(A)表示仲裁節(jié)點(diǎn).主備節(jié)點(diǎn)存儲(chǔ)數(shù)據(jù),仲裁節(jié)點(diǎn)不存儲(chǔ)數(shù)據(jù).客戶端同時(shí)連接主節(jié)點(diǎn)與備節(jié)點(diǎn),不連接仲裁節(jié)點(diǎn).
默認(rèn)設(shè)置下,主節(jié)點(diǎn)提供所有增刪查改服務(wù),備節(jié)點(diǎn)不提供任何服務(wù).但是可以通過(guò)設(shè)置使備節(jié)點(diǎn)提供查詢服務(wù),這樣就可以減少主節(jié)點(diǎn)的壓力,當(dāng)客戶端進(jìn)行數(shù)據(jù)查詢時(shí),哀求自動(dòng)轉(zhuǎn)到備節(jié)點(diǎn)上.這個(gè)設(shè)置叫做Read Preference Modes,同時(shí)Java客戶端提供了簡(jiǎn)單的配置方式,可以不必直接對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作.
仲裁節(jié)點(diǎn)是一種特殊的節(jié)點(diǎn),它本身并不存儲(chǔ)數(shù)據(jù),主要的作用是決定哪一個(gè)備節(jié)點(diǎn)在主節(jié)點(diǎn)掛掉之后提升為主節(jié)點(diǎn),所以客戶端不需要連接此節(jié)點(diǎn).這里雖然只有一個(gè)備節(jié)點(diǎn),但是仍然需要一個(gè)仲裁節(jié)點(diǎn)來(lái)提升備節(jié)點(diǎn)級(jí)別.我開(kāi)始也不相信必須要有仲裁節(jié)點(diǎn),但是自己也試過(guò)沒(méi)仲裁節(jié)點(diǎn)的話,主節(jié)點(diǎn)掛了備節(jié)點(diǎn)還是備節(jié)點(diǎn),所以咱們還是需要它的.
介紹完了集群方案,那么現(xiàn)在就開(kāi)始搭建了.
1.建立數(shù)據(jù)文件夾
一般情況下不會(huì)把數(shù)據(jù)目錄建立在mongodb的解壓目錄下,不過(guò)這里方便起見(jiàn),就建在mongodb解壓目錄下吧.
mkdir -p /mongodb/data/master
mkdir -p /mongodb/data/slaver
mkdir -p /mongodb/data/arbiter
#三個(gè)目錄分別對(duì)應(yīng)主,備,仲裁節(jié)點(diǎn)
2.建立配置文件
由于配置比較多,所以我們將配置寫(xiě)到文件里.
#master.conf
dbpath=/mongodb/data/master
logpath=/mongodb/log/master.log
pidfilepath=/mongodb/master.pid
directoryperdb=true
logappend=true
replSet=testrs
bind_ip=10.10.148.130
port=27017
oplogSize=10000
fork=true
noprealloc=true
#slaver.conf
dbpath=/mongodb/data/slaver
logpath=/mongodb/log/slaver.log
pidfilepath=/mongodb/slaver.pid
directoryperdb=true
logappend=true
replSet=testrs
bind_ip=10.10.148.131
port=27017
oplogSize=10000
fork=true
noprealloc=true
#arbiter.conf
dbpath=/mongodb/data/arbiter
logpath=/mongodb/log/arbiter.log
pidfilepath=/mongodb/arbiter.pid
directoryperdb=true
logappend=true
replSet=testrs
bind_ip=10.10.148.132
port=27017
oplogSize=10000
fork=true
noprealloc=true
參數(shù)解釋:
dbpath:數(shù)據(jù)存放目錄
logpath:日志存放路徑
pidfilepath:進(jìn)程文件,方便停止mongodb
directoryperdb:為每一個(gè)數(shù)據(jù)庫(kù)依照數(shù)據(jù)庫(kù)名建立文件夾存放
logappend:以追加的方式記錄日志
replSet:replica set的名字
bind_ip:mongodb所綁定的ip地址
port:mongodb進(jìn)程所使用的端口號(hào),默認(rèn)為27017
oplogSize:mongodb操作日志文件的最大大小.單位為Mb,默認(rèn)為硬盤(pán)剩余空間的5%
fork:以后臺(tái)方式運(yùn)行進(jìn)程
noprealloc:不預(yù)先分配存儲(chǔ)
3.啟動(dòng)mongodb
進(jìn)入每個(gè)mongodb節(jié)點(diǎn)的bin目錄下
[java] view plain copy
./monood -f master.conf
./mongod -f slaver.conf
./mongod -f arbiter.conf
注意配置文件的路徑一定要保證正確,可以是相對(duì)路徑也可以是絕對(duì)路徑.
4.配置主,備,仲裁節(jié)點(diǎn)
可以通過(guò)客戶端連接mongodb,也可以直接在三個(gè)節(jié)點(diǎn)中選擇一個(gè)連接mongodb.
./mongo 10.10.148.130:27017 #ip和port是某個(gè)節(jié)點(diǎn)的地址
>use admin
>cfg={ _id:"testrs", members:[ {_id:0,host:'10.10.148.130:27017',priority:2}, {_id:1,host:'10.10.148.131:27017',priority:1},
{_id:2,host:'10.10.148.132:27017',arbiterOnly:true}] };
>rs.initiate(cfg) #使配置生效
cfg是可以任意的名字,當(dāng)然最好不要是mongodb的關(guān)鍵字,conf,config都可以.最外層的_id表示replica set的名字,members里包含的是所有節(jié)點(diǎn)的地址以及優(yōu)先級(jí).優(yōu)先級(jí)最高的即成為主節(jié)點(diǎn),即這里的10.10.148.130:27017.特別注意的是,對(duì)于仲裁節(jié)點(diǎn),需要有個(gè)特別的配置——arbiterOnly:true.這個(gè)千萬(wàn)不能少了,不然主備模式就不能生效.
配置的生效時(shí)間根據(jù)不同的機(jī)器配置會(huì)有長(zhǎng)有短,配置不錯(cuò)的話基本上十幾秒內(nèi)就能生效,有的配置需要一兩分鐘.如果生效了,執(zhí)行rs.status()命令會(huì)看到如下信息:
{
"set" : "testrs",
"date" : ISODate("2013-01-05T02:44:43Z"),
"myState" : 1,
"members" : [
{
"_id" : 0,
"name" : "10.10.148.130:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 200,
"optime" : Timestamp(1357285565000, 1),
"optimeDate" : ISODate("2013-01-04T07:46:05Z"),
"self" : true
},
{
"_id" : 1,
"name" : "10.10.148.131:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 200,
"optime" : Timestamp(1357285565000, 1),
"optimeDate" : ISODate("2013-01-04T07:46:05Z"),
"lastHeartbeat" : ISODate("2013-01-05T02:44:42Z"),
"pingMs" : 0
},
{
"_id" : 2,
"name" : "10.10.148.132:27017",
"health" : 1,
"state" : 7,
"stateStr" : "ARBITER",
"uptime" : 200,
"lastHeartbeat" : ISODate("2013-01-05T02:44:42Z"),
"pingMs" : 0
}
],
"ok" : 1
}
如果配置正在生效,其中會(huì)包含如下信息:
"stateStr" : "RECOVERING"
同時(shí)可以查看對(duì)應(yīng)節(jié)點(diǎn)的日志,發(fā)現(xiàn)正在等待別的節(jié)點(diǎn)生效或者正在分配數(shù)據(jù)文件.
現(xiàn)在基本上已經(jīng)完成了集群的所有搭建工作.至于測(cè)試工作,可以留給大家自己試試.一個(gè)是往主節(jié)點(diǎn)插入數(shù)據(jù),能從備節(jié)點(diǎn)查到之前插入的數(shù)據(jù)(查詢備節(jié)點(diǎn)可能會(huì)遇到某個(gè)問(wèn)題,可以自己去網(wǎng)上查查看).二是停掉主節(jié)點(diǎn),備節(jié)點(diǎn)能變成主節(jié)點(diǎn)提供服務(wù).三是恢復(fù)主節(jié)點(diǎn),備節(jié)點(diǎn)也能恢復(fù)其備的角色,而不是繼續(xù)充當(dāng)主的角色.二和三都可以通過(guò)rs.status()命令實(shí)時(shí)查看集群的變化.
Sharding
和Replica Set類似,都需要一個(gè)仲裁節(jié)點(diǎn),但是Sharding還需要配置節(jié)點(diǎn)和路由節(jié)點(diǎn).就三種集群搭建方式來(lái)說(shuō),這種是最復(fù)雜的.部署圖如下:
1.啟動(dòng)數(shù)據(jù)節(jié)點(diǎn)
./mongod --fork --dbpath ../data/set1/ --logpath ../log/set1.log --replSet test #192.168.4.43
./mongod --fork --dbpath ../data/set2/ --logpath ../log/set2.log --replSet test #192.168.4.44
./mongod --fork --dbpath ../data/set3/ --logpath ../log/set3.log --replSet test #192.168.4.45 決策 不存儲(chǔ)數(shù)據(jù)
2.啟動(dòng)配置節(jié)點(diǎn)
./mongod --configsvr --dbpath ../config/set1/ --port 20001 --fork --logpath ../log/conf1.log #192.168.4.30
./mongod --configsvr --dbpath ../config/set2/ --port 20002 --fork --logpath ../log/conf2.log #192.168.4.31
3.啟動(dòng)路由節(jié)點(diǎn)
./mongos --configdb 192.168.4.30:20001,192.168.4.31:20002 --port 27017 --fork --logpath ../log/root.log #192.168.4.29
這里我們沒(méi)有用配置文件的方式啟動(dòng),其中的參數(shù)意義大家應(yīng)該都明白.一般來(lái)說(shuō)一個(gè)數(shù)據(jù)節(jié)點(diǎn)對(duì)應(yīng)一個(gè)配置節(jié)點(diǎn),仲裁節(jié)點(diǎn)則不需要對(duì)應(yīng)的配置節(jié)點(diǎn).注意在啟動(dòng)路由節(jié)點(diǎn)時(shí),要將配置節(jié)點(diǎn)地址寫(xiě)入到啟動(dòng)命令里.
4.配置Replica Set
這里可能會(huì)有點(diǎn)奇怪為什么Sharding會(huì)需要配置Replica Set.其實(shí)想想也能明白,多個(gè)節(jié)點(diǎn)的數(shù)據(jù)肯定是相關(guān)聯(lián)的,如果不配一個(gè)Replica Set,怎么標(biāo)識(shí)是同一個(gè)集群的呢.這也是人家mongodb的規(guī)定,咱們還是遵守吧.配置方式和之前所說(shuō)的一樣,定一個(gè)cfg,然后初始化配置.
./mongo 192.168.4.43:27017 #ip和port是某個(gè)節(jié)點(diǎn)的地址
>use admin
>cfg={ _id:"testrs", members:[ {_id:0,host:'192.168.4.43:27017',priority:2}, {_id:1,host:'192.168.4.44:27017',priority:1},
{_id:2,host:'192.168.4.45:27017',arbiterOnly:true}] };
>rs.initiate(cfg) #使配置生效
5.配置Sharding
./mongo 192.168.4.29:27017 #這里必須連接路由節(jié)點(diǎn)
>sh.addShard("test/192.168.4.43:27017") #test表示replica set的名字 當(dāng)把主節(jié)點(diǎn)添加到shard以后,會(huì)自動(dòng)找到set里的主,備,決策節(jié)點(diǎn)
>db.runCommand({enableSharding:"diameter_test"}) #diameter_test is database name
>db.runCommand( { shardCollection: "diameter_test.dcca_dccr_test",key:{"__avpSessionId":1}})
第一個(gè)命令很容易理解,第二個(gè)命令是對(duì)需要進(jìn)行Sharding的數(shù)據(jù)庫(kù)進(jìn)行配置,第三個(gè)命令是對(duì)需要進(jìn)行Sharding的Collection進(jìn)行配置,這里的dcca_dccr_test即為Collection的名字.另外還有個(gè)key,這個(gè)是比較關(guān)鍵的東西,對(duì)于查詢效率會(huì)有很大的影響,具體可以查看Shard Key Overview
到這里Sharding也已經(jīng)搭建完成了,以上只是最簡(jiǎn)單的搭建方式,其中某些配置仍然使用的是默認(rèn)配置.如果設(shè)置不當(dāng),會(huì)導(dǎo)致效率異常低下,所以建議大家多看看官方文檔再進(jìn)行默認(rèn)配置的修改.
Master-Slaver
這個(gè)是最簡(jiǎn)答的集群搭建,不過(guò)準(zhǔn)確說(shuō)也不能算是集群,只能說(shuō)是主備.并且官方已經(jīng)不推薦這種方式,所以在這里只是簡(jiǎn)單的介紹下吧,搭建方式也相對(duì)簡(jiǎn)單.
./mongod --master --dbpath /data/masterdb/ #主節(jié)點(diǎn)
./mongod --slave --source <masterip:masterport> --dbpath /data/slavedb/ 備節(jié)點(diǎn)
基本上只要在主節(jié)點(diǎn)和備節(jié)點(diǎn)上分別執(zhí)行這兩條命令,Master-Slaver就算搭建完成了.我沒(méi)有試過(guò)主節(jié)點(diǎn)掛掉后備節(jié)點(diǎn)是否能變成主節(jié)點(diǎn),不過(guò)既然已經(jīng)不推薦了,大家就沒(méi)必要去使用了.
以上三種集群搭建方式首選Replica Set,只有真的是大數(shù)據(jù),Sharding才能顯現(xiàn)威力,畢竟備節(jié)點(diǎn)同步數(shù)據(jù)是需要時(shí)間的.Sharding可以將多片數(shù)據(jù)集中到路由節(jié)點(diǎn)上進(jìn)行一些對(duì)比,然后將數(shù)據(jù)返回給客戶端,但是效率還是比較低的說(shuō).
我自己有測(cè)試過(guò),不過(guò)具體的機(jī)器配置已經(jīng)不記得了.Replica Set的ips在數(shù)據(jù)達(dá)到1400w條時(shí)基本能達(dá)到1000左右,而Sharding在300w時(shí)已經(jīng)下降到500ips了,兩者的單位數(shù)據(jù)大小大概是10kb.大家在應(yīng)用的時(shí)候還是多多做下性能測(cè)試,畢竟不像Redis有benchmark.
Mongodb現(xiàn)在用的還是比較多的,但是個(gè)人覺(jué)得配置太多了....我看官網(wǎng)都看了好多天,才把集群搭建的配置和注意要點(diǎn)弄明白.而且用過(guò)的人應(yīng)該知道m(xù)ongodb吃內(nèi)存的問(wèn)題,解決方法只能通過(guò)ulimit來(lái)控制內(nèi)存使用量,但是如果控制不好的話,mongodb會(huì)掛掉.
轉(zhuǎn)載請(qǐng)注明本頁(yè)網(wǎng)址:
http://www.snjht.com/jiaocheng/10213.html