Redis集群详述(从服务内部讲解,这次看完真的懂了,面试官再怎么问也能轻轻松松!)

本文详细介绍了Redis集群的工作原理,包括哈希槽的概念、节点内部结构如clusterNode、clusterLink和custerState,以及集群操作如槽指派、节点迁移。通过实例解析了客户端如何找到正确节点、槽的迁移过程以及故障处理机制,帮助读者深入理解Redis集群的运行机制,以应对面试和实际操作中的问题。
摘要由CSDN通过智能技术生成

   本文已收录于专栏

❤️《Redis精通系列》❤️

上千人点赞收藏,全套Redis学习资料,大厂必备技能!


目录

1、简介

2、集群内部

2.1 clsuterNode

2.3 custerState

3、集群工作

3.1 槽(slot)如何指派?

3.2 ADDSLOTS 在Redis集群内部是如何实现的呢?

3.3 集群这么多节点,客户端怎么知道请求哪个节点?

3.4 如果我想将已经分配给A节点的槽重新分配给B节点,怎么整?

3.5 如果客户端访问的key所属的槽正在迁移怎么办?

4、集群故障


1、简介

Redis集群是Redis提供的分布式数据库方案,集群通过分片(sharding)进行数据共享,Redis集群主要实现了以下目标:

  • 在1000个节点的时候仍能表现得很好并且可扩展性是线性的。

  • 没有合并操作(多个节点不存在相同的键),这样在 Redis 的数据模型中最典型的大数据值中也能有很好的表现。

  • 写入安全,那些与大多数节点相连的客户端所做的写入操作,系统尝试全部都保存下来。但是Redis无法保证数据完全不丢失,异步同步的主从复制无论如何都会存在数据丢失的情况。

  • 可用性,主节点不可用,从节点能替换主节点工作。

关于Redis集群的学习,如果没有任何经验的弟兄们建议先看下这三篇文章(中文系列): Redis集群教程

REDIS cluster-tutorial -- Redis中文资料站 -- Redis中国用户组(CRUG)

Redis集群规范

REDIS cluster-spec -- Redis中文资料站 -- Redis中国用户组(CRUG)

Redis3主3从伪集群部署

CentOS 7单机安装Redis Cluster(3主3从伪集群),仅需简单五步_李子捌的博客-CSDN博客

下文内容依赖下图三主三从结构开展:

8624ecbdf7f691d78ef48bc5afdb6d18.png

资源清单:

节点 IP 槽(slot)范围
Master[0] 192.168.211.107:6319 Slots 0 - 5460
Master[1] 192.168.211.107:6329 Slots 5461 - 10922
Master[2] 192.168.211.107:6339 Slots 10923 - 16383
Slave[0] 192.168.211.107:6369
Slave[1] 192.168.211.107:6349
Slave[2] 192.168.211.107:6359

Redis集群.png

2、集群内部

Redis 集群没有使用一致性hash, 而是引入了 哈希槽的概念。Redis 集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽,这种结构很容易添加或者删除节点。集群的每个节点负责一部分hash槽,比如上面资源清单的集群有3个节点,其槽分配如下所示:

  • 节点 Master[0] 包含 0 到 5460 号哈希槽

  • 节点 Master[1] 包含5461 到 10922 号哈希槽

  • 节点 Master[2] 包含10923到 16383 号哈希槽

深入学习Redis集群之前,需要了解集群中Redis实例的内部结构。当某个Redis服务节点通过cluster_enabled配置为yes开启集群模式之后,Redis服务节点不仅会继续使用单机模式下的服务器组件,还会增加custerState、clusterNode、custerLink等结构用于存储集群模式下的特殊数据。 ​

如下三个数据承载对象一定要认真看,尤其是结构中的注释,看完之后集群大体上怎么工作的,心里就有数了,嘿嘿嘿;

2.1 clsuterNode

clsuterNode用于存储节点信息,比如节点的名字、IP地址、端口信息和配置纪元等等,以下代码列出部分非常重要的属性:

typedef struct clsuterNode {

    // 创建时间
    mstime_t ctime;
    
    // 节点名字,由40位随机16进制的字符组成(与sentinel中讲的服务器运行id相同)
    char name[REDIS_CLUSTER_NAMELEN];
    
    // 节点标识,可以标识节点的角色和状态
    // 角色 -> 主节点或从节点 例如:REDIS_NODE_MASTER(主节点) REDIS_NODE_SLAVE(从节点)
    // 状态 -> 在线或下线 例如:REDIS_NODE_PFAIL(疑似下线) REDIS_NODE_FAIL(下线) 
    int fl
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李子捌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值