赞
踩
Replica Set,一般翻译为副本集,RS,是MongoDB官方提供的一个数据及应用高可用解决方案。
RS由2个或更多个节点组成,其中一个用于处理写操作的是主节点(Primary),还有多个用于保存主节点的数据副本的从节点(Secondary)。如果主节点崩溃,则从节点会从其中选取出一个新的主节点。从节点定时通过oplog从主节点复制数据,实现自动failover和recovery。客户端可以从主节点或从节点读取数据,但只能往主节点写数据。
MongoDB支持两种复制的模式:
副本集架构图
RS适用场景:
副本集中的节点主要分为三种:
RS的成员具备以下常见属性:
db.isMaster()
方法也不会展示该节点,隐藏节点Priority必须为0,即不可以被选举成为主节点。但是如果有配置选举权限的话,可以参与选举。包括被动成员和隐藏成员:
成员之间通过心跳来传达自己的状态。最常见的状态就是“主节点”和“从节点”状态,其他状态:
通过k8s部署副本集
该配置中描述的资源:
◈ 从核心开始,有一个名为 mongo-node1 的容器。 mongo-node1 包含一个名为 mongo 的镜像,这是一个在 Docker Hub [5] 上托管的一个公开可用的 MongoDB 容器镜像。容器在集群中暴露端口 27107。
◈ Kubernetes 的数据卷功能用于将连接器中的 /data/db 目录映射到名为 mongo-persistent-storage1 的永久存储上,这又被映射到在 Google Cloud 中创建的名为 mongodb-disk1 的磁盘中。这是 MongoDB 存储其数据的地方,这样它可以在容器重新编排后保留。
◈ 容器保存在一个 pod 中,该 pod 中有标签命名为 mongo-node,并提供一个名为 rod 的(任意)示例。
◈ 配置 mongo-node1 复制控制器以确保 mongo-node1 pod 的单个实例始终运行。
◈ 名为 mongo-svc-a 的 负载均衡 服务给外部开放了一个 IP 地址以及 27017 端口,它被映射到容器相同的端口号上。该服务使用选择器来匹配 pod 标签来确定正确的 pod。外部 IP 地址和端口将用于应用程序以及副本集成员之间的通信。每个容器也有本地 IP 地址,但是当容器移动或重新启动时,这些 IP 地址会变化,因此不会用于副本集。
副本集数据量比较大时如何添加次节点
当副本集的数据量比较大时,添加新节点时,如果使用初始化同步的话,会给主节点造成比较大的压力。有以下选择:
触发时机
当出现以下情况时,会触发选举机制:
rs.stepDown()
或rs.reconfig()
操作时以下因素会影响到选举结果:
故障转移回滚
回滚指的是,当成员在故障转移后重新加入其副本集时,将还原之前主节点上的写操作,并恢复成现在主节点的状态数据。
仅当节点接收到主节点降级前未成功复制的写操作后,重新加入副本集群之后发现与现有主节点的数据不一致时,才需要回滚。
当节点重新加入到副本集群时,它会还原或“回滚”其不一致的写操作,以保持与其他成员的一致性。
Write concern,指写入一条数据,主节点处理完成后,需要其他承载数据的副本节点也确认写成功后,才能给客户端返回写入数据成功。
这个功能主要是解决主节点挂掉后,数据还未来得及同步到副本节点,而导致数据丢失的问题。
可以配置节点个数,默认配置{"w": 1}
,表示主节点写入数据成功,即可给客户端返回成功;{"w": 2}
,表示除主节点,还需要收到其中一个副本节点返回写入成功,才能给客户端返回成功;{"w": majority}
,表示需要集群中大多数承载数据且有选举权限的节点返回写入成功。
在写请求中指定 writeConcern 相关参数:
db.products.insert(
{ item: "envelopes", qty: 100, type: "Clasp" },
{ writeConcern: { w: "majority", wtimeout: 5000 } }
)
修改副本集 getLastErrorDefaults 配置:
cfg = rs.conf()
cfg.settings.getLastErrorDefaults = { w: "majority", wtimeout: 5000 }
rs.reconfig(cfg)
Read preference,为了保持一致性,写只能通过主节点,但读可以选择主节点,也可以选择副本节点,区别是主节点数据最新,副本节点因为同步问题可能会有延迟,但从副本节点读取数据可以分散对主节点的压力。
默认情况下,副本集的所有读请求都发送到主节点,Driver 可通过设置 Read Preference 来将请求路由到其他节点,规则如下:
3个条件,条件是在符合模式的基础上,再根据条件删选具体的节点
rs.conf()
查看当前每个节点下面的 tags, 修改或添加tags 过程同上面修改 getLastErrorDefaults 配置 ,如:cfg.members[n].tags = { "region": "South", "datacenter": "A" }
使用connection string uri时,可加上以下三个参数:
{ "dc": "ny", "rack": "r1" }
,则在uri 为 readPreferenceTags=dc:ny,rack:r1
在mogo shell 中,可使用cursor.readPref()
或Mongo.setReadPref()
,cursor.readPref()
参数分别为:mode、tag set、hedge options,例如:
db.collection.find({}).readPref(
"secondary", // mode
[ { "datacenter": "B" }, { } ], // tag set
{ enabled: true } // hedge options
)
Mongo.setReadPref()
类似,预先设置请求条件,这样就不用每个请求后面带上 readPref 条件。
MongoDB提供RS方法:
rs.help()
:查看帮助rs.initiate()
:初始化rs.conf()
:查看当前的配置rs.reconfig()
:需找到primary主机,在该主节点服务器上才有权限修改配置rs.add('ip:port')
:添加节点rs.addArb('ip:port')
:添加仲裁节点rs.remove('ip:port')
:移除节点rs.status()
:查看各个节点状态和身份rs.slaveOk()
:次节点执行,表示允许次节点读取数据rs.freeze(secs)
:设定某个节点多少秒不可成为主节点rs.isMaster()
:判断当前节点是否是主节点rs.syncFrom(hostportstr)
:设置次节点从指定节点同步数据rs.stepDown([stepdownSecs, catchUpSecs])
:降低主节点为次节点,只能在主节点上运行,进而触发选举rs.printReplicationInfo()
:以主节点的视角打印RS集群信息rs.printSecondaryReplicationInfo()
:以从节点的视角打印RS集群信息rs.printSlaveReplicationInfo()
:自版本4.4.1后已废弃,使用rs.printSecondaryReplicationInfo()
rs.reconfigForPSASet()
:db.printSlaveReplicationInfo()
:查看副本集的次节点与主节点延迟Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。