副本集
配置
# 做一个叫做 rs0 的副本集,打开三个终端分别执行
# 当然,规范的做法是向 参考blog 中使用的那种 用配置文件配置,并且用fork模式启动
# 不过这里为了方便,就直接在终端跑了,而且方便看日志
mongod --port 27017 --dbpath "/var/db/db1" --replSet rs0
mongod --port 27018 --dbpath "/var/db/db2" --replSet rs0
mongod --port 27019 --dbpath "/var/db/db3" --replSet rs0
我们需要用用mongo客户端初始化rs,这里有两种选择,
一种,是像下面这样,先一个空参数的 rs.initiate(),让后在掉两次 rs.add(“xxx”)
另一种,像其他参考中的blog 那样,rs.initiate(config), 后面就不用再add 了
# 假定 27017 这台是 master
mongo 127.0.0.1:27017
> rs.initiate()
// 上句执行完, 除打印出正常的返回信息外, 指示符会改变
rs0:PRIMARY>
// 查看 rs 的状态
rs0:PRIMARY> rs.conf() // 同 rs.config()
rs0:PRIMARY> rs.status()
rs0:PRIMARY> rs.add("127.0.0.1:27018")
rs0:PRIMARY> rs.add("127.0.0.1:27019")
验证PRIMARY 写的数据, SECONDARY可以读到
此时 PRIMARY 可以写数据
rs0:PRIMARY> use playground
rs0:PRIMARY> db.number.insert({n:1})
如果连到27018
mongo 127.0.0.1:27017
// 注意,提示符显示 SECONDARY
rs0:SECONDARY> show dbs
admin (empty)
local 2.077GB
playground 0.078GB
// 可以看到新建的数据库
rs0:SECONDARY> use playground
switched to db playground
// 但是没有read 权限
rs0:SECONDARY> db.number.find()
error: { "$err" : "not master and slaveOk=false", "code" : 13435 }
// 需用使用setslaveOk()
rs0:SECONDARY> db.getMongo().setSlaveOk()
rs0:SECONDARY> db.number.find()
{ "_id" : ObjectId("5bbb768358d0430871e84098"), "n" : 1 }
验证 PRIMARY 宕机后,SECONDARY之一会成为PRIMARY
ctrl+c 关掉 PRIMARY 的终端
mongo 连到 SECONDARY 之一中输入 rs.status(),看到有一台已经变到PRIMARY
连到这台PRIMARY , 可以写数据
此时,如果当掉的机器恢复,则恢复的机器为SECONDARY
参考:
mongodb系列之–mongodb 主从配置与说明
mongodb系列之—副本集配置与说明
Mongodb系列之–mongodb的启动与关闭
mongodb系列之–分片的原理与配置
高可用mongodb集群的学习记录(一安装配置MongoDB)
高可用mongodb集群的学习记录(二mongodb主从配置)
高可用mongodb集群的学习记录(三搭建mongodb副本集)
高可用mongodb集群的学习记录(四mongodb分片集群搭建)