MongoDB學習筆記系列:(八) 複製

1、主從集羣簡介算法

高可用性一般描述一個系統通過專門的設計,從而減小停工時間。shell

保存其服務的高度連續可用性,MongoDB提供的主從複製機制保證了多個數據庫的數據同步,這對實現數據庫的容災、備份、恢復、負載均衡都是有極大的幫助.數據庫

主從複製的優勢:服務器

從服務器能夠執行查詢工做,下降主服務器訪問壓力;負載均衡

在從服務器執行備份,避免備份期間鎖定主服務器的數據;異步

當主服務器出現故障時,能夠快速切換到從服務器,減小當機時間;ide

MongoDB支持在多個機器中經過異步複製到底故障轉移和實現冗餘,多臺機器中同一時刻只有一臺是用於寫操做,spa

這爲mongoDB提供了數據一致性的保障.擔當Primary角色的機器能把讀操做分發給slave機器。設計


MongoDB的主從集羣分爲兩種:日誌

Master-Slave 複製(主從複製)  

Replica Sets 複製(副本集)

主服務器支持增刪該,從服務器主要支持讀.


Master-Slave(主從複製):

只須要在某一個服務啓動時加上-master參數,以指明此服務器的角色是primary,

而另外一個服務加上-slave與-source參數,以指明此服務器的角色是slave. 便可實現同步。

MongoDB的最新版本已經不推薦使用這種方法了。


Replica Sets 複製(副本集):

MongoDB在1.6版本開發了replica set,主要增長了故障自動切換和自動修復成員節點。

各個DB之間數據徹底一致,最爲顯著的區別在於:

副本集沒有固定的主節點,它是整個集羣選舉得出的一個主節點,當其不工做時變動其它節點。


2、主從複製(Master-Slave)

一、概念:主從複製是一個簡單的數據庫同步備份的集羣技術。簡單結構,以下圖所示:

(1)、在數據庫集羣中要明確的知道誰是主服務器,主服務器只有一臺。

(2)、從服務器要知道本身的數據源,也就是對於本身的主服務器是誰。

(3)、--master用來肯定主服務器,--slave來控制從服務器, --source肯定從服務的數據源。

二、主從複製集羣案例

主服務器:1111

參數配置:

dbpath=D:\Work\MongoDB\Data\1111 #主數據庫地址

bind_ip=127.0.0.1 #主數據庫所在服務器IP

port=1111 #主數據庫端口號

master=true #肯定主服務器


從服務器:2222

參數配置:

dbpath=D:\Work\MongoDB\Data\2222 #從數據庫地址

bind_ip=127.0.0.1 #從數據庫所在服務器IP

port=2222 #從數據庫端口號

source=127.0.0.1:1111 #主數據的服務器IP和端口

#這個配置項(source),能夠用shell動態添加

slave=true #肯定從服務器

三、主從複製選項

--only 從節點->指定複製某個數據庫,默認是複製所有數據庫;

--slavedelay 從節點->設置主數據庫同步數據的延遲時間,單位爲秒;

--fastsync 從節點->以主數據庫的節點快照爲節點,啓動從數據庫;

--oplogSize 主節點->設置oplog的大小(主節點操做記錄,存儲在local數據庫的oplog中);

四、利用shell動態添加和刪除從節點

示例:

> use local

switched to db local

> db.sources.find()

{ "host" : "127.0.0.1:1111", "source" : "main", "syncedTo" : { "t" : 1376132657, "i" : 1 } }

從上面的示例中,不難看出從節點中關於主節點的信息,所有存儲到local數據庫的sources集合中。

咱們只要對sources集合進行操做,就能夠動態操做主從關係。

(1)添加數據源

db.sources.insert({"host":"127.0.0.1:1111"})

(2)刪除數據源

db.sources.remove({"host":"127.0.0.1:1111"})

3、副本集(Replica Sets)

一、概念:副本集就是具備自動故障恢復功能的主從集羣(俗稱"故障轉移集羣")。簡單結構,

以下圖所示:

1.一、第一張圖代表A是活躍的,B和C是用於備份的;

1.二、第二張圖代表當A出現了故障,這時候集羣根據權重算法,推選出B爲活躍的數據庫;

1.三、第三張圖代表當A恢復後,它自動又會變爲備份數據庫。

二、特色:

(1)、與普通主從複製集羣相比,具備自動檢測機制;

(2)、須要使用--replset選項指定副本同伴;

(3)、任什麼時候候,副本集當中只容許有一個活躍節點。

三、副本集案例:

A服務器:1111

參數配置:

dbpath=D:\Work\MongoDB\Data\replset\1111 #數據庫地址

bind_ip=127.0.0.1 #數據庫所在服務器IP

port=1111 #數據庫端口號

replSet=child/127.0.0.1:2222 #設定同伴


B服務器:2222

參數配置:

dbpath=D:\Work\MongoDB\Data\replset\2222 #數據庫地址

