MongoDB副本集

副本集-Replica Sets

在这里插入图片描述

副本集的两种类型和三种角色

两种类型:
主节点类型:数据操作的主要连接点,可读写
次要节点类型:数据冗余备份节点,可以读或选举
三种角色:
主要成员:主要接收所有写操作,就是主节点
副本成员:从主节点通过复制操作以维护相同的数据集,即备份数据,不可写操作,但可以读操作,是默认的一种从节点类型
仲裁者:不保留任何数据的副本,只有投票选举作用(也可以同时是次要节点类型)

搭建

1.创建主节点
建立存放数据和日志的目录:

mkdir -p /mongodb/replica_sets/myrs_27017/log \&
mkdir -p /mongodb/replica_sets/myrs_27017/data/db

2.新建或修改配置文件:

vim /mongodb/replica_sets/myrs_27017/mongod.conf

在这里插入图片描述
3.分别启动节点服务:

/usr/local/mongodb/bin/mongod -f /mongodb/replica_sets/myrs/_27019/mongod.conf

4.初始化配置副本集和主节点
使用客户端命令连接任意一个节点,但这里尽量要连接主节点(27017节点)
结果,连上之后很多命令无法使用,比如show dbs等,必须初始化副本集才行

准备初始化新的副本集:
rs.initiate(configuration)

在这里插入图片描述

5.添加副本从节点:
在主节点添加从节点,将其他成员加入到副本集

rs.add(host,arbiteOnly)

在这里插入图片描述
示例:
在这里插入图片描述
连接从节点读取数据时,发现不能读取,因为当前从节点只是一个备份,不是奴隶节点,无法读取数据,写当然更不行,因为默认情况下,从节点是没有读写权限的,可以增加读的权限,但是需要进行设置:

设置为奴隶节点,允许成员允许读的操作:
rs.slaveok()或rs.slaveok(true)
取消奴隶节点的读权限:
rs.slaveok(false)

主节点的选举原则:

MongoDB在副本集中,会自动进行主节点的选举,主节点选举的触发条件:

1.主节点故障
2.主节点网络不可达(默认心跳信息为10s)
3.人工干预(rs.stepDown(600))

一旦触发选举,就要根据一定的规则来进行主节点选举:

票数最高,且获得了大多数成员的投票支持的节点获胜
大多数的定义为:假设复制集内投票成员数量为N,则大多数为N/2 + 1,例如,3个成员投票,则大多数的值是2,当复制集内存成员数量不足大多数时,整个复制集将无法选举Primary,复制集将无法提供写服务,处于只读状态
若票数相同,且都获得了大多数成员的投票支持的,数据新的节点获胜
数据的新旧通过操作日志oplog来对比的
在获得票数的时候,优先级参数的影响重大
可以通过设置优先级来设置额外票数,优先级即权重,取值为0-1000,相当于额外增加0-1000的票数,优先级的值越大,就越可能获得多数成员的投票数,指定较高的值可使成员更有资格成为主要

副本节点故障测试:

关闭27018副本节点:
发现,主节点和仲裁节点对27018的心跳失败,因为主节点还在,因此,没有触发投票选举
如果此时,在主节点写入数据,再启动从节点,会发现主节点写入的数据,会自动同步到从节点

主节点故障测试:

关闭27017节点
发现从节点和仲裁节点对27017的心跳失败,当失败超过10s,因此因为没有主节点了,会自动发起投票,而副本节点只有27018,因此候选人只有27018,开始投票
27019向27018投了一票,27018自带一票,因此共两票,超过了大多数,27019是仲裁节点,没有选举权,27018不向其投票,其票数是0
最终结果,27018成为主节点,具备读写功能,

仲裁节点和主节点故障:

先关掉仲裁节点27019
再关掉主节点27018
登录27017后,发现27017仍然是从节点,副本集中没有主节点了,导致副本集是只读状态无法写入,为啥不选举了?因为27017的票数,没有满足大多数,即没有大于等于2,它只有默认的一票,如果要触发选举,随便加入一个从节点即可
如果只加入27019仲裁节点,则主节点一定是27019,因为没得选了,仲裁节点不参与选举,但参与投票
如果之加入27018节点,会发生选举,因为27018和27019都是2票,则按谁数据新,谁当主节点

仲裁节点和从节点故障:

先关掉仲裁节点27019
关掉现在的副本节点27018
10s后,27017主节点自动降级为副本节点(服务降级)
副本集不可写数据了,已经故障了

SpringDataMongoDB连接副本集

副本集语法:
	mongodb://host1,host2,host3/?connect=replicaSet&slaveOk=true&replicaSet=副本集名称
	其中:
	slaveOk=true:开启副本节点读的功能,可实现读写分离
	connect=replicaSet:自动到副本集中选择读取的主机,如果slaveOk=true,则实现读写分离
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值