一、副本集搭建过程
本次搭建环境:四台机器。前三台用于正常搭建,最后一台用于副本追加。
虚假IP:
- 10.24.4.1
- 10.24.4.2
- 10.24.4.3
- 10.24.4.4
-
下载mongo安装包并解压
-
10.24.4.1机器, vim mongodb.conf
# 数据存放目录(该目录必须存在) dbpath=/home/ufo/mongodb/data # 日志存放目录(该目录必须存在) logpath=/home/ufo/mongodb/log/mongo.log # 进程文件,方便停止mongodb pidfilepath=/home/ufo/mongodb/var/pid # 以追加方式记录日志 logappend=true # mongo进程所使用的端口。默认为27017 port=8040 # 以后台方式运行进程 fork=true #副本集群 replica set名称 replSet=rs0
-
机器10.24.4.2、10.24.4.3配置如上
-
分别启动mongo服务
mongodb]$ ./bin/mongod -f config/mongo.conf #配置文件路径 config/mongo.conf
-
任意一台机器连接mongo
mongodb]$ ./bin/mongo 10.24.4.1:8040 > rs.initiate() #副本集初始化 > rs.add('10.24.4.2:8040') #添加成员 id:port # 输出:{ "ok" : 1 } > rs.add('10.24.4.3:8040') #添加成员 id:port # 输出:{ "ok" : 1 } rs0:PRIMARY> rs.config() #查看副本集配置信息 rs0:PRIMARY> var config = rs.config() # 修改10.24.4.1机器权重(members[0]相当于第一个机器) # 权重大,会被优先选为主节点。 # 若要使某个节点永远不会变为主节点,设置优先级为0。 rs0:PRIMARY> config.members[0].priority=5 # 输出:5 # 修改10.24.4.3机器权重 rs0:PRIMARY> config.members[2].priority=4 # 输出:4 rs0:PRIMARY> rs.reconfig(config) #更新配置 # 输出:{ "ok" : 1 } rs0:PRIMARY> db.printSlaveReplicationInfo() #打印副本集source(ip :port)
-
测试主节点与副本节点数据是否同步
# 连接mongo主节点,在mongo插入一条数据 rs0:PRIMARY> db.col.insert({ ... title: 'MongoDB 教程', ... description: 'MongoDB 是一个 Nosql 数据库', ... by: '菜鸟教程', ... url: 'http://www.runoob.com', ... tags: ['mongodb', 'database', 'NoSQL'], ... likes: 100 ... }) # 输出:WriteResult({ "nInserted" : 1 }) # mongo 数据获取 rs0:PRIMARY> db.getCollection('col').find({}) { "_id" : ObjectId("5fa450592d83b476a2743b13"), "title" : "MongoDB 教程", "description" : "MongoDB 是一个 Nosql 数据库", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 } # 连接mongo副本节点 mongodb]$ ./bin/mongo 10.24.4.3:8040 # 输出:MongoDB shell version: 2.6.5 # 输出:connecting to: 10.24.4.3:8040/test # 在Secondary上查看客户数据是否已经同步: rs0:SECONDARY> rs.slaveOk() rs0:SECONDARY> db.getCollection('col').find({}) { "_id" : ObjectId("5fa450592d83b476a2743b13"), "title" : "MongoDB 教程", "description" : "MongoDB 是一个 Nosql 数据库", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 } # 注意副本节点是只读的 rs0:SECONDARY> db.col.insert({ ... ... title: 'MongoDB 教程', ... ... description: 'MongoDB 是一个 Nosql 数据库', ... ... by: '菜鸟教程', ... ... url: 'http://www.runoob.com', ... ... tags: ['mongodb', 'database', 'NoSQL'], ... ... likes: 100 ... ... }) # 输出:WriteResult({ "writeError" : { "code" : undefined, "errmsg" : "not master" } })
-
测试主节点关闭服务,是否能成功选取Secondary为Primary
在副本集的环境中,如果所有的Secondary都宕机了,只剩下Primary。最后 Primary会变成Secondary,不能提供服务。# 关闭主节点服务,我这里kill -9 进程号 # 连接副本节点,查看副本集状态 rs0:SECONDARY> rs.status() /* 副本集状态字段解释 "state" 0~10,表示成员的当前状态 stateStr成员状态名。有SECONDARY,PRIMARY,RECOVERING等 #描述该成员是主库(PRIMARY)还是备库(SECONDARY) */ # 查看状态-发现members中权重最大的,也就是10.24.4.1机器(前主节点)为不健康状态。 # "stateStr" : "(not reachable/healthy)", # 查看状态-第二权重大的被选为主节点。 # "stateStr" : "PRIMARY",
-
追加新的地址主机 (10.24.4.4)
# 启动mongo服务 # 在Primary上添加新地址主机 rs.add("10.24.4.4:8040") # 输出:{ "ok" : 1 } rs0:PRIMARY> rs.status() # 查看状态-新加Secondary正在复制数据 # "lastHeartbeatMessage" : "initial sync cloning db: ufo_report", #"stateStr" : "STARTUP2", 初始化同步数据中 #"stateStr" : "SECONDARY",成为副本数据
二、 mongodb 主从、副本集区别
副本集类似于有自动故障恢复功能的一主多从集群。
副本集没有固定的主节点;会在集群中选出一个主节点。当前主节点挂掉后,在剩余的副本节点中选中其他节点为主节点。
1)主节点:数据操作的主要连接点,可读写。
2)副本节点:数据的备份,可以读或从中选举。
3)仲裁节点:具有投票选举作用,不存储任何数据。副本成员同时也可以是仲裁者。