mongodb replica sets功能
經驗總結:
Replica Set是mongodb中數據集這一塊的內容,何爲數據集?簡單的理解,就是把多個庫集中一起去進行管理,這些庫可能是一臺機器上可能是多個服務器組成的服務器組。
主要的功能:
(1) 如果一個項目在一臺機器上面只有一個庫,一旦這個庫壞了那麼整個項目就癱瘓了。如果有多個庫配置一下並且設置了主庫和分庫,那麼一旦主庫出現問題,會自動切換到分庫上面,不會影響使用。
(2) 一旦mongodb進行了主庫和分庫的配置,那主庫就有讀、寫、執行的權限,但是分庫只有讀取的權限。我們往主庫中執行增刪改的操作的時候,會自動同步到對應的分庫,這樣在每一個時間點只會有一個庫可以操作,其他的庫都是通過Replica Set的機制來修改的。既然分庫提供了查詢的權限,那麼必定可以和主庫分擔一些訪問,我們可以把大量的查詢類的請求映射到分庫上面。
(3)
配置的過程:
情景一:(window配置過程,一臺機器上面配置多個庫)
(1) 準備好mongodb 1.6版本以上的,當然1.8版本以上的更好啦。
(2) 創建好多個數據庫文件夾。如:data1、data2(如果是1.8版本以上的有一個—keyFile參數,主要還是安全性方面會高點)。
(3) 啓動mongodb的兩個服務庫分別制定data1和data2。
mongod –dbpath=../../data/data/data1 –port 28010 –replSet rs1 |
mongod –dbpath=../../data/data/data2 –port 28011 –replSet rs1 |
注意:replSet 後面的別字必須是一樣的。
(4) 編寫配置文件
>cfg={_id:’rs1’,members:[{_id:0,host:’localhost:28010’,priority:1},{_id:1,host:’localhost:28011’}]}; |
如果看到下面顯示的配置信息說明成功了。
{ "_id" : "rs1", "members" : [ { "_id" : 0, "host" : "localhost:28010", “priority”:1 }, { "_id" : 1, "host" : "localhost:28011" } ] } |
(5) 初始化配置文件
rs.initiate(cfg); |
如果看到下面提示說明配置成功。
{ "info" : "Config now saved locally. Should come online in about a minute.", "ok" : 1 } |
(6) 查看當前的數據集的配置情況。
rs.status(); |
下面是通過status()函數看到的配置信息:
{ "set" : "rs1", "date" : ISODate("2012-05-31T09:49:57Z"), "myState" : 1, "members" : [ { "_id" : 0, "name" : "localhost:28010", "health" : 1, --1 表明正常; 0 表明異常 "state" : 1, -- 1 表明是Primary; 2 表明是Secondary; "stateStr" : "PRIMARY", --表明此機器是主庫 "optime" : { "t" : 1338457763000, "i" : 1 }, "optimeDate" : ISODate("2012-05-31T09:49:23Z"), "self" : true }, { "_id" : 1, "name" : "localhost:28011", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 23, "optime" : { "t" : 1338457763000, "i" : 1 }, "optimeDate" : ISODate("2012-05-31T09:49:23Z"), "lastHeartbeat" : ISODate("2012-05-31T09:49:56Z") } ], "ok" : 1 } |
這時候我們可以通過往主庫中插入記錄
db.Test.save({name:’lalala’}); |
我們通過啓動的mongodb的日誌可以看到非但查到主庫中添加了記錄,分庫中也添加了記錄。我們也可以通過db.Test.find({name:’lalala’});查看到這條記錄。
(7) 注意點:在配置主庫和分庫的時候主庫中可以存在數據,但是分庫中一定要是空空的,沒有任何的數據。
情景二:(window配置過程,多臺機器上面配置多個庫)
如果這時候按照情景一的方式去配置你會一直出現初始化配置文件的時候出問題,那我們如何解決呢?差了好多資料,大多數資料上面前序工作可能沒做,配置的時候會一路順風。
解決方法一定要給主庫新建一個角色,並且用指定的密碼登陸纔可以。(具體爲什麼這樣做不太清楚,可能出去對安全性的考慮吧,畢竟mongodb的登陸是不需要用戶名密碼的)。
我們先要在主庫中配置一個角色,db.addUser(“root”,”111”);然後db.auth(“root”,”111”);在啓動的時候要加上-uroot –p參數。即:
mongod –dbpath=../../data/data/data1 –port 28010 – u root –p |
然後會提示讓我們輸入密碼:(這邊輸入密碼是看不到***之類的東西的,只管輸就可以了)。
接下來按照情景一進行配置就可以了。
情景三:在linux下面配置
先看看linux的glibc的版本最好glibc2.5以上的版本的,因爲glibc2.4是不支持mongodb1.8以上的,但是mongodb1.8以上的支持—keyFIle參數,讓服務器組更安全。而glibc2.5以上纔會支持mongodb1.8以上的版本。
其他的步驟按照上面情景一。
情景四:如果想數據集的配置安全(啓動mongodb的時候加上--keyFile)。
Mongodb版本1.8.2以上,linux的glibc版本2.5以上。
(1) 在配置每個庫的時候都要有自己對應的keyFile文件,並且這些keyFile中的文件裏面的內容必須是一樣的。如果我們把這兩個keyFile放到data下面的key文件夾下,取名k1,k2
(2) 我們啓動mongdb的時候:
mongod –dbpath ../../data/data/data1 –port 28010 –replSet rs1 –keyFile ../../data/key/k1 |
(3) 接下來按照情景一的步驟進行操作。
如何擴展數據集?
例如現在服務器有兩個192.168.1.2:28010、192.168.1.3:28011,192.168.1.2是主庫,這兩個庫是一直運行的,在添加庫的時候肯定不能把這兩個庫停止了,從新配置。
Mongodb中也提供了rs.add();方法可以添加外面的服務器進來。參數:’192.168.1.4:28012’。
刪除也是同樣的方法。