Redis教程

Redis Cluster集群(三)

本文主要是介绍Redis Cluster集群(三),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

Redis笔记

  • Redis 简介(一)
  • Redis 持久化主从哨兵 (二)
  • Redis Cluster集群(三)

Redis集群方案

  • 哨兵模式
  • 高可用集群模式

高可用集群模式

定义:

因为哨兵模式在主从节点切换的瞬间存在 访问瞬断 的情况,而且哨兵只有一个主节点对外提供服务,没办法支持很高的并发,所以redis提供了cluster集群模式

redis内置cluster 集群模式,称为redis集群,具有 **高可用、分片**的特性,具有良好的水平扩展性。

redis集群

redis集群原理

概念:

Redis Cluster 将所有数据划分为16384个slots(槽位),集群中的每个节点负责其中一部分槽位,槽位的信息存储在每个节点中。

当客户端连接集群时,得到一份**集群槽位配置信息缓存在客户端本地**

槽位定位算法:

当查找某个key时, key位置为:CRC16(key) mod 16384CRC16是一个hash算法

跳转重定位:

由于客户端会缓存 槽位配置信息 在本地,当客户端计算出key的槽位,发到redis,节点会发现key所在槽位不归自己管理,这时候会向客户端发送一个特殊的跳转指令携带目标操作的节点地址,告诉客户端从这个节点获取数据,同时会更新本地槽位配置信息。 【因为缓存信息过时了,节点让客户端重定位】

节点间的通信机制

  • 集中式
  • gossip

redis cluster节点间采用gossip协议进行通信

集中式:

优点:元数据的更新和读取,其他节点可以立即感知

缺点:所有元数据的更新压力全部集中在一个地方,导致元数据的存储压力

很多中间件使用zookeeper来集中式存储元数据

gossip:

  • meet —— 集群内的节点发送meet给新节点,让它加入
  • ping —— 每个节点频繁给其他节点发送ping,包含自己的状态还有自己维护的集群元数据
  • pong —— 对meet和ping消息的返回,包含自己的状态和其他信息信息广播和更新
  • fail —— 发送fail给其他节点告诉指定节点宕机。

优点:元数据的更新比较分散,降低压力

缺点:元数据的更新有延时可能导致 集群的一些操作会滞后

gossip通信的10000端口

每个节点都有一个专门用于节点间通信的端口,是它的端口号加上10000防火墙记得配置

gossip心跳同步

网络抖动

真实的网络世界会突然出现不可访问的情况

Redis Cluster 提供了一种选项cluster-node-timeout,表示当某个节点持续 timeout 的时间失联时,才可以认定该节点出现故障,需要进行主从切换。

※ Redis集群选举原理分析

  • slave发现master变为FAIL状态
  • 将自己记录的集群currentEpoch++,并广播FAILOVER_AUTH_REQUEST 信息 【不会立即广播,有延迟
  • 只有其他主节点master会响应,判断请求合法性,并发送FAILOVER_AUTH_ACK,对每一个epoch只发送一次ack
  • slave收集master返回的FAILOVER_AUTH_ACK
  • slave 收到**超过原来半数的master的ack,才会变成新的master** 【至少三个master
  • slave广播pong信息通知其他集群节点

第二点的延迟计算公式

DELAY = 500ms + random(0 ~ 500ms) + SLAVE_RANK * 1000ms

SLAVE_RANK —— slave从master中复制数据总量的排名rank,排名越前,代表数据越新,更有机会首先发起选举

集群脑裂数据丢失问题

问题:

出现 master 和 slave 连接丢失时,此时slave发起选举,就有两个master对外服务,【产生脑裂问题】当网络恢复后,其中一个master变为slave,丢失大量数据

解决:

# 写数据成功的最少同步slave数量 假设结点数为3 1主2从
min-replicas-to-write 1

## 当主节点写入数据时,【根据配置】需要同步写入至少1个从节点的数据,才能写入成功

是否完整才能对外提供服务

当redis.conf的配置cluster-require-full-coverage为no时,表示当负责一个slot的master下线且没有相应的slave进行故障恢复时,【有一部分不能读写】 集群仍然可用,如果为yes则集群不可用。

Redis集群为什么至少需要三个master节点,并且推荐节点数为奇数?

因为新master的选举,需要得到 超过半数的master同意,slave才能变为master,如果只有两个master节点,选举无法进行。

奇数个master节点可以满足选举条件且节省一个节点,

比如3个master节点和4个master节点集群

  • 3节点只允许一个master宕机
  • 4节点有一个master宕机后,如果宕机一个,无法选取新的master【因为此时最大票数为2,master节点半数也为4/2=2】

奇数个节点是从 节省机器资源角度 考虑的

Redis集群对批量操作命令的支持

mset、mget

mset name summer age 18 # 报错,因为name和age落在不同的slot里,无法批量操作
# 解决
# key的前面加上{XX},这样参数数据分片hash计算的只会是大括号里的值,这样能确保不同的key能落到同一slot里去
mset {user1}:name summer {user1}:age 18 
这篇关于Redis Cluster集群(三)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!