当前位置: 首页 > article >正文

redis集群模式

集群模式

1.主从模式

一主多从模式。主节点可以负责:读操作,写操作。 从节点只能负责读操作,不能负责写操作。把读的压力从主节点分摊到从节点,以减少主节点的压力。

在这里插入图片描述

复制流程如下图,

在这里插入图片描述

从节点挂了?

从节点挂了在恢复,从上一次挂的缓冲区(backlog:默认1m)的偏移量位置进行断点续传。如果缓冲区偏移量没有,则全量复制。

主从复制风暴

多个从节点同时复制主节点导致主节点压力过大。

解决办法:从节点下面在分从节点

在这里插入图片描述

2.哨兵模式

哨兵模式基于主从复制,是为了弥补主从复制集群中主机宕机后,主备切换的复杂性而演变出来的。哨兵顾名思义,就是用来监控的,主要作用就是监控主从集群,自动切换主备,完成集群故障转移。

Redis哨兵高可用架构

当主节点挂了(半数哨兵认为挂了)之后,哨兵会从从节点中选举出主节点,推送给客户端。

在这里插入图片描述

主节点挂了,哨兵模式会出现访问瞬断问题。

3.cluster 模式

cluster 模式是redis官方提供的集群模式,使用了Sharding 技术,不仅实现了高可用、读写分离、也实现了真正的分布式存储。

在这里插入图片描述

Redis集群原理

Redis Cluster将所有数据划分16382个slots槽位,每个节点负责其中一部分的槽位,槽位的信息存储在每个节点之中。

当Redis Cluster客户端链接集群时,他会一份集群槽位配置信息且缓存到本地,这样客户端要查找某个key时,可以定位到目标节点。若槽位存在客户端与服务端不一致的情况,还需要纠正机制实现槽位的校验调整。

槽位定位算法

Cluster默认会对key之使用CRC16算法进行hash得到一个整数值,然后用这个整数对16384取模得到具体的槽位。

HASH_SLOT=CRC16(key) mod 16384

跳转重定向

当客户端向错误节点发出命令的时候,节点发现指令的key不属于自己管理,他会向客户端发送一个特殊的跳转携带目标主机地址的操作,告诉客户端去连这个节点获取数据,客户端收到命令后,会跳转正确的节点去操作,还会同步更新纠正本地的槽位映射表缓存,后续所有操作使用新的槽位映射表。

redis通信机制

redis cluster节点之间采用的是gossip协议进行的通信。

gossip协议包括各种消息,例如ping pong meet fail。

gossip协议内部通信端口为服务端口加10000(故配置集群的时候需要关闭防火墙).

集群选举原理

过程如下:

  1. slave发现master变成FAIL
  2. 将自己记录的集群currentEpoch加一,并广播FAILOVER_AUTH_REQUEST信息
  3. 其他节点收到该信息,只有master响应,判断请求合法性,并发送FAILOVER_AUTH_ACK,对每个epoch只发送一次ack
  4. 尝试failover的slaver手机master返回的FAILOVER_AUTH_ACK
  5. slave收到超过半数master的ack后变成新的master
  6. slave广播pong消息通知其他集群节点

延时计算公式:

DELAY=500ms+rand(0~500ms)+slave+rank*1000ms

rank越小代表复制的数据越新

这种方式,持有最新数据的slave将会发起选举(理论上)。

集群脑裂丢失数据

网络分区导致脑裂后多个主节点对外提供服务,一旦网络恢复,会将一个主节点变成从节点,这是会有大量数据丢失。规避这种问题,可以在redis里面加上参数

min-slaves-to-write 1

但是在一定程度上提升了一致性,但是如果从节点都挂了,主节点就不能对外提供服务了,可用性就下降了,此配置需要权衡使用。

集群完整才能对外提供服务?

redis.conf配置cluster-require-full-coverage为no时,表示一个集群下线且没有从节点顶上,整个集群仍然可用,设置为yes集群不可用。

加入新节点

需要执行迁移槽位的命令


http://www.kler.cn/a/152826.html

相关文章:

  • 带头结点的双向循环链表
  • WordPress插件大全-免费的WordPress插件汇总
  • 浏览器安全攻击与防御
  • 重生之我是一名程序员 47 ——字符串函数 (6)
  • uniapp微信小程序实现地图展示控件
  • 【Java】文件I/O-文件内容操作-输入输出流-Reader/Writer/InputStream/OutputStream四种流
  • 苍穹外卖项目笔记(5)——Redis
  • Python函数关键字参数及用法
  • Spring简单的存储和读取
  • 【蓝桥杯选拔赛真题25】C++两个数比大小 第十三届蓝桥杯青少年创意编程大赛C++编程选拔赛真题解析
  • 数字电源为什么一般用DSP控制,而不能用普通的单片机?
  • OpenStack-train版安装之安装Keystone(认证服务)、Glance(镜像服务)、Placement
  • Scan Context / Scan Context ++ 论文和源码阅读
  • 西南科技大学模拟电子技术实验一(常用电子仪器的使用及电子元器件的识别)预习报告
  • C++相关闲碎记录(2)
  • ubuntu离线安装包下载和安装
  • Linux安全配置
  • Windows核心编程 远程线程注入
  • 【Redis缓存】RedisTemplate如何获取符合要求的key,批量获取key
  • Binlog vs. Redo Log:数据库日志的较劲【基础】