MongoDB学习
Posted 西西维尼的小屋
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MongoDB学习相关的知识,希望对你有一定的参考价值。
今天玩点不一样:MongoDB复制集
Mongodb复制集由一组Mongod实例(进程)组成,包含一个Primary节点和多个Secondary节点,Mongodb Driver(客户端)的所有数据都写入Primary,Secondary从Primary同步写入的数据,以保持复制集内所有成员存储相同的数据集,提供数据的高可用。
MongoDB数据同步
Primary与Secondary之间通过oplog来同步数据,Primary上的写操作完成后,会向特殊的local.oplog.rs特殊集合写入一条oplog,Secondary不断的从Primary取新的oplog并应用。因oplog的数据会不断增加,local.oplog.rs被设置成为一个capped集合,当容量达到配置上限时,会将最旧的数据删除掉。另外考虑到oplog在Secondary上可能重复应用,oplog必须具有幂等性,即重复应用也会得到相同的结果。
介绍完背景知识之后就可以实际操作了,感谢张老板谢总借我两台腾讯云,让我可以愉快的玩耍。
首先需要在config里设置集群名为ccbrs,replSet标签。三台机器都要加。
记得关闭防火墙或者设置访问例外
然后开始集群初始化rs.initiate(),id为0的主机,其他两台为备机
通过rs.status()可以查看到集群的状态
初始化成功后在主机上插入一条记录
备机要有读权限需要先用rs.slaveOk()启动,可以看到备机上也已经能看到主机上插入的记录
一个小型集群就建成了。
Primary选举过程
Primary选举除了在复制集初始化时发生,还有如下场景复制集被reconfig
Secondary节点检测到Primary宕机时,会触发新Primary的选举当有Primary节点主动stepDown(主动降级为Secondary)时,也会触发新的Primary选举Primary的选举受节点间心跳、优先级、最新的oplog时间等多种因素影响。
复制集成员间默认每2s会发送一次心跳信息,如果10s未收到某个节点的心跳,则认为该节点已宕机;如果宕机的节点为Primary,Secondary(前提是可被选为Primary)会发起新的Primary选举。
我将原来的Primary主机replSet注释之后,会发现现在id为1的secondary变为了Primary,而原Primary的状态变为了unreacheable。
但是如果我们继续把id为1的服务器也进行replSet注释,会发现集群中剩下的唯一台id为2服务器并没有变成Primary,因为选举机制需要投票过半数,目前集群只剩下一台服务器了,所以并没有选出新的Primary。
以上是关于MongoDB学习的主要内容,如果未能解决你的问题,请参考以下文章