Mongodb學習總結-5(主從複製)

 從這一篇開始咱們主要討論mongodb的部署技術。sql

    咱們知道sql server可以作到讀寫分離,雙機熱備份和集羣部署,固然mongodb也能作到,實際應用中咱們不但願數據庫採用單點部署,mongodb

若是碰到數據庫宕機或者被毀滅性破壞那是多麼的糟糕。數據庫

 

一:主從複製服務器

1: 首先看看模型圖架構

  

2: 從上面的圖形中咱們能夠分析出這種架構有以下的好處:app

     <1>  數據備份。性能

     <2>  數據恢復。測試

     <3>  讀寫分離。3d

 

3:下面咱們就一一實踐日誌

     實際應用中咱們確定是多服務器部署,限於本身懶的裝虛擬機,就在一臺機器上實踐了。

第一步:咱們把mongodb文件夾放在D盤和E盤,模擬放在多服務器上。

第二步:啓動D盤上的mongodb,把該數據庫指定爲主數據庫,其實命令很簡單:>mongodb --dbpath='XXX' --master,

           端口仍是默認的27017.

第三步:一樣的方式啓動E盤上的mongodb,指定該數據庫爲從屬數據庫,命令也很簡單,固然咱們要換一個端口,好比:8888。

           source 表示主數據庫的地址。

           >mongod --dbpath=xxxx --port=8888 --slave --source=127.0.0.1:27017

第四步:從圖中的紅色區域咱們發現了一條:「applied 1 operations"這樣的語句,而且發生的時間相隔10s,也就說明從屬數據庫每10s

           就向主數據庫同步數據,同步依據也就是尋找主數據庫的」OpLog「日誌,能夠在圖中紅色區域內發現」sync_pullOpLog「字樣。

           接下來咱們要作的就是測試,驚訝的發現數據已經同步更新,爽啊。

 

4:  若是我還想增長一臺從屬數據庫,可是我不想在啓動時就指定,而是後期指定,那麼mongodb能否作的到呢?答案確定是能夠的。

      咱們的主或者從屬數據庫中都有一個叫作local的集合,主要是用於存放內部複製信息。

      好,那麼咱們就試一下,我在F盤再拷貝一份mongodb的運行程序,cmd窗口好多啊,你們不要搞亂了。

    

    看上面的log,提示沒有主數據庫,不要緊,某一天咱們良心發現,給他後期補貼一下,哈哈,再開一個cmd窗口,語句也就是

    在sources中add一個host地址,最後發現數據也同步到127.0.0.1:5555這臺從屬數據庫中....

    

 

5: 讀寫分離

     這種手段在大一點的架構中都有實現,在mongodb中其實很簡單,在默認的狀況下,從屬數據庫不支持數據的讀取,可是不要緊,

在驅動中給咱們提供了一個叫作「slaveOkay"來讓咱們能夠顯示的讀取從屬數據庫來減輕主數據庫的性能壓力,這裏就不演示了。

 

二:副本集

    這個也是很牛X的主從集羣,不過跟上面的集羣仍是有兩點區別的。

      <1>:  該集羣沒有特定的主數據庫。

      <2>:  若是哪一個主數據庫宕機了,集羣中就會推選出一個從屬數據庫做爲主數據庫頂上,這就具有了自動故障恢復功能,很牛X的啊。

                 好,咱們如今就來試一下,首先把全部的cmd窗口關掉從新來,清掉db下的全部文件。

 

第一步:  既然咱們要創建集羣,就得取個集羣名字,這裏就取咱們的公司名shopex, --replSet表示讓服務器知道shopex下還有其餘數據庫,

            這裏就把D盤裏面的mongodb程序打開,端口爲2222。指定端口爲3333是shopex集羣下的另外一個數據庫服務器。

 

第二步:  既然上面說3333是另外一個數據庫服務器,不要急,如今就來開,這裏把E盤的mongodb程序打開。

 

第三步:  ok,看看上面的日誌紅色區域,彷佛咱們尚未作完,是的,log信息告訴咱們要初始化一下「副本集「,既然日誌這麼說,那我也就

             這麼作,隨便鏈接一下哪一個服務器都行,不過必定要進入admin集合。

 

第四步: 開啓成功後,咱們要看看誰才能成爲主數據庫服務器,能夠看到端口爲2222的已經成爲主數據庫服務器。

 

第五步:咱們知道sql server裏面有一個叫作仲裁服務器,那麼mongodb中也是有的,跟sql server同樣,仲裁只參與投票選舉,這裏咱們

           把F盤的mongodb做爲仲裁服務器,而後指定shopex集羣中的任一個服務器端口,這裏就指定2222。

 

而後咱們在admin集合中使用rs.addArb()追加便可。

追加好了以後,咱們使用rs.status()來查看下集羣中的服務器狀態,圖中咱們能夠清楚的看到誰是主,仍是從,仍是仲裁。

 

不是說該集羣有自動故障恢復嗎?那麼咱們就能夠來試一下,在2222端口的cmd服務器按Ctrl+C來KO掉該服務器,立馬咱們發現

在3333端口的從屬服務器便可頂上,最後你們也能夠再次使用rs.status()來看下集羣中服務器的狀態。

相關文章
相關標籤/搜索