复制集
复制集概念
复制集是一组维护了相同数据集的mongod进程(实例),包含一个Primary(主)节点和多个Secondary(从)节点,以及可选的arbiter(仲裁节点)。
如下图所示:
Primary节点可以读写操作,并把写操作通过oplog文件同步数据给Secondary节点。
Secondary节点只能进行读操作,它会定期轮询Primary节点获取oplog。
除此之外,各个节点之间也保持着心跳,一旦Primary节点宕机,其他具有投票权的节点会立刻选出新的Primary节点,其他Secondary节点会指向新的Primary。这个重新选举的过程大概在30s内完成。
复制集的作用
- 高可用(7*24)
- 增大读请求的容量
- 异地容灾
- 冗余备份
搭建复制集
这个例子的3个节点是搭建在一台机器上,所以创建3个目录来存储3个节点的数据。分别为:
/data/mongodb/note1, /data/mongodb/note2, /data/mongodb/note3
1、创建配置文件
在每个节点的目录下创建mongod.conf
配置文件。
note1节点的配置如下所示:
systemLog:
destination: file
path: /data/mongodb/note1/mongod.log
logAppend: true
storage:
dbPath: /data/mongodb/note1
net:
bindIp: 0.0.0.0
port: 28017
replication:
replSetName: rs0
processManagement:
fork: true
note2节点的配置在note1的基础上改3个属性
path: /data/mongodb/note2/mongod.log
dbpath: /data/mongodb/note2/mongod.log
port: 28018
note3修改
path: /data/mongodb/note3/mongod.log
dbpath: /data/mongodb/note3/mongod.log
port: 28019
2、启动3个节点
mongod -f /data/mongodb/note1/mongod.log
mongod -f /data/mongodb/note2/mongod.log
mongod -f /data/mongodb/note3/mongod.log
3、初始化复制集
启动3个节点后,它们之间还是相互独立的。需要初始化复制集。
先客户端连接到note1节点
mongo --port 28017
初始化复制集
> rs.initiate({
_id:"rs0",
members:[{
_id:0,
host:"localhost:28017"
},{
_id:1,
host:"localhost:28018"
},{
_id:2,
host:"localhost:28019"
}]
})
初始化后,可通过rs.status()
命令查看各个节点的情况,了解哪个是主节点,哪些是从节点。
4、从节点可读
默认情况下,从节点是不可读的。
可连接从节点,并通过下面命令开启读权限
> rs.secondaryOk()