linux下mongodb的複本集

來源:互聯網
上載者:User

一、節點類型

standard:常規節點,它儲存一份完整的資料副本,參與選舉投票,有可能成為活躍節點。

passive:儲存了完整的資料副本,參與投票,不能成為活躍節點。

arbiter:仲裁節點,只參與投票,不接收複製的資料,也不能成為活躍節點。

二、參數說明
--dbpath   資料檔案路徑
--logpath  記錄檔路徑
--port        連接埠號碼,預設是27017.我這裡使用的也是這個連接埠號碼.
--replSet   複製集的名字,一個replica sets中的每個節點的這個參數都要用一個複製集名字,這裡是test.
--replSet   這個後面跟的是其他standard節點的ip和連接埠
--maxConns   最大串連數
--fork       後台運行
--logappend   記錄檔迴圈使用,如果記錄檔已滿,那麼新日誌覆蓋最久日誌。

註:
1、不需要像mysql一樣複製完整資料過去,叢庫啟動會制動複製主庫完整資料。
2、叢庫自動設定為唯讀。
3、mongodb第一次啟動時間較長,需要注意等待。
4、管理命令多數都要在admin庫中執行use admin

三、棄置站台集 
環境說明:

ip:10.0.0.2   master
ip:10.0.0.3   slave
ip:10.0.0.4   slave
ip:10.0.0.5  arbiter

1、建立資料目錄:mkdir server1  server2 server3 server4

2、開啟mongodb:

首先:我們為複本集取個名字叫:fuben

為10.0.0.2開啟:/usr/local/mongodb/bin/mongod --dbpath=/usr/local/mongodb/server1 --logpath=/usr/local/mongodb/dblog1 --replSet fuben:10.0.0.3 --fork

(注::--fork為建立守護進程,--logpath與--fork必須並存)

為10.0.0.3開啟:/usr/local/mongodb/bin/mongod --dbpath=/usr/local/mongodb/server2 --logpath=/usr/local/mongodb/dblog2
--replSet fuben:10.0.0.2 --fork

啟動服務後,我們可以通過記錄檔觀察啟動mongodb的資訊,並且複本集有一個亮點就是自動檢測功能:在其中指定的單台伺服器後,mongodb就是自動搜尋並串連其餘的節點

3、初始化節點

我們串連到其中一個節點上,並使用replSetInitiate命令進行初始化。此命令需要一個設定物件,指定設定的每個成員的名字。

db.runCommand({"replSetInitiate":{

'_id':'fuben',

'members':[

{    
"_id" : 0,    
"host" : "10.0.0.2"   
  },    
  {    
"_id" : 1,    
  "host" : "10.0.0.3"   
  }  

]

}

})

或者:

>>config = {_id:"test",members:[... {_id:0,host:'10.0.0.2'},... {_id:1,host:'10.0.0.3'},]... }>rs.initiate(config);{   "info" : "Config now saved locally.  Should come online in about a minute.",   "ok" : 1}

在此期間,其中一個節點將當選為主節點。

這樣我們就建立了複本集,我們在主要資料庫中寫入資料,那麼從就會同步了,但是從伺服器不能查看裡面的資料,我們可以通過設定將從伺服器改為可讀

通過日誌我們可以查看,從伺服器是每十秒鐘去讀取主伺服器下面的local.oplog.rs進行同步

我們可以通過:rs.status()來查看複本集裡面的詳細資料 ,也可以通過rs.isMaster()來查看該伺服器是否為master

4、後期添加從伺服器

為10.0.0.4開啟:/usr/local/mongodb/bin/mongod --dbpath=/usr/local/mongodb/server3  --logpath=/usr/local/mongodb/dblog3 --replSet
fuben:10.0.0.2 --fork

首先,我們開啟了10.0.0.4伺服器的mongodb

我們在主伺服器上添加,rs.add("10.0.0.4:27017"),這樣就該伺服器添加到了複本集

5、添加仲裁節點

為10.0.0.5開啟:/usr/local/mongodb/bin/mongod --dbpath=/usr/local/mongodb/server4  --logpath=/usr/local/mongodb/dblog4 --replSet
fuben:10.0.0.2 --fork

首先,我們開啟了10.0.0.5伺服器的mongodb(Arbiter)

我們在主伺服器上添加,rs.addArb("10.0.0.4:27017"),這樣就該伺服器添加到了複本集的仲裁節點

該節點不參與資料的複製,只是參與投票選擇主節點而已

6、mongodb資料庫的複本集的同步機制

資料複製的目的是使資料得到最大的可用性,避免單點故障引起的整站不能訪問的情況的發生,Mongodb的複本集在同一時刻只有一台伺服器是可以寫的,複本集的主從複製也是一個非同步同步的過程,是slave端從primary端擷取日誌,然後在自己身上完全順序的執行日誌所記錄的各種操作(該日誌是不記錄查詢操作的),這個日誌就是local資料庫中的oplog.rs表,預設在64位機器上這個表是比較大的,占磁碟大小的5%,oplog.rs的大小可以在啟動參數中設定:--oplogSize 1000,單位是M。在生產環境中建議此值設定的大一些,以防止無法同步的情況發生。

7、查看同步狀態

我們使用:db.printSlaveReplicationInfo()來查看資訊,這裡顯示了,同步了多少時間等資訊

如:

source:   127.0.0.1:10000
         syncedTo: Tue Jul 16 2013 15:18:52 GMT+0800 (CST)
                 = 5337 secs ago (1.48hrs)
source:   127.0.0.1:10003
         syncedTo: Tue Jul 16 2013 16:05:22 GMT+0800 (CST)
                 = 2547 secs ago (0.71hrs)
source:   127.0.0.1:10002
         no replication info, yet.  State: ARBITER

source:從庫的ip和連接埠

syncedTo:目前的同步情況,以及最後一次同步的時間

從上面可以看出,在資料庫內容不變的情況下他是不同步的,資料庫變動就會馬上同步。

db.printReplicationInfo()查看oplog的大小和oplog中操作的時間範圍

如:configured oplog size:   50MB
log length start to end: 9071secs (2.52hrs)
oplog first event time:  Tue Jul 16 2013 14:20:40 GMT+0800 (CST)
oplog last event time:   Tue Jul 16 2013 16:51:51 GMT+0800 (CST)
now:                     Tue Jul 16 2013 17:10:35 GMT+0800 (CST)

這裡說明了,oplog配置為50M,日誌記錄的時間長度等資訊

8、刪除節點

  出於種種原因把,現在準備刪除一個節點,空閑出一台伺服器

這時使用命令rs.remove("IP+連接埠")即可移除該節點

如:rs.remove('10.0.0.3:27017')

輸出結果:

Tue Jul 16 16:51:52.180 DBClientCursor::init call() failed
Tue Jul 16 16:51:52.210 JavaScript execution failed: Error: error doing query: failed at src/mongo/shell/query.js:L78
Tue Jul 16 16:51:52.229 trying reconnect to 127.0.0.1:10001
Tue Jul 16 16:51:52.231 reconnect 127.0.0.1:10001 ok

這樣:我們用rs.status就可以查看到該節點已經沒有了

9、同步檔案

主節點的操作記錄在oplog裡 (operation logs) ,oplog儲存在一個特殊的資料庫中,叫:local,而oplog就在oplog.rs裡面

我們可以通過:db.oplog.rs.find()查看動作記錄記錄

oplog中每個文檔記錄了主節點的一個操作:文檔中的鍵:

ts:操作的時間戳記,由4個位元組的時間戳記和4個位元組的計數器組成

op:操作類型,只有一個位元組的代碼(如:u--update,i-insert n--null)

ns:執行操作的命名空間,就是集合名

o:指定了執行的文檔,就是要插入的資料,更新的資料等等

10、從節點的同步問題

從節點第一次啟動,會對主節點資料進行完整的同步,這樣花費大量的時間,如果從節點的操作已經被主節點落下太遠了,從節點就會跟不上,因為主節點資料太新了,這裡可能是從節點出現故障或者宕機,或者是從節點分擔了主節點作為讀伺服器,這樣資源被消耗,疲於應付讀取而無法同步,這樣從節點的資料就更不上了

我們可以通過:{‘resync’:1}命令來手動執行重新同步,也可以在啟動從節點的時候加入參數:--autoresync來重新同步。重新同步代價很高,應盡量避免,方法就是配置足夠大的oplog

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.