MongoDB 數據遷移和同步

MongoDB 數據遷移和同步

MongoDB的數據同步

複製

mongodb的複製至少須要兩個實例。其中一個是主節點master,負責處理客戶端請求,其他的都是slave,負責從master上覆制數據。html

master寫處理:
master負責接收寫請求,具體的流程爲: sql

  • 若是開啓journal功能,則先將寫請求記錄到journal中,而後批量執行,同時將操做記錄到oplog中;
  • 若是未開啓journal功能,則對每一個寫請求進行單獨操做,而後寫入oplog。

注:oplog是冪等的,當有累加操做inc時,會記錄成set操做,從而不管重複執行多少次操做得到的結果都是同樣的。 mongodb

從節點同步:數據庫

  • 若是是一個新的從節點,首先先從master的數據庫文件進行復制,同時記錄起始時間;當從節點從master的複製完成後,會根據複製的起始時間開始追oplog,進而與master進行同步。
  • 初始化同步完成後的slave按期從master的oplog中獲取最新的操做,而後對本身的數據副本執行這些操做,從而保證slave的數據與master最終一致性。

注意:當slave同步的速度趕不上master更新的速度時,oplog會由於追加了過多的操做而發生將舊記錄覆蓋掉,這樣slave可能沒法保證同步全部的數據,這時,slave會開始從頭從新同步。 bash

MongoDB的主從同步

原理

主從複製是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%。

MongoDB副本集

原理

副本集(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就會自動搜索並鏈接其他的節點。

mongo內部命令初始化操做
> 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 & mongorestore

MongoDB數據備份

在Mongodb中咱們使用mongodump命令來備份MongoDB數據。該命令能夠導出全部數據到指定目錄中。
mongodump命令能夠經過參數指定導出的數據量級轉存的服務器。
語法
mongodump命令腳本語法以下:

# mongodump -h dbhost -d dbname -o dbdirectory
  • -h:
    目標MongDB所在服務器地址,例如:127.0.0.1,固然也能夠指定端口號:127.0.0.1:27017
  • -d:
    須要備份的數據庫實例,例如:test
  • -o:
    備份的數據存放位置,例如:/data/mongodb/backup,固然該目錄須要提早創建,在備份完成後,系統自動在dump目錄下創建一個test目錄,這個目錄裏面存放該數據庫實例的備份數據。

MongoDB數據恢復

mongodb使用 mongorerstore 命令來恢復備份的數據。
語法
mongorestore命令腳本語法以下:

# mongorestore -h dbhost -d dbname --directoryperdb dbdirectory
  • -h:
    MongoDB所在服務器地址
  • -d:
    須要恢復的數據庫實例,例如:test,固然這個名稱也能夠和備份時候的不同,好比test2
  • -directoryperdb:
    備份數據所在位置,例如:c:\data\dump\test,這裏爲何要多加一個test,而不是備份時候的dump,讀者本身查看提示吧!
  • -drop:
    恢復的時候,先刪除當前數據,而後恢復備份的數據。就是說,恢復後,備份前添加修改的數據都會被刪除,慎用!

日誌

系統日誌

系統日誌在Mongdb數據中很中重要,它記錄mongodb啓動和中止的操做,以及服務器在運行過程當中發生的任何異常信息。

配置路徑:

# mongod --logpath='/data/db/log/server.log' -logappend

journal日誌

Jouranl日誌經過預寫入的redo日誌爲mongodb增長了額外的可靠性保障。開啓該功能時候,數據的更新就先寫入Journal日誌,按期集中提交(目前是每100ms提交一次) ,而後在正式數據執行更改。

打開方式:

# mongod --journal

oplog日誌

Mongodb的高可用複製策略有一個叫作Replica Sets.ReplicaSet複製過程當中有一個服務器充當主服務器,而一個或多個充當從服務器,主服務將更新寫入一個本地的collection中,這個collection記錄着發生在主服務器的更新操做,並將這些操做分發到從服務器上。這個日誌是Capped Collection。

注:Capped Collections 是性能出色的有着固定大小的集合,以LRU(Least Recently Used 最近最少 使用)規則和插入順序進行 age-out(老化移出)處理,自動維護集合中對象的插入順序,在建立時要預先指定大小。

# mongod --oplogSize=1024 #單位是M

slow日誌

慢查詢記錄了執行時間超過了所設定時間閥值的操做語句。慢查詢日誌對於發現性能有問題的語句頗有幫助,建議開啓此功能並常常分析該日誌的內容。

要配置這個功能只須要在mongod啓動時候設置profile參數便可。例如想要將超過5s的操做都記錄,可使用以下語句:

# mongod --profile=1 --slowms=5 
 
相關文章
相關標籤/搜索