Mongodb副本集配置

Mongodb副本集配置

    副本集就是有自動故障恢復功能的主從集羣。主從集羣和副本集最爲明顯的區別就是副本集沒有固定的主節點。
可以把副本集當做一個集羣,整個集羣會選出一個主節點,當其不能正常工作時則會激活其它節點。

系統:
CentOS 5.6 x86_64
mongo版本:mongodb-linux-x86_64-2.0.6.tgz 
Server1 10.0.1.121:20001
server2 10.0.1.212:20001
Arbiter 10.0.1.212:20002

目錄規劃:
數據目錄和日誌單分出來
Server1:
/mongodb
/mlogs
應用程序日誌統計放到/usr/local/mongo
Server2:
/mongodb
/mlogs
/arbiter
應用程序日誌統計放到/usr/local/mongo

部署:
1.防火牆開啓20001端口,關閉selinux

2.分別在兩臺機器上安裝mongo服務
tar xf mongodb-linux-x86_64-2.0.6.tgz -C /usr/local/mongo
3.創建key文件
Server1:
mkdir /etc/keys
echo "test123456" > r0
Server2:
mkdir /etc/keys
echo "test123456" > r1
Arbiter:
echo "test123456" > r2
chmod 600 r0 r1 r2
4.分別啓動Server1和Server2的mongo服務
Server1:
/usr/local/mongo/bin/mongod --replSet rs1 --keyFile /usr/local/mongo/key/r0 --port 20001 --fork --dbpath=/mongodb/ --logpath /mlogs/Server1.log 
--fork爲後臺啓動
netstat -tunlp | grep mongo  查看端口是否被開啓
加入到開機啓動腳本 /etc/rc.local
Server2:
/usr/local/mongo/bin/mongod --replSet rs1 --keyFile /usr/local/mongo/key/r1 --port 20001 --fork --dbpath=/mongodb/ --logpath /mlogs/Server2.log 
netstat -tunlp | grep mongo  查看端口是否被開啓

/usr/local/mongo/bin/mongod --replSet rs1 --keyFile /usr/local/mongo/key/r2 --port 20002 --fork --dbpath=/arbiter --logpath /mlogs/arbiter.log 

加入到開機啓動腳本 /etc/rc.local使機器重啓後繼續生效

選項:
--only
在從節點上指定複製某個數據庫(默認複製所有數據庫)
--slavedelay
用在從節點上,當應用主節點的操作時增加延時(秒)
--fastsync
以主節點的數據快照爲基礎啓動從節點,如果數據目錄一開始是主節點的數據快照,從節點用這個選項啓動要比完整同步快多了
--autoresync
如果從節點與主節點不同步,則自動重新同步
--oplogSize
主節點oplog的大小(MB)
5.配置及初始化Replica Sets
 > config_pongo={
..._id:'pongo',members:[
...{_id:0,host:'10.0.1.121:20001',priority:1},    #如果有多個節點繼續往下增加
...{_id:1,host:'10.0.1.212:20001',priority:2}, 
...{_id:2,host:"10.0.1.212:20002",arbiterOnly : true}]
...}
rs.initiate(config_rs1); 初始化Replica Sets

注:關於擴展節點和添加仲裁設備請看最下方、
副本集中節點的類型
standard:常規節點,它存儲一份完整的數據副本,參與選舉投票可以成爲活躍節點。
passive:存儲了完整的數據副本,參與投票,不能成爲活躍節點。
arbiter:仲裁者只參與投票,不能接受複製數據,也不能成爲活躍節點。
每個參與節點(非仲裁者)都有個優先權,優先權爲0是被動的,不能成爲活躍節點,優先值不爲0,則按照大小選出活躍節點。
如果2個值一樣,則數據最新的爲活躍節點。在節點配置中修改priority鍵,來配置成標準節點或被動節點。

注:如果配置成功master會變成PRIMARY  slave會變成SECONDARY

6.使用rs.status()查看副本集的狀態信息

"health" : 1,                        --1表明正常; 0表明異常、
"state" : 1,                          -- 1表明是Primary; 2 表明是Secondary;
"stateStr" : "PRIMARY",      --表明此機器是主庫 


主從操作日誌oplog
    主節點的操作記錄稱爲oplog(operation log)。Oplog存儲在一個特殊的數據庫中,叫做local。
