1. 程式人生 > >MongoDB復制集及管理

MongoDB復制集及管理

dir vim touch config 都是 log日誌 參與 技術分享 服務器

MongoDB復制集及管理

MongoDB復制集概述

什麽是復制集

  • 復制集是額外的數據副本,是跨多個服務器同步數據的過程,復制集提供了冗余並增加了數據可用性,通過復制集可以對硬件故障和中斷的服務進行恢復。
  • 復制集的優點如下:

    1)、讓數據更安全;
    2)、高數據可用性;
    3)、災難恢復;
    4)、無停機恢復(如備份、索引重建、故障轉移);
    5)、讀縮放(額外的副本讀取);
    6)、副本集對應用程序是透明的;

復制集工作原理

  • MongoDB的復制集至少需要兩個節點。其中一個是主節點(Primary),負責處理客戶端的請求,其余的都是從節點(Secondary),負責復制主節點上的數據。
  • MongoDB各個節點的搭配方式為:一主一從或一主多從。主節點記錄其上的所有操作到oplog中,從節點定期輪詢主節點獲取這些操作,然後對自己的數據副本執行這些操作,從而保證從節點的數據與主節點一致。
  • 客戶端在主節點寫入數據,在從節點讀取數據,主節點與從節點進行交互保障數據的一致性。如果其中一個節點出現故障,其他節點馬上會將業務接過來而無需停機操作。
  • 復制集特點如下:

    1)、N個節點的群集;
    2)、任何節點可以做主節點;
    3)、所有寫入操作都在主節點上;
    4)、自動故障轉移;
    5)、自動恢復;

MongoDB復制集部署

1、配置復制集

  • 1)、創建多實例;

mkdir -p /data/mongodb/mongodb{2,3,4} #創建數據目錄

mkdir /data/logs

touch /data/logs/mongodb{2,3,4}.log #創建日誌文件

cd /data/logs

chmod 777 *.log #賦予權限

vi /etc/mongod.conf

bindIp: 0.0.0.0          #監聽地址
path: /data/mongodb/mongod.log  #日誌文件存儲目錄
dbPath: /data/mongodb/mongo     #數據存儲目錄
port: 27017                     #監聽端口;每一個實例端口不一樣
---省略內容---
replication:
  replSetName: kgcrs            #復制集的名稱

cp mongod.conf mongod2.conf

cp mongod.conf mongod3.conf

cp mongod.conf mongod4.conf

  • #編輯完成後,復制三分,作為其他三個實例的配置文件,將mongod2.conf中的port參數設置為27018,mongod3.conf中的port參數設置為27019,mongod4.conf中的port參數設置為27020,同樣也將padb和thPath參數修改為對應的路徑值。

mongod -f /etc/mongod.conf #啟動所有實例

mongo --port 27017

mongod -f /etc/mongod2.conf

mongo --port 27018

mongod -f /etc/mongod3.conf

mongo --port 27019

mongod -f /etc/mongod4.conf

mongo --port 27020

技術分享圖片

  • 2)、初始化配置復制集

mongo

cfg={"_id":"kgcrs","members":[{"_id":0,"host":"192.168.27.28:27017"},{"_id":1,"host":"192.168.27.128:27018"},{"_id":2,"host":"192.168.27.128:27019"}]} #定義cfg初始化參數

rs.initiate(cfg) #初始化啟動復制集

技術分享圖片

  • 3)、增加和刪除節點

mongo

rs.add("192.168.27.128:27020") #添加節點

rs.status() #查看狀態

技術分享圖片

rs.remove("192.168.27.128:27020") #刪除節點

re.status #查看狀態,新添加的節點已被刪除

  • 4)、模擬故障自動切換與手動切換

  • 模擬故障自動切換

mongo -f /etc/mongod.conf --shutdown #關閉復制集當前主節點

mongo --port 27018 #進入到第二個節點中

rs.ststus() #查看狀態

技術分享圖片

  • 手動切換

mongod -f /etc/mongod.conf #開啟第一個節點

kgcrs:PRIMARY> rs.freeze(30) #暫停30s不參與選舉

mongo --port 27018

kgcrs:PRIMARY> rs.stepDown(60,30) #交出主節點位置,維持從節點狀態不少於60秒,等待30秒使主節點和從節點日誌同步
rs.ststus() #查看狀態

技術分享圖片

MongoDB復制集選舉原理

1、復制原理

  • 復制是基於操作日誌oplog,相當於MySQL中的二進制日誌,只記錄發生改變的記錄。復制是將主節點的oplog日誌同步並應用到其他從節點的過程。

2、選舉的原理

  • 節點類型分為標準(host)節點、被動(passive)節點和仲裁(arbiter)節點。

  • 1)、只有標準節點可能被選舉為活躍(primary)節點,有選舉權。被動節點有完整副本,不可能成為活躍節點,有選舉權。仲裁節點不復制數據,不可能成為活躍節點,只有選舉權。

  • 2)、標準節點與被動節點的區別:priority值高者是標準節點,低者則為被動節點。

