1. 程式人生 > >【Mongodb】 可複製集搭建

【Mongodb】 可複製集搭建

# 可複製集 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