复制集的概念、特点、优势、搭建:
传统主从结构Master/Slave演变而来的-----》复制集
概念
复制集是由一组拥有 【相同数据集】 的mongod实例所组成的集群
两类节点:
(1)数据节点:存储数据,可以充当主从节点
(2)投票节点:负责选举,不存储数据,不能充当主从节点
一个复制集只能有一个主节点,主节点接收所有来自客户端的写操作,读操作需要配置,因为数据复制有延迟,看业务,主节点通过将所有的数据集的变动记录到【oplog(记录写操作,不记录读操作)】中,从节点通过主节点的oplog来进行复制操作。
特点
数据一致性
1、主是唯一的但不一定是固定的,没有mysql那样的双主结构
2、大多数原则 ,当集群存活节点【复制集中健康节点】 小于等于1/2【总数】 时集群不可写,只可读,当大于时才会选举
【是否能选举出新的主节点是由当前复制集成员存活数量决定的,并不一定需要投票节点】
【复制集的服务器挂掉一半就没法选举了,将全部降为从节点】
3、从库无法写入,能写的只有一个【writenetwork大致这么读】线程
4、自动容灾
优势
提供数据冗余的同时增加了高可用,在高级集群结构sharding(分片)中扮演着不可或缺的角色
搭建
(1)mongodb的安装请查看另一文章,这里在原有基础稍微改动,但大致不变,在mongodb目录下新建三个目录:data、log、conf
(2)在conf目录下新建28001.conf,28002.conf、28003.conf写入如下配置文件
port = 28001
bind_ip = 192.168.3.12
logpath = /usr/local/mongodb/log/28001.log
logappend = true
dbpath = /usr/local/mongodb/data/28001/
fork = true
pidfilepath = /usr/local/mongodb/data/28001/28001.pid
oplogSize = 2 * 1024
replSet = lenovo
port = 28002
bind_ip = 192.168.3.12
logpath = /usr/local/mongodb/log/28002.log
logappend = true
dbpath = /usr/local/mongodb/data/28002/
fork = true
pidfilepath = /usr/local/mongodb/data/28002/28002.pid
oplogSize = 2 * 1024
replSet = lenovo
port = 28003
bind_ip = 192.168.3.12
logpath = /usr/local/mongodb/log/28003.log
logappend = true
dbpath = /usr/local/mongodb/data/28003/
fork = true
pidfilepath = /usr/local/mongodb/data/28003/28003.pid
oplogSize = 2 * 1024
replSet = lenovo
(3)启动实例
/usr/local/mongodb/bin/mongod -f /usr/local/mongodb/conf/28001.conf
/usr/local/mongodb/bin/mongod -f /usr/local/mongodb/conf/28002.conf
/usr/local/mongodb/bin/mongod -f /usr/local/mongodb/conf/28003.conf
键入指令查看 ps -ef | grep mongo
(4)配置复制集的初始化文件
登录mongodb shell
/usr/local/mongodb/bin/mongo 192.168.3.12:28001/admin 【回车】
config = {
_id:"lenovo_sws",
members:[
{_id:0,host:"192.168.3.12:28001"},
{_id:1,host:"192.168.3.12:28002"},
{_id:2,host:"192.168.3.12:28003"}
]
}【回车】
修改端口为28003的实例为arbiter节点
config.members[2] = {"_id":2,"host":"192.168.3.12","arbiterOnly":true}
最后初始化: rs.initiate(config)
返回: { "ok" : 1 }
此时你可以按下回车,左下的角标已经变成了 lenovo_sws:SECONDARY>【复制集的名称 + 冒号 +当前结点的状态 来表示】
查看状态:rs.status()
这就说明复制集已经搭建好了,【一主一从一仲裁模式】,下一步验证复制集同步