MongoDB全自动容灾集群节点角色解析

 Hisoka-J 360云计算

女主宣言


大家在使用mongodb的时候一定知道什么是数据节点,什么是投票节点,因为这是mongodb复制集结构中最常用的节点了。其实mongodb还有多个其它类型的节点,相信他们可以在一些场景中帮到你,快来看看吧!

PS:丰富的一线技术、多元化的表现形式,尽在“HULK一线技术杂谈”,点关注哦!


mongoDB replicaSet背景介绍mongoDB replicaSet集群是官方推荐使用的mongoDB全自动容灾集群结构,当前已经完全替代主从集群结构

1

mongoDB replicaSet重要优点
1.能够自动容灾(主库宕机后自动切主,无人值守)2.严格的数据同步策略以及防脑裂策略,在切主后会尽可能的确保数据不丢失3.没有严格意义上的主库(primary),即使发生切主,client可通过driver及代码中配置的replicaSet参数来自动寻主4.极简的扩容方式,仅需一条命令即可时间节点的增加并能够全自动同步数据最终实时同步5.对集群中的节点提供了大量的“角色”(属性)供用户应对不同场景,非常灵活

mongoDB replicaSet使用需谨慎
1.必须有一个数据节点2.mongoDB 3.0之前最大节点数量仅为7个3.节点数量挂掉大于等于全部节点的数量的1/2,整个集群不可写,例如3->2,4->2,5->3等4.建议节点数量为奇数个,防止很容易就出现挂掉1/2的情况,同时能防止跨机房断网脑裂(两边均不可写)5.节点可全部为数据节点,或1个数据节点6个投票节点,但这样做都是很极端的,建议数据节点至少2个,仲裁节点至少一个6.如果其中包含表决节点,那么整个集群的节点数量能够上升至12个,也就是7个非表决节点+5个表决节点7.表决节点是否存活会影响到业务,而隐藏节点则不会

mongoDB replicaSet角色解析1数据节点

数据节点[primary/seconadry] 存放着完整的数据,在rs集群中,数据节点可为PRIMARY,也可为SECONDARY角色 一个普通的数据节点,拥有选举权及被选举权

适用场景:数据节点是最长用的节点,用来提供db服务

配置方式:

 {
  "setName" : "bbset",
  "ismaster" : true,
  "secondary" : false,
  "arbiters" : [
           "127.0.0.1:17001"
           ],
   "primary" : "127.0.0.1:7002",
   "me" : "127.0.0.1:17001",
   "maxBsonObjectSize" : 16777216,
   "localTime" : ISODate("2013-08-14T10:11:09.571Z"),
   "ok" : 1
}

数据节点的添加方式(假设新的节点为127.0.0.1:9001):

rs.add("127.0.0.1:9001")

在有权重配置的情况下:

rs.add({ "_id": 3, "host": "127.0.0.1:9001", "priority": 5 })

2仲裁节点

 仲裁节点[arbiter] 的作用仅为负责选举,当一个集群发生问题,主库挂掉而其余数据节点权重相同的时候,需要仲裁节点来辅助选出新的主库 仲裁节点不存放任何数据,也不产生oplog,所以不会转为数据节点 仲裁节点的特征:下方的”arbiterOnly” : true。需要注意的是,每个集群都最好有一个仲裁节点,这能够在最大程度上避免无主故障的发生

适用场景:在服务器资源不足又需要满足replicaSet节点为奇数个的场景下,不需要存放任何数据的仲裁节点仅需要一个虚拟机即可部署,能够大大降低服务器成本

配置方式:

{
  "setName" : "bbset",
  "ismaster" : false,
  "secondary" : false,
  "arbiters" : [
        "127.0.0.1:7001"
        ],
  "primary" : "127.0.0.1:7002",
  "arbiterOnly" : true,
  "me" : "127.0.0.1:17001",
  "maxBsonObjectSize" : 16777216,
  "maxMessageSizeBytes" : 48000000,
  "localTime" : ISODate("2013-08-14T10:14:42.797Z"),
  "ok" : 1
}

仲裁节点的添加方式(假设新的节点为127.0.0.1:9001):

rs.addArb("127.0.0.1:9001")

3隐藏节点

隐藏节点[hidden] 通常用于备份。它存放着完整的数据并实时从主库同步 程序通过driver连接到Rs集群的时候会自动忽略被设置为隐藏的节点,仅可直连,所以隐藏节点是不提供服务的,而他的存活也不会影响到前端的程序 隐藏节点永远不会被升级为主库,他的权重为0 隐藏节点的特点特征:下方的”hidden” : true

适用场景:如果在你的场景中需要一个实例用来充当备份,或者是统计分析,但又不想让它承载线上的请求,那么隐藏节太适合你了。

配置方式:

{
   "setName" : "bbset",
   "ismaster" : false,
   "secondary" : false,
   "arbiters" : [
                "127.0.0.1:7001"
    ],
    "primary" : "127.0.0.1:7002",
    "passive" : true,
    "hidden" : true,
    "me" : "127.0.0.1:7001",
    "maxBsonObjectSize" : 16777216,
    "maxMessageSizeBytes" : 48000000,
    "localTime" : ISODate("2013-08-14T10:31:58.656Z"),
    "ok" : 1
}

隐藏节点的添加方式(假设新的节点为127.0.0.1:9001):

rs.add({ "_id": 3, "host": "127.0.0.1:9001","priority" : 0, "hidden" : true})

4表决节点

表决节点[votes] 的功能与仲裁节点不同,它能够提供正常的读写服务,但不具备投票的权利 表决节点仅具备否决权,在集群中提供服务,也可被升级为主库,权重默认为1 表决节点的特征:下方的”votes” : 0 需要注意的是,表决节点不会被rs集群计入7个节点的限制,你可以在已有7个节点的rs集群中再增加最多5个表决节点,让整个集群的节点数量达到12个

适用场景:如果你的集群已经达到了7个节点的上线但仍然无法承载业务的请求量又无法短时间内调整为mongoS集群,那么请立即增加表决节点吧。

配置方式:

{
   "_id" : 24,
   "host" : "127.0.0.1:7003",
   "votes" : 0,
   "priority" : 1,
}

表决节点的添加方式(假设新的节点为127.0.0.1:9001):

rs.add({ "_id": 3, "host": "127.0.0.1:9001", "votes":0})

5延迟节点

延迟节点[slaveDelay] 用于数据的延迟备份,功能类似隐藏节点,同样不会提供服务,程序看不到,但可直连 延迟节点同样不会被升级为主库,它的存活对整个集群也不会有任何影响。需要注意的是,在设置延迟复制节点的时候,该参数会把它同时设置为隐藏节点 延迟节点的特征:下方的”slaveDelay” : 3600

适用场景:对于某些存在“数据快速恢复“需求的场景,延迟节点可以在发生此类问题时拯救你,通常延迟同步的数据会帮你保住一份可以立即使用的备份数据,但要注意的是,延迟时间需要按需设置,太长太短都不好

配置方式:

{
   "_id" : 15,
   "host" : "127.0.0.1:7001",
   "priority" : 0,
   "slaveDelay" : 3600,
   "hidden" : true
}

延迟节点的添加方式(假设新的节点为127.0.0.1:9001):

rs.add({"_id" : 3, "host" : "127.0.0.1:9001", "slaveDelay" : 3600})

看到这里,你已经掌握了mongoDB replicaSet集群中所有角色的特点,快去试试看吧!

END

上一篇:.NET 云原生架构师训练营(权限系统 代码实现 Identity)--学习笔记


下一篇:docker 打包镜像过程