缓存杂谈(九) Redis_cluster 核心机制说明

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: Redis_cluster 核心机制说明

Redis_cluster 核心机制说明

基础通信原理

  1. redis cluster 节点间采用gossip协议进行通信,跟集中式不同,不是将集群元数据(节点信息,故障,等等)集中存储在某个节点上,而是互相之间不断通信,保持整个集群所有节点的数据是完整的
  2. 10000端口
    每个节点都有一个专门用来节点通信的端口,就是自己提供服务的端口+10000,比如7001,那么用于节点间通信的就是17001端口,每个节点每隔一段时间都会往另外几个节点发送ping消息,同时其他节点接收到ping消息后返回pong
  3. 交换的信息
    故障信息,节点的增加和移除,hash slot信息等

    gossip协议

    gossip协议包含多种消息,包括ping, pong,meet,fail等等
    这个协议主要是维护及群的元数据用的,维护集中式元数据的的方式有如下两种:

集中式:
image.png

优点在于,元数据的更新和读取,时效性非常好,一旦元数据出现了变更,立即就更新到集中式的存储中,其他节点读取的时候就立即可以感知到

缺点在于,所有的元数据的更新压力都集中在一个地方,可能会导致元数据的存储有压力

gossip协议:
image.png

优点在于,元数据的更新比较分散,不是集中在一个地方,更新请求会陆陆续续,打到所有的节点上去更新,有一定的延时,降低了压力

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

meet

某个节点发送meet给新加入的节点,让新的节点加入集群中,然后新的节点就会开始与其他节点进行通信
redis-trib.rb add-node
其实内部就是发送了一个gossip meet消息,给新加入的节点,通知那个节点去加入我们的集群

ping

每个节点都会频繁地给其他节点发送ping,其中包含自己的状态以及自己维护的集群元数据,互相通过ping交换元数据

pong

返回ping 和 meet,包含自己的状态和其他信息,也可以用于信息广播和更新

fail

某个节点判断另一个节点fail之后,就发送fail给其他节点,通知其他节点,指定的节点宕机了

ping 消息探入

  1. ping 很频繁,而且要携带一些元数据,所以可能会加重网络的负担
  2. 每个节点每秒会执行10次ping,每次会选择5个最久没有通信的其他节点
  3. 当然如果发现某个节点通信延时达到了cluster_node_timeout / 2 , 那么立即发送ping,避免数据交换延时过长

    所以cluster_node_timeout可以调节,如果调节比较大,那么会降低发送的频率
    这个参数的设置不能太长,如果集群中两个节点之间超过10分钟都没有进行消息的互通,那么整个集群处于严重的元数据不一致的情况,会有问题

  4. 每次ping,一个是带上自己节点的信息,还有就是带上1/10其他节点的信息,发送出去,进行数据交换,至少包含3个其他节点的信息,最多包含总结点-2个其他节点的信息

面向集群的jedis内部实现原理

开发的时候,都是基于jedis ,redis 的java client客户端,redis cluster ,jedis cluster api 进行开发
jedis cluster api 与 redis cluster 集群交互的一些基本原理

基于重定向的客户端

redis-cli -c :自动重定向

请求重定向

每个redis实例收到命令,都会计算key相应的hash slot,如果在本地就在本地处理
否则返回moved给客户端,让客户端进行重定向
cluster keyslot mykey, 可以查看一个key对应的hash slot是什么
用 redis-cli的时候,可以加入-c参数,支持自动的请求重定向,redis-cli接收到moved之后,会自动重定向到对应的节点执行命令

计算hash slot

计算 hash slot的算法,就是根据key计算CRC16值,然后对16384取模,拿到对应的hash slot
用hash tag可以手动指定key对应的slot,同一个hash tag下的key,都会在一个hash slot中,比如set key1:{100}和set key2:{100}

hash slot查找

节点间通过gossip协议进行数据交换,就知道每个hash slot在那个节点上

smart jedis

什么是smart jedis