-3)、選舉規則是票數高者獲勝,priority是優先權為0~1000的值,相當於額外增加0~1000的票數。選舉結果:票數高者獲勝;若票數相同,數據新者獲勝。

3、配置復制集的優先級並查看oplog日誌

mongon

cfg={"_id":"kgcrs","members":[{"_id":0,"host":"192.168.27.128:27017","priority":100},{"_id":1,"host":"192.168.27.128:27018","priority":100},{"_id":2,"host":"192.168.27.128:27019","priority":0},{"_id":3,"host":"192.168.27.128:27020","arbiterOnly":true}]} #配置4個節點的復制集

rs.reconfig(cfg)

kgcrs:PRIMARY> rs.isMaster() #查看狀態信息

技術分享圖片

kgcrs:PRIMARY> use kgc

kgcrs:PRIMARY> db.t1.insert({"id":1,"name":"tom"}) #插入數據

kgcrs:PRIMARY> db.t1.insert({"id":2,"name":"jerry"}) #插入數據

kgcrs:PRIMARY> db.t1.find() #查看集合中的數據

kgcrs:PRIMARY> db.t1.update({"id":2},{$set:{"name":"jack"}}) #更改

kgcrs:PRIMARY> db.t1.remove({"id":1}) #刪除

kgcrs:PRIMARY> use local

kgcrs:PRIMARY> show collections #查看集合

    顯示
    oplog.rs

kgcrs:PRIMARY> db.oplog.rs.find() #查看日誌記錄所有操作

#oplog會包含所有對數據有修改的操作;但查詢操作不會記錄。

4、模擬節點故障

-1)、如果主節點出現故障,另一個標準節點將會選舉成新的主節點;

mongod -f /etc/mongod.conf --shutdown #關閉第一個節點服務器

mongo --port 27018 #此時會選舉第二個標準節點為主節點

rs.status() #查看狀態信息

技術分享圖片

  • 2)、當所有標準節點都出現故障,被動節點也不可能成為主節點;

mongod -f /etc/mongod2.conf --shutdown #關閉第二個節點服務器

mongo --port 27019 #此時被動節點不能成為主節點

rs.status() #查看狀態信息

技術分享圖片

MongoDB復制集管理

允許從節點讀取數據

  • 默認MongoDB復制集的從節點不能讀取數據,可以使用rs.slaveOK()命令能夠在從節點讀取數據。

查看復制集狀態信息

  • 可以使用rs.printReplicationInfo()查看日誌大小、時間範圍;使用rs.printSlaveReplicationInfo()查看復制的節點、時間;

更改oplog大小

mongo --port 27018

rs.printReplicationInfo() #查看日誌大小、時間範圍

use admin

db.shutdownServer()

exit

vim /etc/mongod2.conf #註銷replication:相關啟動參數,並修改port端口號27028

net:
  port: 27028

#replication:
    #replSetName: kgcrs

mongod -f /etc/mongod2.conf #單實例模式啟動

mongodump --port 27028 --db local --collection ‘oplog.rs‘ #全備當前節點的所有oplog記錄

mongo --port 27028

use local

db.oplog.rs.drop() #刪除原日誌文件

db.runCommand( { create: "oplog.rs", capped: true, size: (2 1024 1024 * 1024) } ) #重建新的日誌文件,並指定大小

use admin

db.shutdownServer() #關閉服務

exit

vim /etc/mongod2.conf

net:
  port: 27018

replication:
    replSetName: kgcrs
    oplogSizeMB: 2048       #指定大小

mongod -f /etc/mongod2.conf #啟動

mongo --port 27018 #進入第二個節點

rs.printReplicationInfo() #查看日誌大小、時間範圍

exit

技術分享圖片

mongo #進入主節點

rs.stepDown() #有效產生選舉;讓出主節點,第二個會變成主節點

部署認證的復制

use admin #在主節點中創建一個用戶

db.createUser({"user":"root","pwd":"123","roles":["root"]})

exit

vim /etc/mongod.conf #編輯配置文件;4個都需添加如下內容

security:
   keyFile: /usr/bin/kgcrskey1      #秘鑰文件位置
   clusterAuthMode: keyFile         #驗證模式為秘鑰驗證模式

cd /usr/bin/ #寫入四個實例的秘鑰文件(內容需一樣)

echo "kgcrs key"> kgcrskey1

echo "kgcrs key"> kgcrskey2

echo "kgcrs key"> kgcrskey3

echo "kgcrs key"> kgcrskey4

chmod 600 kgcrskey{1..4}

#四個實例依次進行重啟,並進入主節點進行驗證;

show dbs #無法查看數據庫

rs.status() #無法查看復制集

use admin #身份登錄驗證

db.auth("root","123")

rs.status() #可以查看數據庫

show dbs #可以查看復制集

技術分享圖片

MongoDB復制集及管理