【Mongodb】 可複製集搭建
阿新 • • 發佈:2020-06-22
# 可複製集 replica set
概念圖
![](https://img2020.cnblogs.com/blog/1445322/202006/1445322-20200621233253108-1930307098.png)
可複製集需要至少3個以上的mongodb節點,其中有一個主節點promary,其餘的為副本節點secondary
可複製集有三個角色:
* 主要成員(Primary):主要接收所有寫操作。就是主節點。
* 副本成員(Secondary):從主節點通過複製操作以維護相同的資料集,即備份資料,不可寫操作,但可以讀操作(但需要配置)。是預設的一種從節點型別。
* 仲裁者(Arbiter):不保留任何資料的副本,只具有投票選舉作用。當然也可以將仲裁伺服器維護為副本集的一部分,即副本成員同時也可以是仲裁者。也是一種從節點型別。
關於仲裁者:
如果主節點+副本節點是偶數推薦新增仲裁者,如果主節點+ 副本節點是奇數可以不新增仲裁者。仲裁者將永遠是仲裁者,而主要人員可能會退出併成為次要人員,而次要人員可能成為選舉期間的主要人員。
## 為什麼要用可複製集?它有什麼重要性?
1. 避免資料丟失,保障資料安全,提高系統安全性;
(最少3節點,最大50節點)
2. 自動化災備機制,主節點宕機後通過選舉產生新主機;提高系統健壯性;
(7個選舉節點上限)
3. 讀寫分離,負載均衡,提高系統性能;
## 搭建
### 準備三個mongodb節點
正準備三個mongodb節點,我們先搭建一個主節點,2個副本節點的模式
修改配置mongo.conf
* 第一個
```
systemLog:
#MongoDB傳送所有日誌輸出的目標指定為檔案
destination: file
#mongod或mongos應向其傳送所有診斷日誌記錄資訊的日誌檔案的路徑
path: "/home/amber/mongodb/mongodb-001/log/mongod.log"
#當mongos或mongod例項重新啟動時,mongos或mongod會將新條目附加到現有日誌檔案的末尾。
logAppend: true
storage:
#mongod例項儲存其資料的目錄。storage.dbPath設定僅適用於mongod。
dbPath: "/home/amber/mongodb/mongodb-001/data/db"
journal:
#啟用或禁用永續性日誌以確保資料檔案保持有效和可恢復。
enabled: true
processManagement:
#啟用在後臺執行mongos或mongod程序的守護程序模式。
fork: true
#指定用於儲存mongos或mongod程序的程序ID的檔案位置,其中mongos或mongod將寫入其PID
pidFilePath: "/home/amber/mongodb/mongodb-001/log/mongod.pid"
net:
#服務例項繫結所有IP,有副作用,副本集初始化的時候,節點名字會自動設定為本地域名,而不是ip
#bindIpAll: true
#服務例項繫結的IP
bindIp: 0.0.0.0
#bindIp
#繫結的埠
port: 27017
replication:
#副本集的名稱
replSetName: myrs
```
* 第二個第三個配置
把上述檔案中的`mongodb-001`換成`mongodb-002``mongodb-003`
埠分別換成27018 27019
然後分別在mongodb-00X的根目錄下執行啟動命令
```
./bin/mongod -f ./conf/mongod.conf
```
檢查程序
```
ps -ef|grep mongod
```
![](https://img2020.cnblogs.com/blog/1445322/202006/1445322-20200621233317079-900142714.png)
### 設定主節點
進入27017的那個mongod的客戶端,並且執行
```
rs.initiate({
_id: "myrs", // 需要和replSetName的名稱一致
version: 1,
members: [{ _id: 0, host : "192.168.xx.xx:27017" }]});
```
或者
```
rs.initiate({})
```
執行結果
![](https://img2020.cnblogs.com/blog/1445322/202006/1445322-20200621233326431-791616322.png)
```
提示:
1)“ok”的值為1,說明建立成功。
2)命令列提示符發生變化,變成了一個從節點角色,此時預設不能讀寫。稍等片刻,回車,變成主節 點。
```
### 配置副本節點
再27017的mongod客戶端,也就是主節點上執行`192.168.xx.xx:27018`是副本節點的ip和埠
```
rs.add("192.168.xx.xx:27018")
rs.add("192.168.xx.xx:27019")
```
使用
```
rs.status()
```
就可以看到members會有三個節點了
![](https://img2020.cnblogs.com/blog/1445322/202006/1445322-20200621233739986-1722601861.png)
### 測試
再主節點插入一條資料
```
use article;
db.comment.insert({name: "amber"})
```
再從節點檢視,結果
![](https://img2020.cnblogs.com/blog/1445322/202006/1445322-20200621233351009-2061444547.png)
這是因為需要再從節點再次進行
```
rs.slaveok() // 確認當前節點是副本節點
db.comment.find(); // 檢視當前資料
```
可以看到已經有資料了,這樣一主二從的可複製成功了
![](https://img2020.cnblogs.com/blog/1445322/202006/1445322-20200621233400114-524789748.png)
如果關閉主節點,在從節點執行rs.status();
可以看到原來的主節點的health變成了0
![](https://img2020.cnblogs.com/blog/1445322/202006/1445322-20200621233410918-1305890654.png)
27018變成了新的主節點
![](https://img2020.cnblogs.com/blog/1445322/202006/1445322-20200621233642773-21353937