基于重定向的客户端,很消耗网络IO,因为大部分情况下,可能都会出现一次请求重定向,才能找到正确的节点,所以大部分的客户端,比如java redis客户端,就是jedis,都是smart的
本地维护一份hashslot -> node 的映射表,缓存,大部分情况下,直接走本地缓存就可以找到hashslot -> node ,不需要通过节点进行moved重定向

Jedis_cluster的工作原理

在 jedis cluster 初始化的时候,就会随机选择一个node,初始化hashslot -> node映射表,同时为每个节点创建一个jedisPool连接池
每次基于JedisCluster执行操作,首先JedisCluster都会在本地计算key的hashslot,然后在本地映射表找到对应的节点
如果那个node刚好持有这个hashslot,那么就ok,如果进行了reshard这样的操作,可能hashslot已经不在那个node上了,就会返回moved
如果发现对应的节点返回moved,那么利用该节点的元数据,更新hashslot -> node映射表
重复上面几个步骤,直到找到对应的节点,如果重试超过5次,那么就报错,jedisClusterMaxRedirectionException
jedis老版本,可能会出现在集群中某个节点故障还没完整自动切换恢复时,频繁更新hash slot,频繁ping 节点检查活跃,导致大量IO开销
jedis 现在的版本,对于这些过度的hash slot更新和ping,都进行了优化,避免了类似问题

hash slot 迁移和ask重定向

如果hash slot正在迁移,那么会返回ask重定向给jedis
jedis 接收到ask重定向之后,会重新定位到目标节点去执行,但是因为ask发生在hash slot迁移过程中,所以不会更新hashslot本地缓存
moved 是会更新本地的hashslot -> node 映射表缓存的

高可用性与主备切换的原理

redis cluster 的高可用性原理,几乎和sentinal 是类似的

判断节点宕机

如果一个节点认为另外一个节点宕机,那么就是pfail,主观宕机
如果多个节点都认为另外一个节点宕机了,呢么就是fail,客观宕机,跟哨兵的原理几乎一样
再cluster-node-timeout内,某个节点一直没返回pong,那么就认为pfail
如果一个节点认为某个节点pfaila了,那么会在gossip ping消息中,ping给其他节点,如果超过半数的节点都认为pfail了,那么就会变成fail

从节点过滤

对宕机的master node ,从其所有的slave node中,选择一个切换成master node
检车每个slave node 与master node断开连接的时间,如果说超过了 cluster -node-timeout * cluster-slave-validity-factor,那么就没有资格切换成master
这个也是跟哨兵是一样的,从节点超时过滤的步骤

从节点选举

每个从节点,都根据自己对master 复制数据的offset,来设置一个选举时间,offset 越大(复制数据越多) 的从节点,选举时间越靠前,优先进行选举,offset越大的从节点,选举的时间越靠前
所有的master node开始slave投票,给所有的slave进行投票,如果大部分master node(N/2 + 1)都投票给了某个从节点,那么选举通过,那个从节点可以切换成为master,从节点执行主备切换,从节点切换成为主节点

哨兵: 对所有的从节点进行排序,slave priority, offset, run id

与哨兵比较

