一、在同一臺(tái)機(jī)器上配置副本集
1.環(huán)境準(zhǔn)備
mongo的安裝什么的就不再贅述了。
這里建議使用mongo3.2以上的版本,3.2以上版本的WiredTiger引擎,性能更好,數(shù)據(jù)壓縮更好,同樣數(shù)據(jù)的情況下,3.2占用的空間僅為3.0版本的1/3。
需要先給每一個(gè)副本集建立一個(gè)data目錄。
cd /data
mkdir db0?db1?db2
(需要sudo權(quán)限的在mkdir前加上sudo)
同樣,需要給log文件建立log日志文件夾。
cd /var/log
mkdir mongolog0 mongolog2 mongolog3
(同理,有需要?jiǎng)t在mkdir前加上sudo)
2.副本集啟動(dòng)配置
mongod --fork --dbpath /data/db0 --logpath /var/log/mongolog/mongodb0.log --replSet example --port 27017
mongod --fork --dbpath /data/db1 --logpath /var/log/mongolog/mongodb1.log --replSet example --port 27018
mongod --fork --dbpath /data/db2 --logpath /var/log/mongolog/mongodb2.log --replSet example --port 27019
參數(shù)介紹:
--fork:后臺(tái)運(yùn)行(要注意的是,用到了“--fork”參數(shù)就必須啟用“--logpath”參數(shù),這是強(qiáng)制性的)
--logpath:日志的保存路徑
--dbpath:數(shù)據(jù)庫(kù)保存路徑
--port:打開(kāi)的端口號(hào)
--replSet:打開(kāi)副本集,后面帶的是副本集的名字
3.副本集的初始化
啟動(dòng)mongo:mongo(默認(rèn)端口號(hào)為27017)
在mongo shell中輸入:
rsconf={"_id":"example","members": [{"_id":0,"host":"127.0.0.1:27017"}]}
初始化副本集:rs.initiate(rsconf)
此時(shí)會(huì)出現(xiàn):example:PRIMARY>
添加其他成員:rs.add("127.0.0.1:27018")
? ? ? ? ? ? ? ? ? ? ? rs.add("127.0.0.1:27019")
查看副本集情況:rs.conf()
修改priority(當(dāng)主節(jié)點(diǎn)掛掉時(shí),該節(jié)點(diǎn)稱(chēng)為主節(jié)點(diǎn)的優(yōu)先級(jí)):cfg=rs.conf()
cfg.members[2].priority =2
添加仲裁節(jié)點(diǎn):rs.addArb("127.0.0.1:40000")(仲裁節(jié)點(diǎn)不持有數(shù)據(jù),但需要目錄來(lái)保存一些配置信息)
仲裁節(jié)點(diǎn)的作用:
通過(guò)實(shí)際測(cè)試發(fā)現(xiàn),當(dāng)整個(gè)副本集集群中達(dá)到50%的節(jié)點(diǎn)(包括仲裁節(jié)點(diǎn))不可用的時(shí)候,剩下的節(jié)點(diǎn)只能成為secondary節(jié)點(diǎn),整個(gè)集群只能讀不能寫(xiě)。比如集群中有1個(gè)primary節(jié)點(diǎn),2個(gè)secondary節(jié)點(diǎn),加1個(gè)arbit節(jié)點(diǎn)時(shí):當(dāng)兩個(gè)secondary節(jié)點(diǎn)掛掉了,那么剩下的原來(lái)的primary節(jié)點(diǎn)也只能降級(jí)為secondary節(jié)點(diǎn);當(dāng)集群中有1個(gè)primary節(jié)點(diǎn),1個(gè)secondary節(jié)點(diǎn)和1個(gè)arbit節(jié)點(diǎn),這時(shí)即使primary節(jié)點(diǎn)掛了,剩下的secondary節(jié)點(diǎn)也會(huì)自動(dòng)成為primary節(jié)點(diǎn)。因?yàn)橹俨霉?jié)點(diǎn)不復(fù)制數(shù)據(jù),因此利用仲裁節(jié)點(diǎn)可以實(shí)現(xiàn)最少的機(jī)器開(kāi)銷(xiāo)達(dá)到兩個(gè)節(jié)點(diǎn)熱備的效果。
移除成員:rs.remove("127.0.0.1:40000")
對(duì)原主節(jié)點(diǎn)進(jìn)行降級(jí):rs.stepDown(15)
tip:初始化操作只需要在一臺(tái)上mongo進(jìn)行即可,另外兩臺(tái)只需要被加入到集群中,不需要初始化操作,
二、權(quán)限模式
這里注意,需要現(xiàn)在無(wú)權(quán)限的模式下先創(chuàng)建好賬號(hào)密碼。
創(chuàng)建root賬號(hào)語(yǔ)句:
use admin;
db.createUser({user:"admin", pwd:"admin", roles:[{role:"root", db:"admin"}]})
創(chuàng)建好初始root賬號(hào)后,重啟mongo,開(kāi)啟權(quán)限模式。
開(kāi)啟權(quán)限模式的副本集時(shí)需要在啟動(dòng)時(shí)帶上參數(shù) --keyFile /mongo/keyfile
后面為keyfile的路徑
keyfile文件必須滿(mǎn)足條件:
(1)至少6個(gè)字符,小于1024字節(jié)
(2)認(rèn)證時(shí)候不考慮文件中空白字符
(3)連接到副本集的成員和mongos進(jìn)成的keyfile文件內(nèi)容必須一樣
(4)必須是base64編碼,但是不能有等號(hào)
(5)文件權(quán)限必須是x00,也就是說(shuō),不能分配任何權(quán)限給group成員和other成員
keyfile文件的生成:
openssl rand -base64 100 > /mongo/keyfile
chmod 600 /mongo/keyfile
三、在不同服務(wù)器上配置副本集
rsconf={"_id":"example","members": [{"_id":0,"host":"127.0.0.1:27017"}]}中不能寫(xiě)成127.0.0.1或者localhost,否則會(huì)不知道哪一臺(tái)才是localhost。需要寫(xiě)成ip地址。