1、什么是復制集
? ? 介紹
? ? 一個復制集里至少包含一個主節(jié)點。如下圖中,三個節(jié)點,寫操作只能從主節(jié)點操作。主節(jié)點收到數(shù)據(jù)操作時,會將操作記錄在操作日志里。所有的從節(jié)點都會在數(shù)據(jù)同步的過程中,從主節(jié)點讀取操作日志,從而保證從節(jié)點和主節(jié)點的數(shù)據(jù)統(tǒng)一。操作日志的相關(guān)設置參見:https://docs.mongodb.com/manual/core/replica-set-oplog/
????選舉機制
????????當主節(jié)點發(fā)生故障時,復制集會通過選舉協(xié)議(https://docs.mongodb.com/manual/core/replica-set-elections/)選舉產(chǎn)生一個新的主節(jié)點。在選舉的過程中,因為沒有主節(jié)點,其他的節(jié)點只能讀數(shù)據(jù),數(shù)據(jù)庫是不接受寫操作的。

? ? 帶仲裁節(jié)點復制集
有時候為了保證復制集的可用性,專門設置一個仲裁節(jié)點。這個節(jié)點的主要作用是決定其他節(jié)點是主節(jié)點還是從節(jié)點,這個節(jié)點不存儲數(shù)據(jù)。當主節(jié)點掛掉后,仲裁節(jié)點將從其他從節(jié)點中選出一個主節(jié)點,集合新加入節(jié)點后,由仲裁節(jié)點決定是主節(jié)點還是從節(jié)點。

2、免認證方式啟動三個服務
????啟動服務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
????啟動服務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
????啟動服務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、啟動復制集
? ? 1)連接其中一個客戶端
mongo localhost:27017
? ? 2)配置復制集
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é)點設置成仲裁節(jié)點

? ? 3)啟動復制集
>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是三個進程間通信使用的加密秘鑰
echo "password" >?/usr/local/etc/mongodbConf/key
注意:這個密鑰文件不能有群組或者其他人訪問的權(quán)限,否則服務獎無法啟動,需要改變其權(quán)限
chmod 400?/usr/local/etc/mongodbConf/key
? ? 7)連接復制集
mongo localhost:27017/process -u process -p process
4、復制集自動故障轉(zhuǎn)移
? ? 1)查看mongod進程
ps aux |grep mongod

????2)殺死主進程
kill 19780
????3)連接數(shù)據(jù)庫,查看復制集狀態(tài)
mongo localhost:27018
>rs.status()
可以看到原來的主節(jié)點進程(27017端口)掛了,原來的從節(jié)點變成了主節(jié)點。
? ? 4)重啟殺死的進程并查看復制集狀態(tài)
mongod -f ./mongod.conf
>rs.status()
從結(jié)果可以看出27017端口的進程變成了從節(jié)點。