Oplog就在其中的oplog.$main集合裏面。Oplog中的每個文檔都代表主節點執行的一個操作。MongoDB
的 Replica  Set 架構是通過一個日誌來存儲寫操作的,這個日誌就叫做”oplog”。oplog.rs是一個固
定長度的 capped collection,它存在於”local”數據庫中,用於記錄Replica Sets操作日誌。oplog的
大小是可以通過mongod的參數”--oplogSize”來改變oplog的日誌大小。

Oplog內容樣例:
rs1:PRIMARY> db.oplog.rs.find()  local數據庫中
ts:  某個操作的時間戳   
op:  操作類型,只有1字節代碼,如下:  
i: insert   d: delete   u: update   
ns:  命名空間,也就是操作的collection name   
o: document的內容 

查看master 的oplog元數據信息:
rs1:PRIMARY> db.printReplicationInfo() 
configured oplog size:     配置的oplog文件大小   
log length start to end:   oplog日誌的啓用時間段   
oplog first event time:    產生時間   oplog last 
event time:       最後一個事務日誌的產生時間
now:                             現在的時間  

注意:oplog不記錄查詢操作,oplog存儲在固定集合裏面,所以它們會自動替換舊的操作。
      我們在啓動服務器的時候可以用--oplogSize指定這個大小(MB)
查看slave的同步狀態
rs1:PRIMARY> db.printSlaveReplicationInfo() 
source:     從庫的IP及端口   
syncedTo:   目前的同步情況,延遲了多久等信息 
主從配置信息

主從配置信息
 在local庫中還有一個集合用於記錄主從配置信息system.replset
rs1:PRIMARY> db.system.replset.find() 

管理維護Replica Sets
讀寫分離、
從庫要是進行查詢,分擔主庫的大量的查詢請求
1)先向主庫中插入一條測試數據
2)在從庫進行查詢等操作
3)讓從庫可以讀,分擔主庫的壓力
執行db.getMongo().setSlaveOk(),我們就可查詢從庫了

故障轉移 
副本集比傳統的Master-Slave 有改進的地方就是它可以進
行故障的自動轉移,如果我們停掉複製集中的一個成員,那
麼剩餘成員會再自動選舉出一個成員,做爲主庫。
1)殺掉Server1 20001 端口的MongoDB
2)查看副本集狀態 rs.status() 


重新同步
如果從節點的數據被主節點的數據拉開太遠了,則從節點可能跟不上主節點的步
子,有可能造成同步失敗。解決方法是從新進行同步{"resync":1},也可以在啓動從節點的時候用--autoresync選項讓其自動啓動。建議oplog的大小是剩餘磁盤空間的5%。
複製狀態和本地數據庫
本地數據庫(local)用來存放所有內部複製狀態。其內容不會被複制,從而確保了一個MongoDB服務器只有一個本地數據庫。
管理
診斷
當連接到主節點後,使用db.printReplicationInfo函數
>db.printReplicationInfo(); 這些信息是oplog的大小和oplog中操作的時間範圍。
當連接到從節點時,用db.printSlaveReplicationInfo()函數,能得到從節點的一些信息。
變更oplog的大小
若發現oplog大小不適合,最簡單的方法是停掉主節點,刪除local數據庫的文件,用新的設置(--oplogSize)重新啓動。
$ rm /data/db/local.*
$ ./mongod --master --oplogSize size(新大小)
重啓主節點後,所有的從節點要用--autoresync重啓,否則需要手動同步更新


當在副本集中添加和刪除節點時,需要的操作流程:

1、利用另外一臺secondary機器傳送數據
2、在新機器上中配置文件中添加fastsync=true配置(當需要從有數據中啓動節點,那麼必須加上fastsync=true,否則啓動會報錯,如果是從主庫直接同步所有數據,那麼就不需要添加這個參數)
3、啓動後,在primary節點中添加節點
如:rs.add({_id:2,host:"10.100.100.202:19753",priority:2)  當我們看到變爲secondary後,就一切正常,可以正常提供線上服務了
4、通過rs.conf()命令查看現在的節點信息(需要admin庫密碼權限)
5、rs.remove()刪除節點(rs.remove("10.100.100.202:20001"))
6、添加arbiter節點:rs.addArb("10.0.1.123:20001")  
7、添加延時備份機器:rs.add({_id:4,host:"10.0.1.124:20001",priority:0,slaveDelay:3600});
8、當出現這個錯誤時:replSet error RS102 too stale to catch up,我們可以db.printReplicationInfo() 查看主庫、從庫的oplog信息;
以上爲我切換過程中用到的大部分命令,主要還是replica set管理工具,如果能掌握,那麼升級、擴容、主庫切換都能快速進行!

 





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章