redis集群模式

集群模式

1.主从模式

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

redis集群模式_第1张图片

复制流程如下图,

redis集群模式_第2张图片

从节点挂了?

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

主从复制风暴

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

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

redis集群模式_第3张图片

2.哨兵模式

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

Redis哨兵高可用架构

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

redis集群模式_第4张图片

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

3.cluster 模式

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

redis集群模式_第5张图片

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集群不可用。

加入新节点

需要执行迁移槽位的命令

你可能感兴趣的:(Redis,缓存)