bind_ip=127.0.0.1 #數據庫所在服務器IP

port=2222 #數據庫端口號

replSet=child/127.0.0.1:3333 #設定同伴

C服務器:3333

參數配置:

dbpath=D:\Work\MongoDB\Data\replset\3333 #數據庫地址

bind_ip=127.0.0.1 #數據庫所在服務器IP

port=3333 #數據庫端口號

replSet=child/127.0.0.1:1111 #設定同伴s

四、初始化副本集

use admin;

db.runCommand({"replSetInitiate":

 {

"_id":"child",#副本集名稱

"members":[{

"_id":1, #服務器惟一ID(必須爲數字)

"host":"127.0.0.1:1111" #服務器主機地址

},{

"_id":2,

"host":"127.0.0.1:2222"

},{

"_id":3,

"host":"127.0.0.1:3333" 

}]

 }

});

初始化副本集的結果:

{

        "info" : "Config now saved locally.  Should come online in about a minute.",

        "ok" : 1

}

五、查看副本集狀態

rs.status();#查看副本集全部服務器狀態。

rs.isMaster();#查看副本集中當前服務器狀態。

六、查看主從配置信息

在local庫中不只有主從日誌oplog.rs,還有一個集合用於記錄主從配置信息system.replset。

經過執行」db.system.replset.find()」命令查看複製集的配置信息,查詢結果以下所示:

child:PRIMARY> use local

switched to db local

child:PRIMARY> db.system.replset.find()

"_id" : "child", "version" : 1, 

"members" : [         

{       "_id" : 1,      "host" : "127.0.0.1:11111" },        

{       "_id" : 2,      "host" : "127.0.0.1:2222" },    

{       "_id" : 3,      "host" : "127.0.0.1:3333" } 

}

七、副本集中的節點類型

standard->常規節點:參與投票有可能成爲活躍節點。

passive->副本節點:參與投票,可是不能成爲活躍節點。

arbiter->仲裁節點:只是參與投票,不復制節點,也不能成爲活躍節點。

八、初始化高級參數

priority:0到1000之間,0表明是副本節點,1到1000是常規節點;

 經過這個咱們能夠指明副本集某臺服務器節點初始爲活躍節點。

arbiterOnly:true,仲裁節點;特定指明某個服務器節點爲仲裁節點,仲裁節點不會複製數據,不會成爲活躍節點;

其存在的目的只有一個:當前活躍節點失效後,副本集內從新投票選活躍節點時,防止出現僵局!

九、故障切換和活躍點選舉

當前活躍節點失效,包括兩種狀況:

(1)當前活躍節點宕機或自己異常。

(2)當前活躍節點會經過心跳跟蹤集羣中多少節點對其可見,若是數量小於集羣服務器數量的一半,會自動降級爲備份節點。

   此時,集羣會投票選舉出一個新的活躍節點(新比較優先級,優先級相同的,各個節點判斷哪一個數據最新,就會投哪一個)。

   任什麼時候候,活躍節點的數據會被認爲是最新的,當從新肯定了活躍節點後,全部其餘節點都要從新進行完整同步(數據可能發生回滾)。

4、在服務器上執行操做

一、讀寫分離(擴展讀)

通常狀況下,做爲副本的節點是不能進行數據庫讀操做的,可是在讀取密集型的系統中,讀寫分離是十分必要的。

二、設置讀寫分離

slaveOkay:true

三、讀寫分離的特色:

(1)、將密集的讀取操做分流到從節點上,下降主節點的負載。

(2)、默認狀況下,從節點是不容許處理客戶端請求的,須要使用--slaveOkay打開。

    (3)、不適用於實時性要求很是高的應用。

5、工做原理

一、oplog

oplog保存在local數據庫中,oplog就在其中的oplog.$main集合內保存。該集合的每一個文檔都記錄了主節點上執行的一個操做,其鍵定義以下:

ts:操做時間戳,佔用4字符;

op:操做類型,佔用2個字節;

ns:操做對象的命名空間(或理解爲集合全名);

O:

o:進一步指定所執行的操做,例如插入。

二、同步

(1)、從節點首次啓動時,作完整同步;

(2)、主節點數據發生變化時,作增量同步;

(3)、從節點與主節點數據嚴重不一致時,作完整同步。


6、複製管理

一、診斷

(1)、當鏈接上主節點後,可使用db.printReplicationInfo(),查看oplog的大小和oplog中操做的時間範圍。

(2)、當鏈接上從節點後,可使用db.printSlaveReplicationInfo(),查看從節點的數據源列表、同步延遲時間等信息。

二、變動oplog的容量

在主節點上使用:

(1)、設定oplogSize參數;

(2)、重啓MongoDB數據庫;

三、複製認證

主從節點皆須配置:

(1)、存儲在local.system.users;

(2)、優先嚐試repl用戶;

(3)、主從節點的用戶配置必須保持一致。

相關文章
相關標籤/搜索