Redis基础系列-集群模式
文章目录
- Redis基础系列-集群模式
- 1.什么是集群模式?
- 2.集群模式原理
- 2.1 集群中的哈希槽(slot)
- 2.2 集群的分片
- 2.3 节点通信
- 2.3 CRC16算法
- 2.3 读写过程
- 3.集群模式部署
- 4.集群常用命令
- 5.集群验证
- 6. 主从容错切换
- 6.主从扩容
- 6.1 新增master
- 6.2 重新分派槽号
- 6.3 新增slave加入集群
- 6.4 为什么新节点分配的槽位不是连续的?
- 7. 主从缩容
- 7.1 删除从机节点
- 7.2 删除master集群节点
- 7.3 清空槽位将槽位分配给192.168.111.147:6381
- 8. 参考和感谢
- 9. 下载完整的redis集群配置
Redis基础系列-集群模式
1.什么是集群模式?
Redis集群是一种分布式数据库解决方案,通过多节点协同工作实现高可用性、数据分片存储和负载均衡。核心特点包括:
- 水平扩展:数据分散存储至16384个哈希槽,支持TB级数据量
- 故障自愈:主节点宕机时,从节点自动接替(需哨兵或Cluster模式支持)
- 去中心化架构:每个节点保存集群状态信息,避免单点故障
2.集群模式原理
2.1 集群中的哈希槽(slot)
Redis集群没有使用一致性hash,而是引入了哈希槽的概念
Redis集群有16384个哈希槽,每个key通过校验CRC16校验后对16384去模来决定放置那个槽位,集群中的每个节点负责一部分哈希槽,例如:
2.2 集群的分片
使用Redis集群时我们会将存储的数据分散到多台redis机器上,这称为分片。简言之,集群中的每个Redis实例都被认为是整个数据的一个分片。
2.3 节点通信
- 通信端口规则
- 数据端口:默认
6379
(可自定义,如7000-7010) - 集群总线端口:数据端口 + 10000(如6379 → 16379)
注:这是集群节点间专用通信通道,需确保防火墙开放此端口段
- 核心通信协议
Redis集群采用混合通信模式,结合Gossip协议与集中式消息广播:
通信类型 | 协议 | 端口 | 频率 | 功能说明 |
---|---|---|---|---|
节点发现 | Gossip(PING/PONG) | 总线端口 | 每秒10次 | 交换节点状态和槽位信息 |
故障检测 | 集中式广播 | 总线端口 | 实时触发 | 主节点下线通知和从节点晋升 |
数据迁移 | 自定义二进制 | 数据端口 | 按需触发 | 槽位重分配时的键值迁移 |
- 通信流程示例
2.3 CRC16算法
CRC16(Cyclic Redundancy Check 16)是Redis集群用于数据分片的核心哈希算法,它将任意长度的键名转换为0-16383之间的固定范围值(哈希槽编号)。
-取余
-环形取余
2.3 读写过程
3.集群模式部署
-
集群相关软件配置下载
redis镜像下载 -
三主三从集群机构,三台机子,使用docker部署
192.168.10.111 6381
192.168.10.111 6382192.168.10.112 6383
192.168.10.112 6384192.168.10.113 6385
192.168.10.113 6386
- 准备目录
mkdir -p /home/jykj/redisCluster
chmod -R 777 /home/jykj/redisCluster
- 防火墙端口开放
firewall-cmd --zone=public --add-port=6381/tcp --permanent
firewall-cmd --zone=public --add-port=6382/tcp --permanent
firewall-cmd --zone=public --add-port=6383/tcp --permanent
firewall-cmd --zone=public --add-port=6384/tcp --permanent
firewall-cmd --zone=public --add-port=6385/tcp --permanent
firewall-cmd --zone=public --add-port=6386/tcp --permanentfirewall-cmd --zone=public --add-port=16381/tcp --permanent
firewall-cmd --zone=public --add-port=16382/tcp --permanent
firewall-cmd --zone=public --add-port=16383/tcp --permanent
firewall-cmd --zone=public --add-port=16384/tcp --permanent
firewall-cmd --zone=public --add-port=16385/tcp --permanent
firewall-cmd --zone=public --add-port=16386/tcp --permanentfirewall-cmd --reloadfirewall-cmd --zone=public --query-port=6383/tcp
- 三台机器六个节点的配置
vim redisCluster3681.conf
bind 0.0.0.0
daemonize no
protected-mode no
port 6381
logfile "/home/jykj/redisCluster/redis6381.log"
pidfile /home/jykj/redisCluster/redis6381.pid
dir /home/jykj/redisCluster
dbfilename dump6381.rdb
appendonly yes
appendfilename "appendonly6381.aof"
requirepass 111111
masterauth 111111cluster-enabled yes
cluster-config-file nodes-6381.conf
cluster-node-timeout 5000
- redis容器实例构建命令
docker run -d --name redisCluster6386 \
--restart=always \
--privileged=true \
--network=host \
-v /home/jykj/redisCluster:/home/jykj/redisCluster \
redis:7.4.2 redis-server /home/jykj/redisCluster/redis6386.conf
- 创建集群主从关系
docker exec -it redisCluster6381 \
redis-cli -a 111111 --cluster create \
--cluster-replicas 1 --cluster-yes --cluster-timeout 15000 \
192.168.10.111:6381 192.168.10.111:6382 \
192.168.10.112:6383 192.168.10.112:6384 \
192.168.10.113:6385 192.168.10.113:6386
# 先清理所有节点(在6台主机分别执行)
docker exec redisCluster6385 redis-cli -a 111111 -p 6385 flushall
docker exec redisCluster6385 redis-cli -a 111111 -p 6385 cluster reset hard
docker exec redisCluster6386 redis-cli -a 111111 -p 6386 flushall
docker exec redisCluster6386 redis-cli -a 111111 -p 6386 cluster reset hard # 带健康检查的集群重建(推荐)
docker exec -it redisCluster6381 redis-cli -a 111111 -p 6381 --cluster create \
--cluster-replicas 1 --cluster-yes --cluster-timeout 20000 \
192.168.10.111:6381 192.168.10.111:6382 \
192.168.10.112:6383 192.168.10.112:6384 \
192.168.10.113:6385 192.168.10.113:6386
4.集群常用命令
查看集群信息
<!--进入redis-->
redis-cli -p 6381<!--查看信息-->
cluster info<!--查看节点-->
cluster nodes<!--xxx-->
info replication<!--查看key的槽位-->
cluster keyslot k1<!--检查节点信息-->
redis-cli --cluster check 172.17.0.1:6381
命令 | 功能 | 示例 |
---|---|---|
CLUSTER NODES | 查看节点拓扑 | redis-cli -p 7000 cluster nodes |
CLUSTER INFO | 检查集群状态 | redis-cli -p 7000 cluster info |
CLUSTER SLOTS | 查看槽位分布 | redis-cli -p 7000 cluster slots |
CLUSTER FAILOVER | 手动故障转移 | 在从节点执行触发主从切换 |
INFO REPLICATION | 查看主从复制状态 | redis-cli -p 7000 info replication |
5.集群验证
- 主从关系(并不是我们一开始设定的顺序)
一定注意槽位的范围区间,需要路由到位
6. 主从容错切换
-
我们关掉6381,看看集群架构的变化
-
恢复6381,6381能否恢复上位(答案是不能)
-
集群不保证数据一致性100%OK,一定会有数据丢失情况
Redis集群不保证强一致性,这意味着在特定的条件下,Redis集群可能会丢掉一些被系统收到的写入请求命令
-
手动故障转移 or 节点从厘调整该如何处理
上面一换后6381、6384主从对调了,和原始设计图不一样了,该如何
重新登陆6381机器
6.主从扩容
6.1 新增master
进入新增的redis容器
新增的6387作为master节点加入集群
redis-cli --cluster add-node 自己实际IP地址:6387 自己实际IP地址:6381
6387 就是将要作为master新增节点
6381 就是原来集群节点里面的领路人,相当于6387拜拜6381的码头从而找到组织加入集群
6.2 重新分派槽号
命令:redis-cli --cluster reshard IP地址:端口号
redis-cli --cluster reshard 192.168.111.147:6381
6.3 新增slave加入集群
redis-cli --cluster add-node ip:新slave端口 ip:新master端口 --cluster-slave --cluster-master-id 新主机节点ID
6.4 为什么新节点分配的槽位不是连续的?
重新分配成本太高,所以前面的集群各自习出来 部分槽位,从旧节点分别匀出坑位给新节点
7. 主从缩容
7.1 删除从机节点
命令:redis-cli --cluster del-node ip:从机端口 从机6388节点ID
redis-cli --cluster del-node 192.168.111.147:6388 5d149074b7e57b802287d1797a874ed7a1a284a8
7.2 删除master集群节点
命令:redis-cli --cluster del-node ip:端口 6387节点ID
redis-cli --cluster del-node 192.168.111.147:6387 e4781f644d4a4e4d4b4d107157b9ba8144631451
7.3 清空槽位将槽位分配给192.168.111.147:6381
redis-cli --cluster reshard 192.168.111.147:6381
8. 参考和感谢
尚硅谷Redis零基础到进阶,最强redis7教程,阳哥亲自带练
9. 下载完整的redis集群配置
Redis集群配置和软件