8天學通MongoDB——第五天 主從複製

來源:互聯網
上載者:User

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

    我們知道sql server能夠做到讀寫分離,雙機熱備份和叢集部署,當然mongodb也能做到,實際應用中我們不希望資料庫採用單點部署,

如果碰到資料庫宕機或者被毀滅性破壞那是多麼的糟糕。

 

一:主從複製

1: 首先看看模型圖

  

2: 從上面的圖形中我們可以分析出這種架構有如下的好處:

     <1>  資料備份。

     <2>  資料恢複。

     <3>  讀寫分離。

 

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()來看下叢集中伺服器的狀態。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.