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)、主從節點的用戶配置必須保持一致。