一、节点类型
standard:常规节点,它存储一份完整的数据副本,参与选举投票,有可能成为活跃节点。
passive:存储了完整的数据副本,参与投票,不能成为活跃节点。
arbiter:仲裁节点,只参与投票,不接收复制的数据,也不能成为活跃节点。
二、主从复制的集群还是有两点区别的。
配置228启动文件:
配置227启动文件:
配置结束后,重启服务
浏览器从节点关键信息查看:
<1>: 该集群没有特定的主数据库。
<2>: 如果哪个主数据库宕机了,集群中就会推选出一个从属数据库作为主数据库顶上,这就具备了自动故障恢复功能
注:
1、不需要像mysql一样复制完整数据过去,丛库启动会制动复制主库完整数据。
2、丛库自动配置为只读。
3、mongodb第一次启动时间较长,需要注意等待。
4、管理命令多数都要在admin库中执行use admin
三、创建副本集
1. 环境说明:
ip:192.168.1.228 (初始计划设定其为master)
ip:192.168.1.227 (初始计划设定其为slave)
ip:192.168.1.229 (初始计划设定其为arbiter ,即仲裁服务器)
2. 为副本集取名weijh
配置229启动文件:
dbpath=/usr/data/mongodb/data/db
port=27017
logpath=/usr/data/mongodb/log/mongodb.log
logappend=true
journal=true
fork=true
replSet=weijh/192.168.1.228
配置228启动文件:
dbpath=/usr/data/mongodb/data/db
port=27017
logpath=/usr/data/mongodb/log/mongodb.log
logappend=true
journal=true
fork=true
replSet=weijh/192.168.1.229
配置227启动文件:
dbpath=/usr/data/mongodb/data/db
port=27017
logpath=/usr/data/mongodb/log/mongodb.log
logappend=true
journal=true
fork=true
replSet=weijh/192.168.1.228
配置结束后,重启服务
3、 在浏览器打开链接
看到我们需要初始化节点
4、初始化节点
我们连接到其中一个节点上,并使用replSetInitiate命令进行初始化。此命令需要一个配置对象,指定设定的每个成员的名字。
在228节点上进行初始化(随便连接一下哪个服务器都行,不过一定要进入admin集合)
1)执行命令:
出现错误:
2)清除数据库下所有新创建的数据库信息
3)再次执行命令
5、查看状态:
浏览器主节点查看:
09:57:02 [ReplSetHealthPollTask] replSet info 192.168.1.229:27017 is up
09:57:02 [ReplSetHealthPollTask] replSet member 192.168.1.229:27017 STARTUP2
09:57:02 [rs Manager] replSet info electSelf 1
09:57:02 [rs Manager] replSet PRIMARY
09:57:04 [initandlisten] connection accepted from 192.168.1.229:46257 #7
09:57:04 [initandlisten] connection accepted from 192.168.1.229:46258 #8
09:57:04 [conn8] end connection 192.168.1.229:46258
09:57:04 [initandlisten] connection accepted from 192.168.1.229:46259 #9
09:57:04 [conn9] end connection 192.168.1.229:46259
09:57:04 [ReplSetHealthPollTask] replSet member 192.168.1.229:27017 RECOVERING
09:57:04 [conn7] end connection 192.168.1.229:46257
09:57:05 [initandlisten] connection accepted from 192.168.1.229:46260 #10
09:57:06 [ReplSetHealthPollTask] replSet member 192.168.1.229:27017 SECONDARY
09:57:06 [slaveTracking] building new index on { _id: 1 } for local.slaves
浏览器从节点关键信息查看:
09:57:03 [ReplSetHealthPollTask] replSet member 192.168.1.228:27017 PRIMARY
09:57:04 [replica set sync] ******
09:57:04 [replica set sync] replSet initial sync pending
09:57:04 [replica set sync] replSet syncing to: 192.168.1.228:27017
09:57:04 [replica set sync] building new index on { _id: 1 } for local.me
09:57:04 [dur] lsn set 139505
09:57:04 [replica set sync] done for 0 records 0.045secs
09:57:04 [replica set sync] replSet initial sync drop all databases
09:57:04 [replica set sync] dropAllDatabasesExceptLocal 1
09:57:04 [replica set sync] replSet initial sync clone all databases
09:57:04 [replica set sync] replSet initial sync cloning db: admin
09:57:04 [replica set sync] replauthenticate: no user in local.system.users to use for authentication
replSet initial sync query minValid
09:57:04 [replica set sync] replSet initial sync initial oplog application
09:57:04 [replica set sync] replSet initial sync finishing up
09:57:04 [replica set sync] replSet set minValid=52575ae3:1
09:57:04 [replica set sync] building new index on { _id: 1 } for local.replset.minvalid
09:57:04 [replica set sync] done for 0 records 0secs
09:57:04 [replica set sync] replSet initial sync done
09:57:05 [replica set sync] replSet SECONDARY
rs.status()
6、添加仲裁节点
我们在admin集合中使用rs.addArb()追加即可
rs.addArb("192.168.1.227")
查看状态:
该仲裁节点不参与数据的复制,只是参与投票选择主节点而已
在该节点为not reachable/healthy的状态下是起不到投票主节点的作用的。删除227服务琪上的db文件,重启
在该节点为not reachable/healthy的状态下是起不到投票主节点的作用的。删除227服务琪上的db文件,重启
查看状态:
添加仲裁节点成功
7、在主节点添加数据:
从节点查看数据信息
在从节点228上可以同步到主节点的数据信息,但无法查看
8、228主几点宕掉,查看229状态
可以看到229 从secondary变味primary了
9、启动228,但是228不再为primary了,而为secondary了
10、首先这是正常的,因为SECONDARY是不允许读写的, 在写多读少的应用中,使用Replica Sets来实现读写分离。通过在连接时指定或者在主库指定slaveOk,由Secondary来分担读的压力,Primary只承担写操作。对于replica set 中的secondary 节点默认是不可读的:
weijh:SECONDARY> use testCp
switched to db testCp
weijh:SECONDARY> show collections
Fri Oct 11 10:09:36 uncaught exception: error: { "$err" : "not master and slaveok=false", "code" : 13435 }
若需要SECONDARY可以执行读的操作,在SECONDARY执行slaveok方法
执行查询操作测试:
weijh:SECONDARY> db.getMongo()
connection to 127.0.0.1
weijh:SECONDARY> db.getMongo().setSlaveOk()
not master and slaveok=false
执行查询操作测试:
参考资料网页: