MongoDB 複製組 Replica set

摘要:MongoDB 複製組 Replica set

看書筆記:

 

一個複製組(replica set)基本上是一個自動從錯誤中轉移的主從叢集。
主從叢集跟複製組的最大差別就是,複製組沒有一個單一的主節點:主節點是由叢集所選出,若目前的主節點壞了,主節點會改變為另一個。
複製組永遠會有一個單一主節點(稱為主要節點),以及一個或多個從屬節點(稱為次要節點)
在複製組中指定幾個伺服器,然後驅動程式會自動理解所有在複製組中的伺服器,並且若現在的節點死亡則會自動轉移至其他伺服器。
 

cat /etc/hostname
 
 
--replSet 
 
replSet = replSetName
 
mogod --dbpath ~/dbs/node1 --port 10001 --replSet replSetName/host_name:port,host_name2:port
 
TomLai-PC
 
replSet = <setname>[/<seedlist>]
 
其中一個使用複製組的好處就是,它們是自己偵測的:你能夠指定複製組中的單一伺服器,然後MongoDB會理解並且自動的連接剩下的節點。
 
初始化
db.runCommand({"replSetInitiate":{.....}
 
 
local.system.replset 名稱空間上執行find,你將會發現,配置已經傳遞到複製組中的其他伺服器了。
 
 
http://www.mongodb.org/display/DOCS/Replica+Sets
 
標準節點
        這是普通的複製組節點。它儲存了被複製資料的完整拷貝,並且在要票選新的主要節點時參與投票,它也有成為主要節點的可能。
被動節點
       被動節點儲存資料的完整拷貝,並且也會參與投票,但它永遠不會成為複製組中的主要節點。
仲裁節點
       仲裁節點僅參與投票,它並不會接收任何被複製的資料,並且也不能成為主要節點。
 
優先權為0的節點就是被動節點,垂且永遠不會被選為主要節點。
擁有非零優先權的節點,將會依照優先權遞減順序而被選擇。
若複製組中有兩個優先權為1的節點,以及一個優先權為0.5的節點,則只有在優先權為1的兩個節點都沒有辦法被選為主要節點時,第三個節點才會被選為主要節點。
 
 
members.push({""_id":3,"host":"morton:10001","priority":40});
 
主要節點會定期追蹤,在叢集中有多少個節點是可以被它所接觸到。若它無法接觸到多數的節點,那麼主要節點會自動的降為次要狀態。
當主要節點因為網路劃分的關係而在叢集中被分離時,能夠防止它還持續以主要節點的方式運作的狀況。
 
 
在MongoDB的從屬伺服器上,最主要且最常見的使用案例,就是用來在主節點資料遺失或是停工時,當成從錯誤中轉移機制的機制。
 
從屬伺服器能夠被當做備份的來源。
 
它也能夠被用來水平擴充讀取效能。
或是執行資料處理任務
 
在MongoDB中使用從屬伺服器來擴充讀取效能有一個重點要注意:複製是非同步的。這代表,當資料在主節點上被插入或是被更新時,在從屬節點上的資料將會有一段時間是過期的。若你嘗試在從屬伺服器上執行查詢時,這是需要考量的重點。
 
MongoDB的複製設定至少是由兩個伺服器或是節點所組成的。
一個節點是主節點,負責處理正常的客戶端請求。其他節點則是從屬節點,負責鏡射儲存在主節點上的資料。
 
Oplog
由主節點維護的動作記錄稱作oplog,是動作歷史訊息記錄的簡稱。
oplog儲存在稱為local的特殊資料庫中的oplog.$main集合內,每個在oplog中的文件代表單一在主伺服器上執行的動作。
 
如使用"$inc"遞增的更新會被轉換為"$set"
 
若套用在從屬伺服器上的動作跟實際上在主伺服器上的動作差的太遠了,那麼從屬伺服器將會變成不同步的。
 
當從屬伺服器關機一陣子或是太忙碌在處理讀取請求時就可能會發生。這也可能在完整同步之後發生,因為若同步花了太多時間,而在同步完成時oplog中尚未同步到的動作已經被覆蓋,就會發生。
 
 
要防止從屬伺服器不同步,擁有一個大的oplog是很重要的,這樣可以讓主伺服器儲存更長的動作歷史記錄。較大的oplog很明顯地的使用更多的磁碟空間,但通常來說這是個好的方法。
 
 
複製狀態及本地資料庫。
local資料庫是用來在主伺服器,以及從屬伺服器上記錄所有內部複製狀態。本地資料庫的名稱是local,它包含了永遠不會被複製的內容。因此,本地資料庫對單一mongoDB伺服器來說,保證是本地的。
 
 

主伺服器上的複製狀態包含它的從屬伺服器的清單
db.slaves.find()
 
從屬伺服器也儲存狀態在本地資料庫中。
db.sources.find()
 
主伺服器與從屬伺服器都會使用儲存在"syncedTo"的時間戳記,持續追蹤一個從屬伺服器有多新。
 
 
我們執行getLastError時將會鎖定伺服器,直到至少有N個伺服器已經複製了的寫入動作:
db.runCommand({getLastError:1,w:N};
 
 
主伺服器本身包含在N之內。主伺服器使用儲存在local.slaves中的"syncedTo"資訊來追蹤每個從屬伺服器內的資料有多新。
 
當指定"w"時,getLastError指令可以幹受另一個額外的參數:"wtimeout"它以毫秒為單位指定逾期的時間。這允許getLastError在超過一段時間後逾期,並且在最後的動作被
 
用來查看複製的狀態。
當連接至
主伺服器時,
使用db.printReplicationInfo();
 
從屬伺服器
db.printSlaveReplicationInfo();
 
若要改變oplog大小
最簡單的方法就是停止主伺服器,刪除local資料庫的檔案,然後在重啟時使用 --oplogSize選項。
rm /data/db/local.*
./mongod --master --oplogSize size
 
size 是以megabyte為單位
 
MongoDB文件中的暫停複製部分
http://www.mongodb.org/display/DOCS/Halted+Replication
 
當從屬伺服器賞試要連接至主伺服器時
local.system.usrs中的使用者來認證。
它首先會賞試的使用者名稱是'repl",但若無法找到這個使用者,它會使用在local.system.users中的第一個可用的使用者。
 
想要配合認證使用複製,要在主伺服器,以及它所有的從屬伺服器上執行以下的程式,並且將password十成想要使用的安全密碼:
use local
db.add User("repl",password");
 
這麼做,從屬伺服器就可以從主伺服器來複製資料。