本文已收录于专栏
上千人点赞收藏,全套Redis学习资料,大厂必备技能!
目录
3.2 ADDSLOTS 在Redis集群内部是如何实现的呢?
3.4 如果我想将已经分配给A节点的槽重新分配给B节点,怎么整?
1、简介
Redis集群是Redis提供的分布式数据库方案,集群通过分片(sharding)进行数据共享,Redis集群主要实现了以下目标:
-
在1000个节点的时候仍能表现得很好并且可扩展性是线性的。
-
没有合并操作(多个节点不存在相同的键),这样在 Redis 的数据模型中最典型的大数据值中也能有很好的表现。
-
写入安全,那些与大多数节点相连的客户端所做的写入操作,系统尝试全部都保存下来。但是Redis无法保证数据完全不丢失,异步同步的主从复制无论如何都会存在数据丢失的情况。
-
可用性,主节点不可用,从节点能替换主节点工作。
关于Redis集群的学习,如果没有任何经验的弟兄们建议先看下这三篇文章(中文系列): Redis集群教程
Redis集群规范
Redis3主3从伪集群部署
下文内容依赖下图三主三从结构开展:
资源清单:
节点 | 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 |
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