百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

讲讲Redis Cluster原理及通信协议?Key如何选择Master及主备切换?

mhr18 2024-11-14 16:26 27 浏览 0 评论

主从架构及哨兵架构都是一主多从,可读写分离,不用考虑Key存那一天机器上,但redis cluster是多主多从的,那在设置值的时候,key是如何选主的呢?

1、Redis Cluster的hash slot(哈希槽)算法

redis cluster有固定的16384个hash slot,对每个key计算CRC16值,然后对16384取模,可以获取key对应的hash slot。

redis cluster中每个master都会持有部分slot,比如有3个master,那么可能每个master持有5000多个hash slot。任何一台宕机,不影响另外两个节点,因为key找的是hash slot不是机器。

hash slot让node的增加和移除很简单,增加一个master,就将其他master的hash slot移动部分过去,减少一个master,就将它的hash slot移动到其他master上去,移动hash slot的成本是非常低的。

客户端的api,可以对指定的数据,让他们走同一个hash slot,通过hash tag来实现。

2、HashTags

通过分片手段,可以将数据合理地划分到不同的节点上,这本来就是一件好事。但是有的时候,我们希望对相关联的业务以原子的方式进行操作。

举个简单的例子:

我们在单节点上执行MSET , 它是一个原子性的操作,所有给定的key会在同一时间内被设置,不可能出现某些指定的key被更新另一些指定的key没有改变的情况。但是在集群环境下,我们仍然可以执行MSET命令,但它的操作不在是原子操作,会存在某些指定的key被更新,而另外一些指定的key没有改变,原因是多个key可能会被分配到不同的机器上。

这个也是在面试的时候会容易被问到的内容。怎么解决呢?

在redis中引入了HashTag的概念,可以使得数据分布算法可以根据key的某一个部分进行计算,然后让相关的key落到同一个数据分片举个简单的例子,加入对于用户的信息进行存储, user:{user1}:id、user:{user1}:name那么通过hashtag的方式,表示当一个key包含 {} 的时候,就不对整个key做hash,而仅对 {} 包括的字符串做hash。

3、槽迁移的过程

槽迁移的过程中有一个不稳定状态,这个不稳定状态会有一些规则,这些规则定义客户端的行为,从而使得Redis Cluster不必宕机的情况下可以执行槽的迁移。下面描述了我们迁移编号为1、2、3的槽的过程中,他们在MasterA节点和MasterB节点中的状态。

简单的工作流程:

1. 向MasterB发送状态变更命令,把Master B对应的slot状态设置为importing。

2. 向MasterA发送状态变更命令,将Master对应的slot状态设置为migrating。

当MasterA的状态设置为migrating后,表示对应的slot正在迁移,为了保证slot数据的一致性,MasterA此时对于slot内部数据提供读写服务的行为和正常状态下是有区别的。

migrating状态

1. 如果客户端访问的Key还没有迁移出去,则正常处理这个key。

2. 如果key已经迁移或者根本就不存在这个key,则回复客户端ASK信息让它跳转到MasterB去执行。

importing状态

当MasterB的状态设置为importing后,表示对应的slot正在向MasterB迁入,及时Master仍然能对外提供该slot的读写服务,但和正常状态下也是有区别的。

1. 当来自客户端的正常访问不是从ASK跳转过来的,说明客户端还不知道迁移正在进行,很有可能操作了一个目前还没迁移完成的并且还存在于MasterA上的key,如果此时这个key在A上已经被修改了,那么B和A的修改则会发生冲突。所以对于MasterB上的slot的所有非ASK跳转过来的操作,MasterB都不会一一去护理,而是通过MOVED命令让客户端跳转到MasterA上去执行。这样的状态控制保证了同一个key在迁移之前总是在源节点上执行,迁移后总是在目标节点上执行,防止出现两边同时写导致的冲突问题。

2. 而且迁移过程中新增的key一定会在目标节点上执行,源节点也不会新增key,使得整个迁移过程既能对外正常提供服务,又能在一定的时间点完成slot的迁移。

4、redis cluster节点间采取gossip协议进行通信

gossip协议包含多种消息,包括ping,pong,meet,fail,等等。

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

当然如果发现某个节点通信延时达到了cluster_node_timeout / 2,那么立即发送ping,避免数据交换延时过长,落后的时间太长。

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

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

当我们在集群下用redis-cli set mykey1 v1设置KEY时,会发现这个key对应的hashslot如果就在自己本地,那么自己就处理掉了,但是如果计算出来的hashslot在其他master上,那么就会给客户端返回一个moved error,告诉你,你得到哪个master上去执行这条写入的命令,那当前的master是如何知道这个KEY的hashslot是在那台机器上的呢?

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

所以命令用redis-cli的时候,可以加入-c参数,支持自动的请求重定向,redis-cli接收到moved之后,会自动重定向到对应的节点执行命令。

5、redis cluster主备切换原理(Redis Cluster集群如何选主的?)

1、判断节点宕机

如果一个节点认为另外一个节点宕机,那么就是pfail,主观宕机。

如果多个节点都认为另外一个节点宕机了,那么就是fail,客观宕机,跟哨兵的原理几乎一样,sdown,odown。

在cluster-node-timeout内,某个节点一直没有返回pong,那么就被认为pfail。

如果一个节点认为某个节点pfail了,那么会在gossip ping消息中,ping给其他节点,如果超过半数的节点都认为pfail了,那么就会变成fail。

2、从节点过滤

对宕机的master node,从所有的slave node中,选择一个切换成master node,检查每个slave node与master node断开连接的时间,如果超过了cluster-node-timeout * cluster-slave-validity-factor,那么就没有资格切换成master。

3、从节点选举

对所有从节点进行排序,slave priority,offset,run id。

每个从节点,都根据自己对master复制数据的offset,来设置一个选举时间,offset越大(复制数据越多)的从节点,选举时间越靠前,优先进行选举。

所有的master node开始slave选举投票,给要进行选举的slave进行投票,如果大部分master node(N/2 + 1)都投票给了某个从节点,那么选举通过,那个从节点可以切换成master。



6、与哨兵比较

1、Cluster实现了主从复制及哨兵的所有功能,并增加了多主多从的高可用架构。

2、在选举方面,整个流程跟哨兵相比,非常类似,哨兵是sdown odown ?式先授权哨兵作为切换者,并根据save同步相关数据比对来进行选主,而cluster是pfail fail对save之间进行广播授权,通过对epoch大小及判断master来进行选举投票选主。

3、在通信上,redis cluster采用的是gossip的方式通信,而哨兵是通过redis的pub/sub系统实现的,每个哨兵都会往sentinel这个channel里发送一个消息,这时候所有其他哨兵都可以消费到这个消息,并感知到其他的哨兵的存在并进行通信。

到此,redis的主从架构、哨兵架构之前有分享过及redis cluster架构我们都讲了,但redis还会问到这些问题,你都会回答么?

redis如何实现分布式锁以及有哪些不同的实现方式?

redis分布式锁与ZK分布式锁的区别?

redis缓存穿透?缓存击穿?缓存雪崩?

等一系列问题我们下节讲分享。

相关推荐

Redis教程——数据类型(字符串、列表)

上篇文章我们学习了Redis教程——Redis入门,这篇文章我们学习Redis教程——数据类型(字符串、列表)。Redis数据类型有:字符串、列表、哈希表、集合、有序集合、地理空间、基数统计、位图、位...

说说Redis的数据类型(redis数据类型详解)

一句话总结Redis核心数据类型包括:String:存储文本、数字或二进制数据。List:双向链表,支持队列和栈操作。Hash:字段-值映射,适合存储对象。Set:无序唯一集合,支持交并差运算。Sor...

Redis主从复制(Redis主从复制复制文件)

