一、复制集特性
- 数据一致性
- 主是唯一的 没有MySql那样的双主结构
- 大多数原则 集群存活节点数小于等于1/2时,只可读,不可写
- 从库无法写入 MySql从库的readonly对具有super权限的账户无效
- 自动容灾
二、快速搭建复制集
(一)编写配置文件
新建三个配置文件:28001.conf、28002.conf、28003.conf,以28001.conf为例,另外两个配置文件把对应的端口号及其相关改动即可:
#端口
port=28001
#绑定ip
bind_ip=192.168.10.130
#采用指定引擎为mmapv1(这项必须有,否则会报错)
storageEngine=mmapv1
#日志存储路径(logs路径默认没有,要自己创建)
logpath=/usr/local/mongodb/logs/28001.log
#数据存储路径(data/db/28001/路径默认没有,要自己创建)
dbpath=/usr/local/mongodb/data/db/28001/
#开启日志追加(默认是覆盖)
logappend=true
#指定pid文件目录(data/db/28001/28001.pid文件默认没有,要自己创建)
pidfilepath=/usr/local/mongodb/data/db/28001/28001.pid
#后台运行
fork=true
#同步日志大小
oplogSize=512
#持久化选项
journal=true
#复制集名称(同一复制集,要保持一致)
replSet=IMOOC
(二)启动实例
cd /usr/local/mongodb/bin
#启动三个实例
./mongod -f ../conf/28001.conf
./mongod -f ../conf/28002.conf
./mongod -f ../conf/28003.conf
(三)复制集初始化
1、连接进入28001
实例的admin
库
./mongo 192.168.10.130:28001/admin
2、书写配置项
config = {
_id:"IMOOC",
members:[
{_id:0,host:"192.168.10.130:28001"},
{_id:1,host:"192.168.10.130:28002"},
{_id:2,host:"192.168.10.130:28003","arbiterOnly":true}
]
}
备注:我们可以在写完该配置项以后,继续更改这些配置项。比如28003实例,我们需要将其设置为选举节点
(PS:选举节点不存储数据),则可以通过如下步骤设置:
#"arbiterOnly":true 设置该节点为选举节点
config.members[2].={_id:2,host:"192.168.10.130:28003","arbiterOnly":true}
3、初始化
rs.initiate(config)
4、查看复制集状态
rs.status()
通过该命令,即可查看整个复制集中各个节点的属性,包括:主从节点等
5、验证复制集同步
#在主节点中
use imooc
db.imooc.insert("name":"imooc")
#在从节点中,验证数据是否同步过来
db.imooc.find()
#此时报错如下
Error: error:{
"ok":0,
"errmsg":"not master and slaveOk=false",
"code":13435
}
#出现此错误时,我们需要在从节点中手动开启从节点
rs.slaveOk(true)
#再次验证,即可发现主节点的数据已同步过来
db.imooc.find()
备注:
出现 “not master and slaveOk=false” 错误时,需要手动设置 rs.slaveOk(true)。
(四)复制集成员介绍
1、按是否存放数据区分为:
- 数据节点:存放数据(实体物理文件 *.ns *.0等)的节点,包括主节点和从节点
- 投票节点:不存放数据,只作选举和充当复制集节点
2、按功能区分
- 主节点:提供读写服务的节点(只有主节点可以写数据)
- 从节点:提供读服务的节点
- 隐藏节点:多程序不可见的节点
- 延时节点:延时复制节点
- ‘投票节点’:具有投票权的节点,不是 arbiter
- 投票节点:Arbiter节点,无数据,仅作选举和充当复制集节点,也称它为选举节点
(五)复制集配置文件参数
就是我们在初始化之前所设置的 config(参见上面的 2、书写配置项
)
复制集成员配置文件参数:
1.priority 表示当前成员是否有资格成为一个主节点,默认是1 范围:0~1000 。0 永远没有资格提升为主节点;
2.arbiterOnly默认为true
3.host表示一段字符串"192.168.10.130:28001"
4.hidden隐藏节点,权重为0,不接受读请求,有true|false(0|1)
用途:生产环境中上锁备份,不会堵塞其他节点的读。
5.votes投票权(0|1),当节点数多余7个的时候。其他的节点votes都要设置为0.
在生产环境,当节点真的大于7个的时候,会选择分片来解决。
6.slaveDelay 延迟节点的作用,例如slaveDelay=3600秒
生产中如果有dba或者开发在master误操作删除了,延迟节点就可以做别分恢复来用。
7.buildIndexes布尔值,buildIndex=true|false,0|1,master上建立了索引,其他复制节点是否也同步建立索引。
(六)常用命令
-
查看配置
rs.conf() -
把当前主节点降级为从节点
rs.setpDown(10) -
之后分别查看连接主从节点状态
rs.status() -
查看节点状态
rs.isMaster()
三、复制集同步机制
MongoDB进行主从同步复制,靠的是 oplog (operation log),记录的全部是写操作。
oplog:
作用: 记录主节点的写入操作,充当复制源
特点:封顶表 Capped collection 滚动覆盖写入
默认大小:64位Linux,Windows操作系统下为当前分区可用空间的5%
四、复制集故障处理
(一)复制集健康
心跳 heartBeat
频率 次/2s
作用:状态检查(主节点不可达,从节点不可达)
(二)选举原则
只有存活的节点数量占总数量的比率大于1/2,才会触发选举(这是能选举的先决条件)。
这里的存活节点,不仅包括数据节点,还包括 Arbiter节点
一旦存货比率小于等于1/2,主节点就会降级为从节点,当前复制集中暂时会没有主节点,所有的节点只能读,不能写!
奇数个节点利用率比偶数个节点利用率更高。
(三)选举触发的时机
1、主节点服务器宕机;
2、主节点服务进程挂了;
3、主节点网络中断;
4、维护时,手动挂主节点:rs.stepDown(600),这里的 600 代表,600s内,该节点不可能被选举为主节点。