整个流程跟哨兵相比,非常类似,所以说 redis cluster功能强大,直接继承了replication 和sentinal 的功能

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
5天前
|
存储 消息中间件 缓存
Redis缓存技术详解
【5月更文挑战第6天】Redis是一款高性能内存数据结构存储系统,常用于缓存、消息队列、分布式锁等场景。其特点包括速度快(全内存存储)、丰富数据类型、持久化、发布/订阅、主从复制和分布式锁。优化策略包括选择合适数据类型、设置过期时间、使用Pipeline、开启持久化、监控调优及使用集群。通过这些手段,Redis能为系统提供高效稳定的服务。
|
11天前
|
存储 缓存 NoSQL
【Go语言专栏】Go语言中的Redis操作与缓存应用
【4月更文挑战第30天】本文探讨了在Go语言中使用Redis进行操作和缓存应用的方法。文章介绍了Redis作为高性能键值存储系统,用于提升应用性能。推荐使用`go-redis/redis`库,示例代码展示了连接、设置、获取和删除键值对的基本操作。文章还详细阐述了缓存应用的步骤及常见缓存策略,包括缓存穿透、缓存击穿和缓存雪崩的解决方案。利用Redis和合适策略可有效优化应用性能。
|
14天前
|
存储 缓存 NoSQL
Redis多级缓存指南:从前端到后端全方位优化!
本文探讨了现代互联网应用中,多级缓存的重要性,特别是Redis在缓存中间件的角色。多级缓存能提升数据访问速度、系统稳定性和可扩展性,减少数据库压力,并允许灵活的缓存策略。浏览器本地内存缓存和磁盘缓存分别优化了短期数据和静态资源的存储,而服务端本地内存缓存和网络内存缓存(如Redis)则提供了高速访问和分布式系统的解决方案。服务器本地磁盘缓存因I/O性能瓶颈和复杂管理而不推荐用于缓存,强调了内存和网络缓存的优越性。
40 1
|
1天前
|
缓存 NoSQL 应用服务中间件
Redis多级缓存
Redis多级缓存
7 0
|
1天前
|
缓存 NoSQL 关系型数据库
Redis 缓存 一致性
Redis 缓存 一致性
5 0
|
1天前
|
缓存 监控 NoSQL
Redis经典问题:缓存穿透
本文介绍了缓存穿透问题在分布式系统和缓存应用中的严重性,当请求的数据在缓存和数据库都不存在时,可能导致数据库崩溃。为解决此问题,提出了五种策略:接口层增加校验、缓存空值、使用布隆过滤器、数据库查询优化和加强监控报警机制。通过这些方法,可以有效缓解缓存穿透对系统稳定性的影响。
47 3
|
2天前
|
监控 NoSQL 关系型数据库
深入浅出Redis(五):Redis的事务机制与ACID原则
深入浅出Redis(五):Redis的事务机制与ACID原则
|
2天前
|
缓存 NoSQL 搜索推荐
Redis缓存雪崩穿透等解决方案
本文讨论了缓存使用中可能出现的问题及其解决方案。首先,缓存穿透是指查询数据库中不存在的数据,导致请求频繁到达数据库。解决方法包括数据校验、缓存空值和使用BloomFilter。其次,缓存击穿是大量请求同一失效缓存项,可采取监控、限流或加锁策略。再者,缓存雪崩是大量缓存同时失效,引发数据库压力。应对措施是避免同一失效时间,分散缓存过期。接着,文章介绍了Spring Boot中Redis缓存的配置,包括缓存null值以防止穿透,并展示了自定义缓存过期时间的实现,以避免雪崩效应。最后,提供了在`application.yml`中配置不同缓存项的个性化过期时间的方法。
|
2天前
|
消息中间件 缓存 NoSQL
Redis经典问题:缓存雪崩
本文介绍了Redis缓存雪崩问题及其解决方案。缓存雪崩是指大量缓存同一时间失效,导致请求涌入数据库,可能造成系统崩溃。解决方法包括:1) 使用Redis主从复制和哨兵机制提高高可用性;2) 结合本地ehcache缓存和Hystrix限流降级策略;3) 设置随机过期时间避免同一时刻大量缓存失效;4) 使用缓存标记策略,在标记失效时更新数据缓存;5) 实施多级缓存策略,如一级缓存失效时由二级缓存更新;6) 通过第三方插件如RocketMQ自动更新缓存。这些策略有助于保障系统的稳定运行。
96 1
|
3天前
|
存储 缓存 运维
【Docker 专栏】Docker 镜像的分层存储与缓存机制
【5月更文挑战第8天】Docker 镜像采用分层存储,减少空间占用并提升构建效率。每个镜像由多个层组成,共享基础层(如 Ubuntu)和应用层。缓存机制加速构建和运行,通过检查已有层来避免重复操作。有效管理缓存,如清理无用缓存和控制大小,可优化性能。分层和缓存带来资源高效利用、快速构建和灵活管理,但也面临缓存失效和层管理挑战。理解这一机制对开发者和运维至关重要。
【Docker 专栏】Docker 镜像的分层存储与缓存机制