Redis Cluster
Redis Cluster
Redis-Cluster 集群概念
(1)由多个Redis服务器组成的分布式网络服务集群;
(2)集群之中有多个Master主节点,每一个主节点都可读可写;
(3)节点之间会互相通信,两两相连;
(4)Redis集群无中心节点。
集群节点复制
在Redis-Cluster集群中,可以给每一个主节点添加从节点,主节点和从节点直接遵循主从模型的特性。
当用户需要处理更多读请求的时候,添加从节点可以扩展系统的读性能。
故障转移
Redis集群的主节点内置了类似Redis Sentinel的节点故障检测和自动故障转移功能,当集群中的某个主节点下线时,集群中的其他在线主节点会注意到这一点,并对已下线的主节点进行故障转移。
集群进行故障转移的方法和Redis Sentinel进行故障转移的方法基本一样,不同的是,在集群里面,故障转移是由集群中其他在线的主节点负责进行的,所以集群不必另外使用Redis Sentinel。
集群分片策略
Redis-cluster分片策略,是用来解决key存储位置的。
集群将整个数据库分为16384个槽位slot,所有key-value数据都存储在这些slot中的某一个上。一个slot槽位可以存放多个数据,key的槽位计算公式为:slot_number=crc16(key)%16384
,其中crc16为16位的循环冗余校验和函数。
集群中的每个主节点都可以处理0个至16383个槽,当16384个槽都有某个节点在负责处理时,集群进入上线状态,并开始处理客户端发送的数据命令请求。
Redis 集群使用数据分片(sharding)而非一致性哈希(consistency hashing)来实现: 一个 Redis 集群包含 16384 个哈希槽(hash slot), 数据库中的每个键都属于这 16384 个哈希槽的其中一个, 集群使用公式 CRC16(key) % 16384 来计算键 key 属于哪个槽, 其中 CRC16(key) 语句用于计算键 key 的 CRC16 校验和 。
- 节点 A 负责处理 0 号至 5500 号哈希槽。
- 节点 B 负责处理 5501 号至 11000 号哈希槽。
- 节点 C 负责处理 11001 号至 16384 号哈希槽。
集群重定向
由于Redis集群无中心节点,请求会随机发给任意主节点;
主节点只会处理自己负责槽位的命令请求,其它槽位的命令请求,该主节点会返回客户端一个转向错误;
客户端根据错误中包含的地址和端口重新向正确的负责的主节点发起命令请求。
主从复制原理
图片来源于网络。
Redis-Cluster 集群搭建
手头资源有限,故采用单机部署集群(3主3从)
角色 | IP:PORT |
---|---|
master1 | 172.16.1.135:7001 |
slave1 | 172.16.1.135:7002 |
master2 | 172.16.1.135:7003 |
slave2 | 172.16.1.135:7004 |
master3 | 172.16.1.135:7005 |
slave3 | 172.16.1.135:7006 |
在/etc/redis
目录下创建一个redis-cluster
的文件夹,里面存放各节点的配置文件:
将程序及配置文件分别复制到各个节点文件夹中去:
修改部分配置文件(以7001为例):
修改完配置文件之后,启动各 redis 节点:
查看各节点启动情况:
执行创建集群命令:
期间会让你确认配置信息,如果检查无误,输入yes
,然后回车即可.
到这里,Redis-Cluster 部署就完成了。
查询集群信息,登录任意节点即可查询集群信息:
可以看到集群分片的情况,及其他详细的相关信息。
测试,某一主节点挂掉:
slave1 已成功上任~
附录:快速搭建测试环境
参考链接
- redis cluster-tutorial: https://redis.io/topics/cluster-tutorial/