1计螺、什么是復(fù)制集
? ? 介紹
? ? 一個復(fù)制集里至少包含一個主節(jié)點(diǎn)。如下圖中瞧壮,三個節(jié)點(diǎn)登馒,寫操作只能從主節(jié)點(diǎn)操作。主節(jié)點(diǎn)收到數(shù)據(jù)操作時咆槽,會將操作記錄在操作日志里陈轿。所有的從節(jié)點(diǎn)都會在數(shù)據(jù)同步的過程中,從主節(jié)點(diǎn)讀取操作日志罗晕,從而保證從節(jié)點(diǎn)和主節(jié)點(diǎn)的數(shù)據(jù)統(tǒng)一济欢。操作日志的相關(guān)設(shè)置參見:https://docs.mongodb.com/manual/core/replica-set-oplog/
????選舉機(jī)制
????????當(dāng)主節(jié)點(diǎn)發(fā)生故障時,復(fù)制集會通過選舉協(xié)議(https://docs.mongodb.com/manual/core/replica-set-elections/)選舉產(chǎn)生一個新的主節(jié)點(diǎn)小渊。在選舉的過程中法褥,因?yàn)闆]有主節(jié)點(diǎn),其他的節(jié)點(diǎn)只能讀數(shù)據(jù)酬屉,數(shù)據(jù)庫是不接受寫操作的半等。
? ? 帶仲裁節(jié)點(diǎn)復(fù)制集
有時候?yàn)榱吮WC復(fù)制集的可用性揍愁,專門設(shè)置一個仲裁節(jié)點(diǎn)。這個節(jié)點(diǎn)的主要作用是決定其他節(jié)點(diǎn)是主節(jié)點(diǎn)還是從節(jié)點(diǎn)杀饵,這個節(jié)點(diǎn)不存儲數(shù)據(jù)莽囤。當(dāng)主節(jié)點(diǎn)掛掉后,仲裁節(jié)點(diǎn)將從其他從節(jié)點(diǎn)中選出一個主節(jié)點(diǎn)切距,集合新加入節(jié)點(diǎn)后朽缎,由仲裁節(jié)點(diǎn)決定是主節(jié)點(diǎn)還是從節(jié)點(diǎn)。
2谜悟、免認(rèn)證方式啟動三個服務(wù)
????啟動服務(wù)1:
mongod -f ./mongod.conf? ??
????mongod.conf:
systemLog:
? destination: file
? path: /usr/local/var/log/mongodb/mongo.log
? logAppend: true
storage:
? dbPath: /usr/local/var/mongodb
net:
? bindIp: 127.0.0.1
? port: 27017
processManagement:
? fork: true
replication:
? replSetName: fyh
????啟動服務(wù)2:
mongod -f ./mongod1.conf? ?
????mongod1.conf:?
systemLog:
? destination: file
? path: /usr/local/var/log/mongodb/mongo1.log
? logAppend: true
storage:
? dbPath: /usr/local/var/mongodb1
net:
? bindIp: 127.0.0.1
? port: 27017
processManagement:
? fork: true
replication:
? replSetName: fyh
????啟動服務(wù)3:
mongod -f ./mongod2.conf? ?
????mongod2.conf?:
systemLog:
? destination: file
? path: /usr/local/var/log/mongodb/mongo2.log
? logAppend: true
storage:
? dbPath: /usr/local/var/mongodb2
net:
? bindIp: 127.0.0.1
? port: 27017
processManagement:
? fork: true
replication:
? replSetName: fyh
注意:配置中的路徑需要提前創(chuàng)建话肖,否則啟動失敗
3、啟動復(fù)制集
? ? 1)連接其中一個客戶端
mongo localhost:27017
? ? 2)配置復(fù)制集
https://docs.mongodb.com/manual/reference/replica-configuration/
config_fyh = {_id:"fyh", members: [{_id: 0, host:"localhost:27017"},{_id: 1, host: "localhost:27018"},{_id: 2, host: "localhost:27019", arbiterOnly: true}]}
其中?arbiterOnly: true 是將節(jié)點(diǎn)設(shè)置成仲裁節(jié)點(diǎn)
? ? 3)啟動復(fù)制集
>rs.initiate(config_fyh)
{ "ok" : 1 }
? ? 4)查看狀態(tài)
>rs.status()
? ? 5)創(chuàng)建用戶密碼
>use admin
>db.createUser({user: "admin", pwd: "admin", roles: [{role:"userAdminAnyDatabase", db: "admin"}]})
>use process
>db.createUser({user: "process", pwd: "process", roles: [{role:"readWrite", db: "process"}]})
? ? 6)以安全模式啟動:
上邊的配置中添加安全配置如下:
security:
? keyFile: /usr/local/etc/mongodbConf/key
? authorization: enabled
其中key是三個進(jìn)程間通信使用的加密秘鑰
echo "password" >?/usr/local/etc/mongodbConf/key
注意:這個密鑰文件不能有群組或者其他人訪問的權(quán)限葡幸,否則服務(wù)獎無法啟動最筒,需要改變其權(quán)限
chmod 400?/usr/local/etc/mongodbConf/key
? ? 7)連接復(fù)制集
mongo localhost:27017/process -u process -p process
4、復(fù)制集自動故障轉(zhuǎn)移
? ? 1)查看mongod進(jìn)程
ps aux |grep mongod
????2)殺死主進(jìn)程
kill 19780
????3)連接數(shù)據(jù)庫蔚叨,查看復(fù)制集狀態(tài)
mongo localhost:27018
>rs.status()
可以看到原來的主節(jié)點(diǎn)進(jìn)程(27017端口)掛了床蜘,原來的從節(jié)點(diǎn)變成了主節(jié)點(diǎn)。
? ? 4)重啟殺死的進(jìn)程并查看復(fù)制集狀態(tài)
mongod -f ./mongod.conf
>rs.status()
從結(jié)果可以看出27017端口的進(jìn)程變成了從節(jié)點(diǎn)蔑水。