副本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()