Redis基础(八)——集群

集群

1 主从复制

为提高系统可用性,使用多台服务器提供服务

主从复制:将master中的数据即时、有效的复制到slave中

如果master宕机了,可以临时推选一个slave当选master

在这里插入图片描述

作用

  • 读写分离
  • 负载均衡
  • 故障恢复
  • 数据冗余,实现数据热备份
  • 高可用基石

工作流程

  1. 建立连接阶段
  2. 数据同步阶段
  3. 命令传播阶段

1.1 建立连接阶段

在这里插入图片描述

// 连接方式1:客户端发送命令
slaveof <masterip> <masterport>
// 连接方式2:启动时加服务器参数
redis-server --slaveof <masterip> <masterport>
// 连接方式3:配置文件增加服务器配置
slaveof <masterip> <masterport>

// 断开连接,客户端发送命令
slaveof no one

1.2 数据同步阶段

在这里插入图片描述

1.3 命令传播阶段

命令传播阶段出现了断网现象

  • 网络闪断闪联:忽略
  • 短时间网络中断:部分复制
  • 长时间网络中断:全量复制

部分复制的三个核心要素

  • 服务器的运行id:是每一台服务器每次运行的身份识别码,是随机的40位十六进制字符。用于slave识别身份,每次操作同一台服务器。id由服务器在启动时自动生成,首次连接slave时会发送给slave
  • 主服务器的复制积压缓冲区:FIFO队列,用于存储服务器执行过程中的命令,每次传播命令除了会发送给slave,还会存储在复制积压缓冲区
  • 主从服务器的复制偏移量:复制积压缓冲区由偏移量和字节值(存储指令)组成,offerset用于slave和master记录当前发送的命令到哪个位置

心跳机制,实现双方连接在线

  • master心跳:指令ping,用于判断slave是否在线
  • slave心跳:指令replconf ACK {offset},用于判断master是否在线和汇报自己的复制偏移量,获取最新数据

在这里插入图片描述

在这里插入图片描述

2 哨兵

哨兵是一个分布式系统,用于对主从结构中的每台服务器进行监控,当出现故障时通过投票机制选择新的master并讲所有slave连接到新的master

哨兵也是redis服务器,通常配置为单数

作用

  • 监控:不断检查master和slave是否正常运行
  • 通知:当被监控的服务器出现问题时,向其他客户端发送通知
  • 自动故障转移:断开master与slave连接,选取一个新的slave作为master
// 启动哨兵
redis-sentinel sentinel.conf

// 哨兵配置文件
// 2个哨兵觉得主服务器挂了就是真的挂了
sentinel monitor mymaster 127.0.0.1 6379 2
// 主服务器30s没相应,认定为挂了
sentinel down-after-milliseconds mymaster 30000
// 新的主服务器上任后,最多1个同步
sentinel parallel-syncs mymaster 1
// 同步超过180s算作超时
sentinel failover-timeout mymaster 180000

2.1 监控阶段

  1. sentinel向master发送info指令寻求信息(包含master和slave的信息)
  2. sentinel与master建立cmd连接用于发送通信指令
  3. sentinel向slave发送info指令寻求信息
  4. 当新的sentinel进来之后,同样向master发送info指令寻求信息,并建立cmd连接
  5. 新的sentinel与原先的sentinel定时发送ping命令并建立连接
  6. 一般情况下,sentinel以每十秒一次的频率向被监视的主服务器和从服务器发送info指令。如果主服务器处于下线状态,或正在故障转移,则对从服务器发送info指令的频率改为每秒一次
  7. 多个sentinel之间以每两秒一次的频率向hello频道发送消息来向其他sentinel宣告自己的存在
  8. sentinel以每秒一次的频率向主服务器、从服务器、其他sentinel发送ping命令判断是否在线

在这里插入图片描述

2.2 通知阶段

在这里插入图片描述

2.3 故障转移阶段

  1. 当其中的一个sentinel发现master挂了的时候,master标记为主观下线s_down
  2. 其他sentinel会去确认master是否挂了,如果是则master标记为客观下线o_down
  3. sentinel内部进行投票,每个sentinel投给最先收到竞选消息的sentinel,选出一个谈判者
  4. sentinel挑选备选master,依次按照在线的、响应快的、与原master最近沟通的、优先级、offset、runid小的,从slave中选择一个新master
  5. 向新master发送slaveof no one指令,向其他slave发送slaveof和新master的ip端口

3 集群

集群通过分片的方式来保存数据库中的键值对:数据库被分为16384个槽(将key通过hash计算再取模上一个值,得出存储的槽),每个节点可以处理其中的一部分槽,强调分布式,每个服务器之间都知道key所对应的槽在哪个服务器

重新分片:将属于某个槽的所有键值对从一个节点转移至另一个节点

执行命令

  • 如果键所在的槽在当前节点,那么直接执行命令,否则返回一个MOVED错误,指引客户端重定向至正确的节点,并再次发送命令
  • 当客户端向源节点发送命令,但是当前槽正好被迁移至别的数据库时,返回一个ASK错误,指引客户端转向正在导入槽的目标节点,并再次发送命令

MOVEN错误和ASK错误的区别

  • MOVED错误代表槽的负责权已经从一个节点转向另一个节点:在客户端收到MOVED错误之后,以后每次收到这个槽的命令,都可以直接将命令发送至正确的服务器上
  • ASK错误只是在两个节点正在迁移槽的过程中使用的临时措施:在客户端收到ASK错误之后,只会在接下来一次命令中将请求转向正确的服务器,不会对以后的命令产生影响
// 与ip和port所指定的节点握手,连接到对应的集群中
cluster meet <ip> <port>
// 将某个槽指派给当前节点
cluster addslots <slot> [slot ...]
// 查看一个键属于哪个槽
cluster keyslot <key>

// cluster配置

// 是否开启集群模式
cluster-enabled yes|no
// cluster配置文件名,该文件自动生成
cluster-config-file <filename>
// 节点服务器响应超时时间
cluster-node-timeout <milliseconds>
// master连接的slave最小数量
cluster-migration-barrier <count>

消息

  • MEET消息:当发送者接收到客户端的CLUSTER MEET命令后,发送者会发送MEET消息,请求接收者加入发送者当前集群
  • PING消息:集群里每隔节点每隔一段时间会发送PING消息检测别的节点是否在线
  • PONG消息:接收者收到MEET消息或者PING消息时,会回复一条PONG消息
  • FAIL消息:当一个主节点旁段另一个主节点进入FAIL状态时,会广播一条关于另一个节点FAIL的消息,其他节点会标记它下线
  • PUBLISH消息:当一个节点收到PUBLISH命令时,会向集群广播一条PUBLISH命令,所有接收到这条命令的节点都会执行相同的PUBLISH命令
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值