一、mongodb复制
1、mongodb复制简介
mongodb复制的实现有两种类型:
master/slave:和mysql主从复制非常近似,已经很少用了,
replica set:复制集或副本集,能自动实现故障转移
副本集
服务于同一数据集的一组mongodb实例
一个复制集只能有一个主节点,能读写,其它从节点只能读
主节点将数据修改操作保存至oplog(操作日志)中,各从节点通过oplog来复制数据并应用在本地
mongodb的复制至少需要两个节点,一般为3个节点或更多节点,即使只需要2个节点就够用时也应该使用令一个节点当做仲裁设备,可以不保存数据(如果只有一主一从的话,故障时不知道到底是主故障了还是从故障了)
副本集中各节点之间不断通过心跳信息传递来判断健康状态,默认心跳信息每隔2s传递一次,一旦和主节点与其它节点中断通信超过10s,副本集就会触发重新选举,选举一个从节点成为新的主节点
副本集特征:
奇数个节点的集群,应至少为3个节点,
任何节点可作为主节点,且只能有一个主节点
所有写入操作都在主节点上
自动故障转移,自动恢复
副本集中节点分类:
0优先级的节点:
冷备节点,不会被选举为主节点,但能参与选举过程,并持有数据集,能被客户端访问;常用于异地容灾
被隐藏的从节点:
首先得是0优先级的节点,且对客户端不可见
延迟复制的节点:
首先得是0优先级的节点,且复制时间落后于主节点一个固定时长
arbiter:
仲裁节点,不持有数据集
2、mongodb副本集
hearbeat:
实现心跳信息传递,并触发选举
oplog:
保存数据修改操作,是实现复制的基础工具
大小固定的文件,存储在local数据库中,复制集中各节点都有oplog,但只有主节点才会写oplog,并同步给从节点,
oplog具有幂等性,多次运行,结果不变
因为oplog的大小是固定的,不可能保持主节点的所有操作,所以从节点添加进复制集会先初始化:从节点先从主节点的数据集复制数据,并跟上主节点,然后才从oplog复制数据
1个新从节点加入复制集合后的操作过程:
初始同步(initial sync)
回滚后追赶(post-rollback catch-up)
切分块迁移(sharding chunk migrations)
local数据库:
local数据库本身不参与复制(不会复制到别的节点去)
存放了副本集的所有元数据和oplog;用于存储oplog的是一个名为oplog.rs的collection(该节点加入了副本集后第一次启动时自动创建);
oplog.rs的大小依赖于os及文件系统,默认为磁盘空间的5%(此值少于1g时为1g);但可以自定义其大小:使用oplogsize=n单位为m
3、mongo的数据同步类型
1)初始同步
从节点没有任何数据时,但主节点已有数据
从节点丢失副本复制历史时
初始同步的步骤:
a、克隆所有数据库
b、应用数据集的所有改变:复制oplog并应用于本地
c、为所有collection构建索引
2)复制
二、副本集的配置
1、环境
node2: centos6.5 x86_64
node5: centos6.5 x86_64
node7: centos6.5 x86_64
2、配置过程
应先关闭mongod
在配置文件中添加一下选项:
replset=testset # 副本集的名称,表示作为副本集中的节点
replindexpprefetch=id_only # 启用副本集索引预取(非必须),只在从节点有效
添加主机进副本集:
该主机需要监听在能副本集中其它节点通信的套接字上
在配置文件中设置了副本集的名称要和当前副本集一样
连接从节点进行操作:
让副本集中主节点“下台”:触发选举
查看副本集oplog的信息:
3、选举
副本集的重新选举的影响条件:
心跳信息
优先级
默认为1,0优先级不能触发选举过程,高优先级的节点能触发选举让自己“上台”
optime
成员节点最近一次应用于本地oplog的条目的时间戳
网络连接
副本集出现分区时,“多数方“才能选举出主节点
网络分区
同上
选举机制:
触发选举的事件:
新副本集初始化时
从节点联系不到主节点时
主节点“下台”时
主节点收到stepdown()命令时
某从节点有更高的优先级且已经满足成主节点其它所有条件
主节点无法联系到副本集的“多数方”
4、修改副本集节点的配置
先使用一个变量保存当前副本集的配置:
设置节点的优先级:需要在主节点配置
添加仲裁节点:
在添加进副本集时,使用rs.addarb("hostportstr")
副本集中其它命令:
rs.freeze(secs):让节点在指定时间内不能被选举为主节点
rs.printslavereplicationinfo():查看从节点是否跟上了主节点,较低版本没有这个命令