mongodb基础整理篇————副本概念篇[外篇]( 二 )

可以看下哪些是自己想要的 。
简单的实验非主节点是否可以写入数据:

mongodb基础整理篇————副本概念篇[外篇]

文章插图
结果是不行的 。
主节点写入是否从节点会同步:
连接27017 判断是否是主节点:
mongodb基础整理篇————副本概念篇[外篇]

文章插图
那么开始连接一个从节点,并从节点上读取数据,和mysql 一样 。
mongodb基础整理篇————副本概念篇[外篇]

文章插图
可以看到不让我们进行访问
这里面是一个这样的机制:
因为从节点落后于主节点,那么默认情况下是不让从从节点上读取数据 。
这和mysql 是不一样的 。
那么是否能修改配置来从从节点上读取数据,这也是可以的 。
mongodb基础整理篇————副本概念篇[外篇]

文章插图
可以修改客户端的连接配置,可以来进行完成,然后就可以访问从节点数据了 。
下面来实验,如果主节点没了,那么是否这个副本集是否就没法使用了?
db.adminCommand({"shutdown":1});使用上面这个命令进行关闭 。
mongodb基础整理篇————副本概念篇[外篇]

文章插图
可以看到的确关闭了 。
那么随便进入一个节点看下 。
进入27018 查看 。
mongodb基础整理篇————副本概念篇[外篇]

文章插图
那么主节点就变成了27018了 。
用rs.status() 查看27017的状况:
mongodb基础整理篇————副本概念篇[外篇]

文章插图
已经不健康了,那么再次启动27017一下 。
【mongodb基础整理篇————副本概念篇[外篇]】
mongodb基础整理篇————副本概念篇[外篇]

文章插图
27017 就变成从节点了 。
这个时候要增加副本集怎么办:
可以使用rs.add({"localhost":"27020"})
如果要删除怎么办:
可以使用rs.remove({"localhost":"27020"})
如果进行修改怎么办:
var config = rs.config()config.members[0].host="localhost":"27017"rs.reconfig(config)
这样就从新加载了 。
副本集的一些理论知识前面知道了 , 副本集3个情况下 , 如果一个没了 , 还是可以运行的 。
那么如果两个挂了,是否最后一个可以继续运行呢?
答案是不能的,这里就不实验了 。
因为有一个理论知识:
副本集在绝大多数活着的情况下才能正常运行 。
也就是说3个有两个正常才能运行,5个就要3个 。
为什么这样呢? 假设一个问题 , 现在有3个副本集,一个因为网络问题,无法与其他节点连接 。
那么它自己就选自己为主节点,其他两个选他们自己其中一个为主节点 。
那么问题来了,就有两个主节点了 , 这样就可以写入不同的主节点,那么就出现问题了,两边数据无法同步了 。
下一个问题,副本集是如何选举的呢? 什么时候进行选举呢?
当一个从节点无法与主节点连通时候,他就会联系并请求其他的副本集成员将自己选举为主节点 。
没错 , 就像边关大将,如果察觉皇帝不在了,就开始密谋向其他边关大臣推举自己作为皇帝 。
然后其他边关大臣要确认是不是皇帝驾崩了,如果确认皇帝没有驾崩,那么是不会进行支持的 。
如果确定皇帝不在了,那么也不一样选发起的这个边关大将 。
而是先考虑哪个副本集是最新数据,然后是优先级最高的节点作为主节点 。
如果一个副本是最新数据,而其他没有,那么会选择这个节点作为主节点 。但是值得注意的是,如果优先级更高的节点同步了最新数据后 , 那么优先级更高的节点,将会成为新的主节点 。
副本集之间会互相间隔两秒发送一次心跳 。如果某个成员在10秒内没有反馈心跳,则其他成员会将改不良成员标记为无法访问 。
前文提及到优先级最高的会作为主节点:
那么如何设置优先级呢?
rs.add({"host":"localhost:27017", "priority":1.5})这个优先级有一个特殊值,如果选择0的话,那么这个节点永远不会成为新的节点 。
然后优先级更高的一般会成为主节点 , 是这样的,如果设置了优先级更高的副本集,那么当这个副本集拥有最新数据的时候 , 当前节点会自动退位给这个节点 。

推荐阅读