mongodb的複製至少須要兩個實例。其中一個是主節點master,負責處理客戶端請求,其他的都是slave,負責從master上覆制數據。html
master寫處理:
master負責接收寫請求,具體的流程爲: sql
注:oplog是冪等的,當有累加操做inc時,會記錄成set操做,從而不管重複執行多少次操做得到的結果都是同樣的。 mongodb
從節點同步:數據庫
注意:當slave同步的速度趕不上master更新的速度時,oplog會由於追加了過多的操做而發生將舊記錄覆蓋掉,這樣slave可能沒法保證同步全部的數據,這時,slave會開始從頭從新同步。 bash
主從複製是MongoDB最經常使用的複製方式,這種方式很靈活,可用於備份、故障恢復和讀擴展等。須要在啓動進程時指定master和slave,slave要指定master的地址,這種方式沒有自動故障轉移功能。 服務器
默認狀況下,slave既不能寫也不能讀,但能夠經過配置將slave改成可讀模式,從而作到讀寫分離,提升系統性能。 app
操做能夠選擇兩種方式:命令行和配置文件。 性能
master啓動命令命令行
# mongod --config /etc/mongodb.conf --master
slave啓動命令rest
# mongod --config /etc/mongodb.conf --slave --autoresync --slavedelay=10 --source master-ip:master-port
master配置:
master = true
slave配置:
slave = true
autoresync = true
slavedelay = 10
-only
在從節點上指定只複製特定的某個數據庫(默認是複製全部數據庫)。
-slavedelay
用在從節點上,當應用主節點的操做時,從節點增長延時複製(單位秒)。這樣就能輕鬆設置延時從節點,這種節點對用戶無心中刪除重要文檔或者插入垃圾數據等有防禦做用,這些不良操做都會被複制到全部的從節點上,經過延時執行操做,能夠有個恢復的時間差。
-fastsync
以主節點的數據快照爲基礎啓動從節點。若是數據目錄一開始是主節點的數據快照,從節點用這個選項啓動要比作完整的同步快的多。
-autoresync
若是從節點與主節點不一樣步了,則自動從新同步。
-oplogsize
主節點oplog的大小(單位MB)。默認的oplog大小是剩餘磁盤空間的5%。
副本集(Replica Set)就是有自動故障恢復功能的主從集羣。主從集羣和副本集最明顯的區別是副本集沒有固定的」主節點」,整個集羣會選舉出一個」主節點」,當其不能工做時則變動到其餘節點.副本集總會有一個活躍節點(primary)和一個或多個備份節點(secondary)。
副本集能夠在活躍節點有問題時自動切換。
任什麼時候間,集羣中只有一個活躍節點,其餘的都是備份節點.活躍節點其實是活躍服務器,指定的活躍節點能夠隨時間而改變。
有幾種不一樣類型的節點能夠存在與副本集中:
standard 標準節點
這是常規節點,它存儲一份完整的數據副本,參與選舉投票有可能成爲活躍節點。
passive 被動結點
存儲了完整的數據副本,參與投票,不能成爲活躍節點。
arbiter 仲裁者
仲裁者只能參與投票,不接收復制的數據,也不能成爲活躍節點。
每一個參與節點(非仲裁)有優先權,優先權按照優先值從大到小,默認優先級爲1,能夠是0-1000(含)。
在節點配置中修改priority鍵,來配置標準節點或者被動節點。
> members.push({"_id":3,"host":"127.0.0.1:10002","priority":40})
「arbiterOnly」鍵能夠指定仲裁節點
> members.push({"_id":4,"host":"127.0.0.1:10003","arbiterOnly":true})
備份節點會從活躍節點抽取oplog,並執行操做,就像活躍備份系統中的備份服務器同樣.活躍節點也會寫操做到本身的本地oplog.oplog中的操做包含嚴格遞增的序號,這個序號來斷定數據的時效性。
若是活躍節點出現故障,其他節點會選一個新的活躍節點.選舉過程能夠由任何非活躍節點發起,新的活躍節點由副本集中的大多數選舉產生。其中仲裁節點也參與選舉,避免出現僵局。新的活躍節點將是優先級最高的節點,優先級相同則數據較新的節點獲勝。
不論活躍節點什麼時候變化,新的活躍節點的數據就被假定爲系統的最新數據。對其餘幾點(原來的活躍節點)的操做都會回滾,即使是以前的活躍節點已經恢復工做了。爲了完成回滾,全部節點鏈接新的活躍節點後從新同步。這些節點會查看本身的oplog,找出活躍節點沒有的操做,而後向活躍節點請求這些操做影響的文檔最新副本。正在執行從新同步的節點被視爲恢復中,在完成這個過程以前不能成爲活躍節點的候選者。
設置副本集比設置主從集羣稍微複雜一點。
先給副本集起個名稱,是爲了易於與別的副本集區分,也是爲了方便將整個集合視爲一個總體,這裏取名:refactor
啓動服務器–replSet的做用是讓服務器知道這個「refactor」副本集還有別的同伴,位置在 refactor/127.0.0.1:10001
# mongod --dbpath /data1/mongodb --port 10000 --replSet refactor/127.0.0.1:10001 --logpath /data1/log/mongodb/mongodb.log --rest
以一樣的方式啓動另外一臺:
# mongod --dbpath /data1/mongodb --port 10001 --replSet refactor/127.0.0.1:10000 --logpath /data1/log/mongodb/mongodb.log --rest
若是想要添加第三臺,兩種方式:
# mongod --dbpath /data1/mongodb --port 10002 --replSet refactor/127.0.0.1:10000 --logpath /data1/log/mongodb/mongodb.log --rest
注:副本集有自動檢測功能:在其中指定單臺服務器後,MongoDB就會自動搜索並鏈接其他的節點。
> use admin > db.runCommand( { "replSetInitiate": { "_id":"refactor",//副本集的名稱 "members"://副本集中的服務器列表 [ { "_id":1,//每一個服務器的惟一id "host":"127.0.0.1:10000"//指定服務器的主機 }, { "_id":2, "host":"127.0.0.1:10001" } ] } } ) >
在Mongodb中咱們使用mongodump命令來備份MongoDB數據。該命令能夠導出全部數據到指定目錄中。
mongodump命令能夠經過參數指定導出的數據量級轉存的服務器。
語法
mongodump命令腳本語法以下:
# mongodump -h dbhost -d dbname -o dbdirectory
mongodb使用 mongorerstore 命令來恢復備份的數據。
語法
mongorestore命令腳本語法以下:
# mongorestore -h dbhost -d dbname --directoryperdb dbdirectory
系統日誌在Mongdb數據中很中重要,它記錄mongodb啓動和中止的操做,以及服務器在運行過程當中發生的任何異常信息。
配置路徑:
# mongod --logpath='/data/db/log/server.log' -logappend
Jouranl日誌經過預寫入的redo日誌爲mongodb增長了額外的可靠性保障。開啓該功能時候,數據的更新就先寫入Journal日誌,按期集中提交(目前是每100ms提交一次) ,而後在正式數據執行更改。
打開方式:
# mongod --journal
Mongodb的高可用複製策略有一個叫作Replica Sets.ReplicaSet複製過程當中有一個服務器充當主服務器,而一個或多個充當從服務器,主服務將更新寫入一個本地的collection中,這個collection記錄着發生在主服務器的更新操做,並將這些操做分發到從服務器上。這個日誌是Capped Collection。
注:Capped Collections 是性能出色的有着固定大小的集合,以LRU(Least Recently Used 最近最少 使用)規則和插入順序進行 age-out(老化移出)處理,自動維護集合中對象的插入順序,在建立時要預先指定大小。
# mongod --oplogSize=1024 #單位是M
慢查詢記錄了執行時間超過了所設定時間閥值的操做語句。慢查詢日誌對於發現性能有問題的語句頗有幫助,建議開啓此功能並常常分析該日誌的內容。
要配置這個功能只須要在mongod啓動時候設置profile參數便可。例如想要將超過5s的操做都記錄,可使用以下語句:
# mongod --profile=1 --slowms=5