1. 配置三個節點的配置文件(/etc/28001.conf)前端
28002.confmongodb
#bind_ip=192.168.20.144數據庫
port=28001json
logpath=/data/db/mongodb_log/28001.log服務器
logappend=trueapp
pidfilepath=/data/db/mongodb_data28001/28001.pidide
oplogSize=500測試
dbpath=/data/db/mongodb_data28001ui
replSet=imoocspa
fork=true
28002.conf
#bind_ip=192.168.20.144
port=28002
logpath=/data/db/mongodb_log/28002.log
logappend=true
pidfilepath=/data/db/mongodb_data28002/28002.pid
oplogSize=500
dbpath=/data/db/28002
replSet=imooc
fork=true
28003.conf
#bind_ip=192.168.20.144
port=28003
logpath=/data/db/mongodb_log/28003.log
logappend=true
pidfilepath=/data/db/mongodb_data28003/28003.pid
oplogSize=500
dbpath=/data/db/28003
replSet=imooc
fork=true
2. 使用配置文件啓動mongod服務
/usr/local/mongodb/bin/mongod -f /usr/local/mongodb/conf/28001.conf
/usr/local/mongodb/bin/mongod -f /usr/local/mongodb/conf/28002.conf
/usr/local/mongodb/bin/mongod -f /usr/local/mongodb/conf/28003.conf
/usr/local/mongodb/bin/mongo 127.0.0.1:28001/admin
4. 配置複製集節點配置文件
config={_id : "imooc",members : [{_id : 1, host : "127.0.0.1:28001"},{_id : 2, host : "127.0.0.1:28002"},{_id : 3, host : "127.0.0.1:28003"}]}
5. 查看節點成員
config.members
6. 設置3節點爲仲裁節點
config.members[3] ={"_id":3,"host":"127.0.0.1:28003",arbiterOnly:true}
或在主節點中輸入:
7. 初始化副本集
rs.initiate(config) (若是初始化一直報已經初始化過,須要將數據備份後,從新建立主節點。)
8. 從新加載config參數(每次修改config以後都要reconfig一次,但reconfig會使複製集的鏈接短暫斷開,要避免在生產環境中隨便執行,須要維護時間窗口才可執行)
rs.reconfig(cnf,{force:true})
(運行此命令必須在primary節點,若是不是顯示primary,多是other,則須要加上force的參數)
9. 查看複製集狀態
rs.status()
10. mongodb的前端引用程序是經過isMaster命令來區分主從節點的(隱藏節點能夠經過rs.status()看到其信息,而rs.isMaster是無法看到的)
rs.isMaster()
維護:
添加副本,在登陸到主節點下輸入:
rs.add("ip:port")
刪除副本
rs.remove("ip:port")
(前提是這個ip:port必須是使用了同一個relpSet名稱的mongodb實例便可)
導入原有數據後,導入命令
mongorestore -h 127.0.0.1:12345 -d syt --directoryperdb /mnt/mongo_data/
其中/mnt/mongo_data爲要導入的json文件,後發現從節點都變成recovering狀態。
問題緣由
出現這個問題的緣由主要是secondary節點同步oplog的速度追不上primary幾點的速度,形成一直處於recovering狀態。
解決辦法:
首先停掉從節點mongod進程,而後刪除目錄(rs)下面全部的數據,而後重啓mongod進程,這裏有一點須要注意,若是有arbiter的mongod進程也須要停掉,啓動的時候,先啓動replSet的mongod進程,再啓動arbiter的mongod進程,啓動以後,會自動由recovering狀態切換爲startup2狀態,最後切換爲secondary狀態
第二種辦法就是先將recovering節點下的data目錄刪除,再將primary裏的data都拷貝到該節點下,再重啓就行了!操做前,務必要中止全部的mongodb數據庫!
能夠看到,在從節點使用show tables 報錯,顯示「此節點非主節點,從節點的ok狀態是失敗的」。若是須要在從節點讀取數據的話,須要將slave作設置:
rs.slaveOk(true)
再執行show tables就能夠成功了。
模擬宕機:
在主節點執行:db.shutdownServer()
出現報錯"errmsg" : "shutdown must run from localhost when running db without auth",
此報錯說明在沒有開啓驗證的狀況下須要到localhost下執行,若是啓動配置文件裏指定了bin_ip,則只能經過bin_ip去執行,這裏咱們無法登陸localhost執行,只能經過kill的方式。
經過查看ps –ef|grep ****查找到對應進程號
使用kill -2 **** (不到萬不得已不建議使用kill來關閉進程實例,即便是要使用,也要用較溫和的方式kill -2 {SIGINT} 的方式來關閉, kill -2 會把實例中全部隊列的進程都關閉後再關閉實例)
關閉以後測試:
查看原先主節點,敲enter已經出現報錯
查看原先從節點,在兩個從節點中敲enter,可發現有一個節點已經變爲PRIMARY
經過show log rs能夠看到節點的切換狀況。
MongoDB Enterprise imooc:PRIMARY> show log rs
2017-10-30T01:53:15.617-0700 I REPL [replExecDBWorker-0] New replica set config in use: { _id: "imooc", version: 1, protocolVersion: 1, members: [ { _id: 1, host: "127.0.0.1:28001", arbiterOnly: false, buildIndexes: true, hidden: false, priority: 1.0, tags: {}, slaveDelay: 0, votes: 1 }, { _id: 2, host: "127.0.0.1:28002", arbiterOnly: false, buildIndexes: true, hidden: false, priority: 1.0, tags: {}, slaveDelay: 0, votes: 1 }, { _id: 3, host: "127.0.0.1:28003", arbiterOnly: false, buildIndexes: true, h
2017-10-30T01:53:15.617-0700 I REPL [replExecDBWorker-0] transition to STARTUP2
2017-10-30T01:53:15.618-0700 I REPL [rsSync] transition to RECOVERING
2017-10-30T01:53:15.619-0700 I REPL [rsSync] transition to SECONDARY
2017-10-30T01:53:15.621-0700 I REPL [ReplicationExecutor] Member 127.0.0.1:28001 is now in state SECONDARY
2017-10-30T01:53:20.624-0700 I REPL [ReplicationExecutor] Member 127.0.0.1:28003 is now in state SECONDARY
2017-10-30T01:53:25.625-0700 I REPL [ReplicationExecutor] Member 127.0.0.1:28001 is now in state PRIMARY
2017-10-30T02:13:53.329-0700 I REPL [rsBackgroundSync] could not find member to sync from
2017-10-30T02:14:01.816-0700 I REPL [ReplicationExecutor] transition to PRIMARY
2017-10-30T02:14:03.033-0700 I REPL [rsSync] transition to primary complete; database writes are now permitted
(待驗證)
若是出現有一個節點找不到oplog(經過日誌看出),可經過將主節點的oplog 複製到從節點上
1. 備份出來:
./mongodump --port 28011 -d local -c oplog.rs -o /opt/backup/0706local/
2. 恢復到另一臺單節點MONGODB服務器
./mongorestore --port 28011 -d temp_local -c shard1_oplog --dir /opt/backup/0706local/local/oplog.rs.bson
若是恢復時出現報錯Failed: error connecting to db server: no reachable servers
…………….
…………..
若是出現有一個節點有問題,刪除monogd.lock, 在啓動時加上—repair,再啓動仍是啓動不了,並且只是做爲一個不存儲數據的仲裁節點的話,最簡單粗暴的方法是經過將節點下的data數據都刪除,而後再重啓,則可啓動成功。