mongo 副本集节点类型

对于Secondary来说有三个比较重要的属性。

Priority=0

优先级为0的节点的概述

字面上来说,权限为0。拥有最低的权限。已然是Secondary了,权限还最低,啥影响呢?之前说过,mongoDB的副本集中是有投票机制的,如果一个Primary不可达(关于不可达后面还说详细说),那么所有的Secondary会联合起来投票选举,选出心目中的新的Primary。因为只有Primary才能接收Writes的操作,所以Primary在一个mongoDB的集群中是必须的。下图展示了一个在两个IDC中存放Primary,Secondary,以及一个Priority=0的Secondary的场景(关于这个存放方式以及奇数偶数,有必要在后面单拿出来好好说说,这个问题困扰了我一个晚上无法安心入睡T..T)

Priority=0的场合

优先级为0的节点的特点

  • 此节点丧失了当选Primary的机会。永远不会上位。
  • 此节点正常参与Primary产生的oplog的读取,进行数据备份和命令执行。
  • 此节点正常参与客户端对于数据的读取,进行担当负载均衡的工作。
  • 此节点虽然不能当选Primary但是却可以投票,很民主。

Priority=0在mongoDB中的解释就是一个Standby,可投票不可参选,又干活又负载。有点像日本议会党派中刚入党派的小喽啰,可以参与自己党派党首的选举,还要干好多活,外面民众开骂还得挡着,但就是不可能当选党首。

Hidden

Hidden节点的概述

字面上来说,隐藏。这个隐藏式对客户端的隐藏,客户端如果要读取Secondary的数据,永远无法读取Hidden节点的数据,因为设置了Hidden的这个节点对于客户端是透明的,不可见。但是,对于自己的Secondary的群体和Primary来说都是可见的,所以,Hidden依然可以投票,依然要按照oplog进行命令的复制,只是,不参与负载了。Hidden属性的前提是必须是一个Priority=0的节点,所以会具备一些优先级=0的特点,具体如下。

Hidden的场合

Hidden节点的特点

  • 此节点丧失了当选Primary的机会。永远不会上位。
  • 此节点正常参与Primary产生的oplog的读取,进行数据备份和命令执行。
  • 此节点正常参与客户端对于数据的读取,进行担当负载均衡的工作。
  • 此节点不参与客户端对于数据的读取,不进行负载均衡
  • 此节点虽然不能当选Primary但是却可以投票,也很民主。

删除线体现出它与Priority=0的不同地方,斜体表现出它比0优先级多出来的特性。如果节点是Hidden,它不参与负载,那么空闲出来的时间可以做一些赋予给它的特殊任务,比如数据备份等等。到应用场景的时候会有用处。

Delayed

Delayed节点的概述

字面上来说,迟延。迟延代表此节点的数据与Primary的数据有一定的迟延,通过设定一个迟延的属性来确定。假设,Primary的数据是10:00的最新数据,我们设置了一个3600秒的迟延参数,那么这个带有迟延的节点的数据或者说命令执行情况(在oplog中)应该只到9:00为止。与主节点有1小时的迟延。有些人可能会问,我们设计分布式数据库要的就是数据能够尽量避免迟延来达到一致,这样才能更好的提供服务,为什么要刻意制造迟延呢?试想这个场景:一个猪一样的队友在mongoDB的Replica集群上面执行了一个Drop操作,这个操作干掉了你的Primary的Collection,这个Drop同时被记录到oplog中去,其他的Secondary看到这个oplog后争相执行,各自干掉了自己的Collection,你苦心存储的岛国片link就这么消失了。。。再怎么抽这个队友没用啊。就像我刚才点其他的草稿把这篇几乎写完的文章冲掉是一个效果。所以,主动的过失避免就显得格外重要。如果你有一个Delayed节点,有一个1000秒的迟延,那么在你发现这个miss之后还有足够的时间可以响应去不让这个Delayed节点执行错误的command,从而挽回你的损失。具体如下。

Delayed的场合

Delayed节点的特点

  • 此节点必须是一个Priority=0且为Hidden的节点,因为Hidden必须是Priority=0的,所以此节点必须是Hidden的。
  • 此节点虽然又迟延又Hidden但是还是可以投票,也很民主,呵呵。

Delayed节点的最大作用是用来容人为的灾,猪一样的操作,驴一样的动作,在Delayed节点可以把损失降到最低。当然,如果你在Delayed时间经过后发现了错误,那么,只能”呵呵”了。。。

Delayed节点时间设置的注意点

mongoDB在对Delayed时间设置的时候有一个说明:

Behavior 
Delayed members apply operations from the oplog on a delay. When choosing the amount of delay, consider that the amount of delay: 
•must be is equal to or greater than your maintenance windows1
•must be smaller than the capacity of the oplog. For more information on oplog size, see Oplog Size.

对于这两句话的理解,第一句我实在不敢肯定这个maintenance windows指的是什么,所以拿来了wiki的一段解释。其实这里可以用白话来解释,你的Delayed的时间设定一定要大于你的响应时间,比如你从Primary的oplog写到你的Secondary需要1秒,那么你的Delayed怎么也得大于等于1秒吧,小于1秒的的话只能是一个不可及状态咯。第二句的话比较好理解,你Delayed的内容比oplog还要大,那么你追回来的操作肯定会和Primary不一样了,会丢失一些操作哟。而且mongoDB如果出现这样的情况会不会报错?有机会测试一下。

つづく・・・

猜你喜欢

转载自blog.csdn.net/xiaoliuliu2050/article/details/80022205