副本mongodb
實例1 m1.config數組
port=27017 #端口服務器
replSet=spock #副本名稱隨便取app
dbpath=/usr/local/mongodb/fuben/db1 #數據存放目錄測試
logpath=/usr/local/mongodb/fuben/log1/mongodb.log #日誌目錄ui
實例2 m2.config日誌
port=27027code
replSet=spock索引
dbpath=/usr/local/mongodb/fuben/db2進程
logpath=/usr/local/mongodb/fuben/log2/mongodb.log
實例3 m3.config
port=27037
replSet=spock
dbpath=/usr/local/mongodb/fuben/db3
logpath=/usr/local/mongodb/fuben/log3/mongodb.log
啓動3個實例
/usr/local/mongodb/bin/mongod -f m*.config
鏈接任意一個實例
mongo --port 27017
配置變量
config ={
'_id':'spock',
'members':[
{'_id':0,'host':'localhost:27017'},
{'_id':1,'host':'localhost:27027'},
{'_id':2,'host':'localhost:27037'}
]
}
導入配置
rs.initiate(config) 建立副本集成功
向集合中插入數據
db.user.insert({'name':'andi','age':22,'sex':'M'})
連接其餘實例查看數據同步狀況
db.user.find()
Error: error: { "$err" : "not master and slaveOk=false", "code" : 13435 } 備份庫默認不能讀
設置能夠查看數據
db.setSlaveOk()
db.user.find() 【成功】
副本集管理
db.isMaster() 查看是否爲主等其餘信息
rs.status() 查看副本集狀態
{
"set" : "spock",
"date" : ISODate("2017-06-16T03:08:08.452Z"),
"myState" : 1,
"members" : [
{
"_id" : 1,
"name" : "localhost:27027",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 156845,#其餘程序能夠鏈接到此節點的當即時間(秒)
"optime" : Timestamp(1497425785, 2),
"optimeDate" : ISODate("2017-06-14T07:36:25Z"),#每一個成員的oplog中最後一個操做時間
"lastHeartbeat" : ISODate("2017-06-16T03:08:08.148Z"),#當期服務器最後一次收到其餘服務器的心跳
"lastHeartbeatRecv" : ISODate("2017-06-16T03:08:08.146Z"),
"pingMs" : 0,#心跳從當期服務器到達某個服務器的平均時間
"syncingTo" : "localhost:27017",#複製源
"configVersion" : 1
},
],
"ok" : 1
}
rs.config() 查看配置信息
{
"_id" : "spock", #副本集名稱
"version" : 1, #版本號,沒修改一次增長
"members" : [ #成員信息數組(添加和修改時能夠指定下列選項)
{
"_id" : 0, #成員ID
"host" : "localhost:27017", #成員地址
"arbiterOnly" : false, #是不是仲裁者(仲裁者就是起鬨的,沒有數據)
"buildIndexes" : true, #副本上邊是否建立索引
"hidden" : false, #是否隱藏成員(只有優先級爲0的才能夠設置成隱藏)客戶端沒法將請求發送給他
"priority" : 1, #被選爲master的優先級默認爲1,0不參與競選
"tags" : {
},
"slaveDelay" : 0, #延遲複製時間(秒)(優先級爲0才能夠延遲)
"votes" : 1#投票數量(不要隨便改)
},
....
],
"settings" : {
"chainingAllowed" : true,
"heartbeatTimeoutSecs" : 10,
"getLastErrorModes" : {
},
"getLastErrorDefaults" : {
"w" : 1,
"wtimeout" : 0
}
}
}
修改配置信息
config = rs.config()
config.members[1].host = '127.0.0.1:27057'
rs.reconfig(config)
rs.add('localhost:27087') 向副本集中添加一個新的副本集
rs.remove('localhost:27087')
強制從新設置
rs.reconfig( config, {" force" : true})
將主節點降級爲備份節點(降級時間100秒,100秒後若是沒有主節點,能夠從新申請競選)
rs.stepDown(second)
強制備份節點在一段時間內始終處於備份狀態(不參與競選)
rs.freeze( 10000)
#查看複製源
db.adminCommand({replSetGetStatus:1})['syncingTo']
#修改複製源
db.adminCommand({'replSetSyncFrom':'localhost:27027'})
#強制其餘成員必須從主節點複製數據
var config = rs.config()
config.settings = config.settings || {}
config.settings.allowChaining = false
rs.reconfig(config)
#增長oplog大小
1,若是當前服務器是主節點,讓它退位,以便讓其餘成員的數據可以儘快更新到與它一致。
2,關閉當前服務器。
3,將當前服務器以單機模式啓動。
4,臨時將oplog中的最後一條insert操做保存到其餘集合中
uselocal
//op:"i"用於查找最後一條Insert操做
varcursor=db.oplog.rs.find({"op":"i"})
varlastInsert=cursor.sort({"$natural":-1}).limit(1).next()
db.tempLastOp.save(lastInsert)
//確保保存成功,這很是重要!
db.tempLastOp.findOne()
5,刪除當期oplog
db.oplog.rs.drop()
6,建立一個新的oplog;
db.createCollection('oplog.rs',{'capped':true,'size':10000})
7,將最後一條操做記錄歇會oplog
var temp = db.tempLastOp.findOne()
db.oplog.rs.insert(temp)
db.oplog.rs.findOne()
8,最後,當期服務器做爲副本啓動
從延遲備份節點恢復數據
方法一
1,關閉全部其餘成員。
2,刪除其餘成員數據目錄中的全部數據
3,重啓全部成員,而後他們會自動從延遲庫複製數據
方法二
1,關閉說有成員,包括延遲備份節點
2,刪除其餘成員(除了延遲備份節點)的數據目錄
3,將延遲備份節點數據文件複製到其餘服務器
4,重啓全部成員
分片
用途
增長可用RAM
增長可用磁盤空間
減小單機負載
處理單機沒法承受的吞吐量
配置服務器
配置服務器至關於集羣的大腦,保存着集羣和分片的元數據,即各分片包含哪些數據的信息。
mm.config內容
logpath=/data/mongo_test/fuben/logm/mongodb.log
配置服務器端口爲:27019 (檢查是否被佔用)
數據默認存放地址/data/configdb 手動建立
開啓配置服務器
mongod --configsvr -f/usr/local/mongodb/db/mm.comfig
--configsvr 指定mongodb爲新配置服務器
開啓mongos 進程 默認監聽27017端口
mongos --configdb localhost:27019,...,... --logpath logmt/mongodb.log
--configdb 指定配置服務器,能夠指定多個,用,分開
將副本轉換爲分片
連接mongos服務
mongo admin --port 27017
將以有副本添加到分片
sh.addShard('spock/localhost:27027,localhost:27037')
向以有分片中添加分片(注意副本名不能重複)
sh.addShard('abc/localhost:28017')
測試
在mongos連接中想test.goods集合中插入100條數據
for(var i = 0;i<100;i++){
db.goods.insert({'name':'goods'+i,'addtime':new Date()})
}
默認狀況下數據會插入到第一個分片副本所在的服務器中,
然後添加的副本沒有數據。
添加分片數據
再goods表上建立索引
db.goods.ensureIndex({'name':1})
按索引建分片
sh.shardCollection('test.goods',{'name':1})
查看分片狀態
sh.status()