Redis 集群是 Redis 的⼀种分布式运⾏模式,它通过分⽚(sharding)来提供数据的⾃动分区和管理,从⽽实现数据的⾼可⽤性和可扩展性。
在集群模式下,数据被分割成多个部分(称为槽或slots),分布在多个 Redis 节点上。
集群中的节点分为主节点和从节点:主节点负责读写请求和集群信息的维护;从节点只进⾏主节点数据和状态信息的复制。
Redis集群的作⽤
数据分区:数据分区(或称数据分⽚)是集群最核心的功能。 集群将数据分散到多个节点,⼀⽅⾯突破了Redis单机内存⼤⼩的限制,存储容量⼤⼤增加;另⼀⽅⾯每个主节点都可以对外提供读服务和写服务,⼤⼤提⾼了集群的响应能⼒。 Redis单机内存⼤⼩受限问题,在介绍持久化和主从复制时都有提及;例如,如果单机内存太⼤,bgsave和bgrewriteaof的fork操作可能导致主进程阻塞,主从环境下主机切换时可能导致从节点⻓时间⽆法提供服务,全量复制阶段主节点的复制缓冲区可能溢出。
⾼可⽤:集群支持主从复制和主节点的⾃动故障转移(与哨兵类似);当任⼀节点发⽣故障时,集群仍然可以对外提供服务。
Redis集群的数据分⽚
Redis集群引⼊了哈希槽的概念 Redis集群有16384个哈希槽(编号0-16383) 集群的每个节点负责⼀部分哈希槽 每个Key通过CRC16校验后对16384取余来决定放置哪个哈希槽,通过这个值,去找到对应的插槽所对应的节点,然后直接⾃动跳转到这个对应的节点上进⾏存取操作。
- 以3个节点组成的集群为例: 节点A包含0到5460号哈希槽 节点B包含5461到10922号哈希槽 节点C包含10923到16383号哈希槽
- Redis集群的主从复制模型 集群中具有A、B、C三个节点,如果节点B失败了,整个集群就会因缺少5461-10922这个范围的槽⽽不可以⽤。
为每个节点添加⼀个从节点A1、B1、C1整个集群便有三个Master节点和三个slave节点组成,在节点B失败后,集群选举B1位为的主节点继续服务。当B和B1都失败后,集群将不可⽤
Redis Cluster被配置为三主三从模式。这意味着每台服务器上的两个Redis节点中,⼀个节点作为主库(master),另⼀个作为从库(slave)。
redis 集群配置准备
-- 创建集群配置⽂件夹,将下⾯的配置复制过去,另外两个机器重复这个过程
mkdir -p /opt/software/redis/redis-7.0.15/cluster
mkdir -p /opt/software/redis/cluster
vim ./cluster/redis_6379.conf
vim ./cluster/redis_6380.conf
-- 配置⽂件准备完成之后,启动所有redis服务,⽤cluster配置⽂件
redis-server ./cluster/redis_6379.conf
redis-server ./cluster/redis_6380.conf
-- 检查服务
ps aux | grep redis
-- 创建三主三从集群模式,每⼀个主节点带⼀个从节点
redis-cli --cluster create --cluster-replicas 1 192.168.199.128:6379 192.168.199.128:6380 192.168.199.129:6379 192.168.199.129:6380 192.168.199.130:6379 192.168.199.130:6380
-- 查看集群信息
redis-cli cluster info
-- 查看单个节点信息
redis-cli info replication
-- 查看集群节点身份信息
redis-cli cluster nodes
-- 停⽌redis服务
redis-cli -p 6379 shutdown
redis-cli -p 6380 shutdown
6379配置
#允许所有的IP地址
bind * -::*
#后台运⾏
daemonize yes
#允许远程连接
protected-mode no
#开启集群模式
cluster-enabled yes
#集群节点超时时间
cluster-node-timeout 5000
#配置数据存储⽬录
dir "/opt/software/redis/cluster"
#开启AOF持久化
appendonly yes
#端⼝
port 6379
#log⽇志
logfile "/opt/software/redis/redis-7.0.15/cluster/redis6379.log"
#集群配置⽂件
cluster-config-file nodes-6379.conf
#AOF⽂件名
appendfilename "appendonly6379.aof"
#RBD⽂件名
dbfilename "dump6379.rdb"
6380配置
#允许所有的IP地址
bind * -::*
#后台运⾏
daemonize yes
#允许远程连接
protected-mode no
#开启集群模式
cluster-enabled yes
#集群节点超时时间
cluster-node-timeout 5000
#配置数据存储⽬录
dir "/opt/software/redis/cluster"
#开启AOF持久化
appendonly yes
#端⼝
port 6380
#log⽇志
logfile "/opt/software/redis/redis-7.0.15/cluster/redis6380.log"
#集群配置⽂件
cluster-config-file nodes-6380.conf
#AOF⽂件名
appendfilename "appendonly6380.aof"
#RBD⽂件名
dbfilename "dump6380.rdb"
Redis 集群数据读写
-- 连接⼀个主节点进⾏写数据
redis-cli info replication
-- 直接连接读写可能会出现以下问题,是因为不同的节点的槽位不同,图中就是提示我们去132:6379进⾏写⼊数据 -- 不过我们也可以开启路由规则 -c,进⾏处理
redis-cli -c
-- 重新写⼊数据,恢复正常。
set k1 b1
模拟故障转移
-- 注意机器ip的区分
-- 将129机器的主节点给⼲掉(129的6379服务)
redis-cli -p 6379 shutdown
-- 查看129机器从节点⼯作⽇志(131的6380⽇志)
cat redis6380.log
-- 在切换到132机器上查看当前集群节点信息,131:6380已经升为主节点
redis-cli cluster nodes
-- 在重新启动129.6379服务
redis-server ./cluster/redis_6379.conf
-- 查看129.6379的节点信息,主节点变为从节点
redis-cli -p 6379 info replication
-- 观察131.6380⽇志,129.6379 重新加⼊集群