介绍Redis有两种不同的持久化方式,Redis服务器通过持久化,把Redis内存中持久化到硬盘当中,当Redis宕机时,我们重启Redis服务器时,可以由RDB文件或AOF文件恢复内存中的数据。不过...

深入解析 Redis 集群的主从复制实现方式

在互联网大厂的后端开发领域,Redis作为一款高性能的内存数据库,被广泛应用于缓存、消息队列等场景。而Redis集群中的主从复制机制,更是保障数据安全、实现读写分离以及提升系统性能的关键所在。今...

Redis + MQ:高并发秒杀的技术方案与实现

大家好,我是一安~前言在电商秒杀场景中,瞬间爆发的海量请求往往成为系统的生死考验。当并发量达到数万甚至数十万QPS时,传统数据库单表架构难以支撑,而Redis与消息队...

Redis面试题2025(redis面试题及答案2024)

Redis基础什么是Redis?它的主要特点是什么?Redis和Memcached有什么区别?Redis支持哪些数据类型?Redis的字符串类型最大能存储多少数据?Redis的列表类型和集合类型有什么...

Redis学习笔记:过期键管理与EXPIRE命令详解(第七章)

在Redis中,过期键(ExpireKey)机制是实现缓存自动失效、临时数据管理的核心功能。EXPIRE命令作为设置键过期时间的基础工具,其工作原理与使用细节直接影响系统的内存效率和数据一致性。本章...

Redis传送术:几分钟内将生产数据迁移到本地

在生产环境中使用Redis就像一把双刃剑。它快速、强大,存储了大量实时数据——但当你想要在本地调试问题或使用真实数据进行测试时,事情就变得棘手了。我们要做什么?我们想要从生产环境Redis实例中导出键...

使用redis bitmap计算日活跃用户数

Metrics(指标)在允许延迟的情况下,通常通过job任务定时执行(如按小时、每天等频率),而基于Redis的Bitmap使我们能够实时完成此类计算,且极其节省空间。以亿级用户计算“日活跃用户...

大部分.NET开发者都不知道的Redis性能优化神技!

你还在为Redis存储空间不够而发愁吗?还在为Json数据太大导致网络传输缓慢而头疼吗?今天我要告诉你一个让Redis性能飙升300%的秘密武器!这个技巧简单到让你怀疑人生,但效果却强大到让你的老板对...

Redis学习笔记:内存优化实战指南(第六章)

Redis作为内存数据库,内存使用效率直接影响系统性能与成本。对于处理大规模数据的场景,合理的内存优化能显著降低资源消耗,提升服务稳定性。本章将基于Redis的内存管理特性,详解实用的优化技巧与最佳实...

大数据-47 Redis 内存控制、Key 过期与数据...

点一下关注吧!!!非常感谢!!持续更新!!!AI篇持续更新中!(长期更新)AI炼丹日志-30-新发布【1T万亿】参数量大模型!Kimi-K2开源大模型解读与实践,持续打造实用AI工具指南!...

Redis学习笔记:内存优化进阶与实战技巧(第六章·续)

上一节我们介绍了Redis内存优化的基础策略,本节将深入更多实战技巧,包括数据结构的精细化选择、过期键的内存回收机制,以及大规模场景下的内存管理方案,帮助你在高并发场景下进一步提升内存利用率。七、数据...

低配服务器(2核3G)宝塔面板的Redis优化指南:512MB内存高效运行

在2核3G内存的低配服务器上部署Redis服务时,资源分配不当极易导致服务器崩溃。本文针对宝塔面板环境(PHP8.2+MariaDB10.6+Nginx),提供经过实战验证的Redis优化...

Redis:为什么您应该多缓存少查询(为什么使用redis做缓存而不是其他的消息队列入kafka)

还在一次又一次地调用相同的API吗?这不仅效率低下——而且成本高昂。性能缓慢、成本更高,用户体验更差。让我们停止这种做法——从这篇文章开始。:D首先您需要了解Redis,简单来说,它是一个超快速的内存...

取消回复欢迎 发表评论: