MongoDB架構——複製集

MongoDB支持在多個機器中通過異步複製達到故障轉移和實現冗餘。多機器中同一時刻只有一臺使用於寫操作。

一.主從複製

最常用的複製方式,非常靈活,可用於備份,故障修復,讀擴展等
最基本的設置方式就是建立一個主節點和一個或者多個從節點,每個節點要知道主節點的地址,只需要在某一個服務啓動時加上-master參數,而另一個服務加上-slave與-source參數,可以實現同步。

首先爲主節點建立數據目錄,並綁定端口:
這裏寫圖片描述

然後設置從節點,用到–source來指明主節點的地址:
這裏寫圖片描述

所有從節點都從主節點複製內容,目前還沒有能從從節點複製的機制,原因時從節點沒有保存自己的oplog
一個集羣中有多少個從節點並沒有限制,實際中,從節點個數不要超過12個是最佳的,MongoDB最新版本不再推薦此方案,推薦只用複製集

1.主從複製各個有用的選項含義:

  • -only:從節點上指定複製特定某個數據庫
  • -slavedelay:用在從節點上,當應用主節點的操作增加延時,可以通過
  • 時間差,對數據進行恢復
  • -fastsync:以主節點的數據庫快照爲基礎啓動從節點
  • -autoresync:自動重新同步
  • -oplogSize:是指主節點oplog的大小(單位:MB)

2.添加和刪除
創建從節點時可以不指定主節點,而通過:

>use local
>db.sources.insert({"host" : "192.16.1.50:10000"})

若要更改源:

>db.sources.insert({"host" : "www.zg.com:10000"})
>db.sources.remove({"host" : "192.168.1.50:10000"})

二.複製集

複製集(Replica Set),就是有自動故障恢復功能的主從集羣,它和主從集羣的最大區別就是複製沒有固定的主節點:整個集羣會選舉出一個主節點,當主節點不能工作時,會選出一個從節點爲主節點。複製集總會有一個活躍的節點和一個或者多個備份節點

1.部署複製集
首先,爲每個服務器創建數據目錄,選擇端口:
這裏寫圖片描述

啓動前,給複製集命名以區分複製集,命名爲replcopy:
這裏寫圖片描述
用-replSet讓服務器知道這個replcopy複製集還有別的小夥伴,下面啓動第二臺:
這裏寫圖片描述
如果還要添加多臺,類似指定其他端口就可以
啓動後,日誌會告訴我們複製集沒有初始化,因爲還差最後一步:在Shell中初始化複製集

2.初始化複製集
在shell中,連接其中一臺服務器,初始化命令只用執行一次:
這裏寫圖片描述
小夥伴們在使用cmd換行時,切記不要把(){}這樣的閉合符號的右邊先寫上,符號的右括號會導致cmd認爲你已經輸入完一個命令要開始執行了

代碼說明:

  • _id:replcopy複製集的名字
  • members:複製集中的服務器列表
  • _id:每個服務器的唯一ID
  • host:指定服務器主機

可用>db.isMaster()查看哪一臺被選爲活躍節點

3.複製集中的節點
任何時候,集羣中活躍的節點只有一個,其他都是備份的,指定活躍的節點可以隨時間而改變,複製集中有以下幾種節點:

  • standard:常規節點,參與投票,可能成爲活躍節點
  • passive:存儲完整數據的副本,參與投票,不能成爲活躍節點
  • arbiter:仲裁節點,只參與投票,不接受複製數據,不能成爲活躍節點

可修改節點優先級priority完成標準節點和被動節點:

>members.push({"_id":3,"host":"192.168.1.52:10002","priority":50})
//arbiterOnly鍵可以指定仲裁節點:
>members.push({"_id":2,"host":"192.168.1.52:10002","arbiterOnly":true})
//優先級從0到1000,優先級爲0是被動節點不能成爲活躍節點,其他節點可按優先級大小更新,備份節點會從活躍節點抽取oplog,並執行操作。活躍節點寫操作到自己的本地oplog,這樣就成爲活躍節點了。

4.故障切換和活躍節點選舉
選舉新的活躍節點時,若出現僵局,則優先級高的,數據新的成爲活躍節點。

三.主從配置信息

在local庫中不僅有主從日誌oplog集合,還有配置信息(system.replset)
這裏寫圖片描述

四.管理維護複製集

1.數據庫讀寫分離
用從數據庫查詢主數據庫集合時報錯,證明一個從庫不能執行查詢操作,讓從庫可以讀,分擔主庫的壓力:

>db.getMongo().setSlaveOk()
//先連接從服務器,再輸上述代碼即可

2.故障轉移
如果一個成員出現問題,那麼剩餘成員會自動選一個作爲主庫

3.增加節點
MongoDB複製集不僅提供了高可用性的解決方案,還提供了負載均衡的解決方案,增減複製集節點在實際應用中非常普遍。
(1)增加節點
①通過oplog增加節點
配置啓動新節點,啓用10003這個端口給新的節點:

>mkdir node4文件存放位置
>mkdir node4.log文件存放位置
>mongod --dbpath=D:\mongod\db\node4 --port 10003 --logpath=D:\mongod\logs\node4.log --replSet replcopy/192.168.1.50:10000,192.168.1.51:10001.......
//將新節點添加到複製集:
PRIMARY> rs.add("192.168.1.53:10003")
//用rs.status()可以查看節點同步的狀態

②通過數據庫快照–fastsync和oplog增加
採用oplog方式會導致數據的不一致。而此種方法解決了這個問題,先去某一個複製集成員的物理文件來作爲初始化數據,剩餘的部分用oplog日誌來追:

>scp  node5文件地址
>mkdir node5.log文件地址
//通過scp命令將物理文件取到node5目錄下
//配置新節點,採用10004端口給新的節點,將--dbpath指向node5
//代碼不再贅述,最後還有添加操作等

(2)減少節點

PRIMARY>rs.remove("192.168.1.53:10003")

注意:
開發者可以通過

>db.runCommand({"getLastError":1,"w":N})

操作確保數據的同步性,此命令會進入阻塞,直到N個服務器複製了最新寫入的操作爲止

五.管理

1.診斷
當連接到主節點後,使用db.printReplicationInfo()函數,可以查看oplog大小和操作時間範圍,當連接到從節點時,這個函數返回從節點信息

2.變更oplog大小
如果oplog大小不合適,最簡單的放大就是停掉主節點服務,刪除local數據庫中的文件,用–oplogSize設置oplog的大小重新啓動。
啓動主節點後,所有節點都必須用–autoresync重新啓動,否則需要手動啓動

3.複製認證問題
用設定的密碼替換從節點的password,就能通過主節點的認證複製,從節點會用主節點的repl用戶,沒有則連接第一個用戶

>db.addUser("repl", password)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章