之前创建副本集的使用使用了大量的rs的命令,也知道了很多副本集的节点类型。rs.status()可以查看节点的配置信息,比如节点的角色,节点的更多细的配置信息等。并且我们现在项目上生产环境也是使用的副本集模式。索引更需要详细的了解副本集的特性。
一、副本集
1、主节点(primary)
索引客户端的写请求都只能由主节点处理,并且将所有的写操作记录到主节点的oplog(一个定长集合,后续会专门进行研究)。而MongoDB的整个副本集集群节点默认都是可以接收读请求的,当然也可以像mysql主从读写分离一样,将读和写操作进行分离。副节点(Secondary)将拷贝主节点的oplog信息并在自己本地执行,以更改自己数据库的数据。如下图:
当主节点不可用时,可以进行投票选举新的主节点,选举的时候需要在Secondary配置的时候拥有投票的权利,并且需要参考权重等。但是设置副本集的时候需要大多数同一,一般情况下为选举节点的半数+1同意,以防止脑裂的问题。如下图:
2、节点特性
1)、优先级priority
优先级高的时选举为主节点的可能性非常高,比如上一节创建副本集的时候,priority最高的就成为了主节点。当优先级设置为0的时候,该节点永远也不能成为主节点,并且不能参加主节点的选举。这个特性在很多情况下是非常有用的,比如集群的投票节点已经非常多了(投票的时候通信是非常频繁的),或者由于集群节点间的配置是不通的,等等。
2)、隐藏节点Hidden
配置节点的时候可以将节点设置为隐藏节点,可以增加hidden属性为true。隐藏节点是对链接的客户端的隐藏,所以不会有任何的流量打到隐藏节点上。隐藏节点的priority为0,不能成为主节点,但是可以投票选举的主节点。隐藏节点主要用于数据的备份等。
3)、延迟节点Delayed
延迟节点是可以执行特定的时候后才开始从oplog中复制数据。主要用于数据的备份、数据在过去一定时间段内的快照、或者MongoDB副本集升级的时候。设置延迟节点的时候,延迟节点一定要主要oplog的大小否则可能会丢数据。延迟节点一定要满足该节点为,priority为0;是隐藏节点;并且设置延迟时间,单位为秒。如下:
{
"_id" : <num>,
"host" : <hostname:port>,
"priority" : 0,
"slaveDelay" : <seconds>,
"hidden" : true
}
3、仲裁节点(Arbiter)
仲裁节点不存储数据,也不能成为主节点。但是仲裁者不仅有仲裁的角色,还具体投票的权利。但是在3.6版本后,仲裁者会将priority设置为0,当节点升级到3.6也会修改为0.配置时,只需要添加属性"arbiterOnly":true
二、oplog
oplog是一个特殊的定长集合,保持对存储在数据库中的数据的所有操作的滚动记录。但是从4.0版本后,oplog将超越设置定长的数据的大小,防止数据的严重丢失。所有成员都有oplog的副本local.oplog.rs
。MongoDB为了方便复制数据,允许所以成员发送心跳到其他所有的节点,也运行从其他非主节点获取oplog条目。并且oplog的所有操作都是幂等的。
oplog在不同的os中的默认大小是不同的。一般情况下生产环境的MongoDB是运行在Linux中,按照不同的引擎,默认大小为:
Storage Engine | Default Oplog Size | Lower Bound | Upper Bound |
---|---|---|---|
In-Memory Storage Engine | 5% of physical memory | 50 MB | 50 GB |
WiredTiger Storage Engine | 5% of free disk space | 990 MB | 50 GB |
MMAPv1 Storage Engine | 5% of free disk space | 990 MB | 50 GB |
像之前创建副本集的时候,就设置了oplog的大小。当然,在启动副本集之后也可以重新设置oplog的大小:
db.adminCommand({replSetResizeOplog:1, size: 300});
简单的查看oplog的status可以使用:rs.printReplicationInfo()进行查看: