三台机器: 172.7.15.111(primary) 172.7.15.112(secondary) 172.7.15.101(secondary)
编辑三台机器的配置文件,增加:
replication:
##oplog大小
oplogSizeMB: 20
##复制集名称
replSetName: aminglinux
分别重启后,连接primary机器
mongo
>use admin
>config={_id:"aminglinux",members:[{_id:0,host:"192.168.10.10:27017"},{_id:1,host:"192.168.10.11:27017"},{_id:2,host:"192.168.10.12:27017"}]}
>rs.initiate(config) //如果初始化报错,需要注释掉配置文件的 "bind_ip = 127.0.0.1"
>rs.add("172.7.15.112")
>rs.add("172.7.15.101")
查看状态:
>rs.status()
{
"set" : "aminglinux",
"date" : ISODate("2015-10-19T06:32:09.200Z"),
"myState" : 1,
"members" : [
{
"_id" : 0,
"name" : "localhost.localdomain:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 1381,
"optime" : Timestamp(1445235074, 1),
"optimeDate" : ISODate("2015-10-19T06:11:14Z"),
"electionTime" : Timestamp(1445234949, 1),
"electionDate" : ISODate("2015-10-19T06:09:09Z"),
"configVersion" : 3,
"self" : true
},
{
"_id" : 1,
"name" : "172.7.15.112:27017",
"health" : 1,
"state" : 0,
"stateStr" : "STARTUP",
"uptime" : 1268,
"optime" : Timestamp(0, 0),
"optimeDate" : ISODate("1970-01-01T00:00:00Z"),
"lastHeartbeat" : ISODate("2015-10-19T06:32:07.764Z"),
"lastHeartbeatRecv" : ISODate("1970-01-01T00:00:00Z"),
"pingMs" : 1,
"configVersion" : -2
},
{
"_id" : 2,
"name" : "172.7.15.101:27017",
"health" : 1,
"state" : 0,
"stateStr" : "STARTUP",
"uptime" : 1255,
"optime" : Timestamp(0, 0),
"optimeDate" : ISODate("1970-01-01T00:00:00Z"),
"lastHeartbeat" : ISODate("2015-10-19T06:32:07.930Z"),
"lastHeartbeatRecv" : ISODate("1970-01-01T00:00:00Z"),
"pingMs" : 1,
"configVersion" : -2
}
],
"ok" : 1
}
这个状态是不对的,正常从节点上应该是SECONDARY,而不是STARTUP
解决该问题,需要在主节点执行
> var config={_id:"aminglinux",members:[{_id:0,host:"172.7.15.111:27017"},{_id:1,host:"172.7.15.112:27017"},{_id:2,host:"172.7.15.101:27017"}]}
>rs.reconfig(config)
再次执行
>rs.status()
发现状态好了
测试:
主上建库,建集合
>use mydb
>db.acc.insert({AccountID:1,UserName:"123",password:"123456"})
>show tbs
>show tables
从上测试
>show dbs //也出现mydb库了。
//报错的话,需要执行rs.slaveOk()
在生成环境中,我们需要找一个从节点作为自动切换节点,当主节点宕机后,它会自动接管主的服务,成为主节点,当主恢复后还会自动切换回原来的身份。所以,我们应该这样配置:
cfg = rs.conf()
cfg.members[0].priority = 3
cfg.members[1].priority = 2
cfg.members[2].priority = 1
rs.reconfig(cfg)这样的话,第二个节点将会成为候选主节点。
iptables -I INPUT -p tcp --dport 27017 -j DROP 禁掉主
6. mongodb 备份与恢复
1) 备份指定库
mongodump -h ip -d dbname -o dir //-h后面跟服务器ip,-d后面跟database名字,不加则备份所有库,-o后面指定备份到哪里
2)备份所有库
mongodump -h ip -o dir
3) 备份指定集合
mongodump -d mydb -c testc -o /tmp/testc //用-c指定集合名字
4)恢复所有库
mongorestore --drop dir/ //其中dir是备份所有库的目录名字,其中--drop可选,意思是当恢复之前先把之前的数据删除,不建议使用
5) 恢复指定库
mongorestore -d mydb dir/ //-d跟要恢复的库名字,dir就是该库备份时所在的目录
6)恢复集合
mongorestore -d mydb -c testc dir/mydb/testc.bson // -c后面跟要恢复的集合名字,dir是备份mydb库时生成文件所在路径,这里需要跟一个bson文件的路径
7)导出集合为json文件
mongoexport -d mydb -c testc -o /tmp/testc.json
8)导入集合
mongoimport -d mydb -c testc --file /tmp/testc.json