Redis 集群模式
集群模式
Redis 集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽.集群的每个节点负责一部分hash槽,主从节点数据一致性的原理和主从模式一样
Redis集群运行原理如下:
1.所有的Redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽
2.节点的fail是通过集群中超过半数的节点检测失效时才生效
3.客户端与Redis节点直连,不需要中间proxy层,客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可
4.Redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster (簇)负责维护node<->slot<->value
。Redis集群中内置了16384个哈希槽,当需要在Redis集群中放置一个key-value时,Redis先对key使用crc16算法算出一个结果,然后把结果对 16384 求余数,这样每个key都会对应一个编号在 0-16383 之间的哈希槽,Redis 会根据节点数量大致均等的将哈希槽映射到不同的节点
怎么样投票
投票过程是集群中所有master参与,如果半数以上master节点与master节点通信超过cluster-node-timeout
设置的时间,认为当前master节点挂掉。
怎么样判定节点不可用
1.如果集群任意master挂掉,且当前master没有slave.集群进入fail状态,也可以理解成集群的slot映射[0-16383]不完整时进入fail状态。
2.如果集群超过半数以上master挂掉,无论是否有slave,集群进入fail状态,当集群不可用时,所有对集群的操作做都不可用,收到((error) CLUSTERDOWN The cluster is down)错误。
ruby环境
Redis集群管理工具redis-trib.rb依赖ruby环境,首先需要安装ruby环境:
安装ruby:
yum install ruby
yum install rubygems
但是这种安装方式装好的ruby版本可能不适用,如果安装失败,可以参考这篇文章解决(https://blog.csdn.net/fengye_yulu/article/details/77628094)
集群搭建
首先我们对集群做一个简单规划,假设我的集群中一共有三个节点,每个节点一个主机一个从机,这样我一共需要6个Redis实例。首先创建redis-cluster文件夹,在该文件夹下分别创建7001、7002、7003、7004、7005、7006文件夹,用来存放我的Redis配置文件,
将Redis也在redis-cluster目录下安装一份,然后将redis.conf文件向7001-7006这6个文件夹中分别拷贝一份,拷贝完成后,分别修改如下参数:
port 7001
#bind 127.0.0.1
cluster-enabled yes
cluster-config-XX XXX7001.conf
protected no
daemonize yes
这是7001目录下的配置,其他的文件夹将7001改为对应的数字即可。修改完成后,进入到redis安装目录中,分别启动各个redis,使用刚刚修改过的配置文件,
启动成功后,我们可以查看redis进程,
这个表示各个节点都启动成功了。接下来我们就可以进行集群的创建了,首先将redis/src目录下的redis-trib.rb文件拷贝到redis-cluster目录下,然后在redis-cluster目录下执行如下命令:
./redis-trib.rb create --replicas 1 192.168.248.128:7001 192.168.248.128:7002 192.168.248.128:7003 192.168.248.128:7004 192.168.248.128:7005 192.168.248.128:7006
注意,replicas后面的1表示每个主机都带有1个从机,
注意创建过程的日志,每个redis都获得了一个编号,同时日志也说明了哪些实例做主机,哪些实例做从机,每个从机的主机是谁,每个主机所分配到的hash槽范围等等。
查询集群信息
集群创建成功后,我们可以登录到Redis控制台查看集群信息,注意登录时要添加-c
参数,表示以集群方式连接,如下:
redis-cli -p 7001 -c
添加主节点
首先我们准备一个端口为7007的主节点并启动,准备方式和前面步骤一样,启动成功后,通过如下命令添加主节点:
./redis-trib.rb add-node 127.0.0.1:7007 127.0.0.1:7001
主节点添加之后,我们可以通过cluster nodes命令查看主节点是否添加成功,此时我们发现新添加的节点没有分配到slot
没有分配到slot将不能存储数据,此时我们需要手动分配slot,分配命令如下:
./redis-trib.rb reshard 127.0.0.1:7001
后面的地址为任意一个节点地址,在分配的过程中,我们一共要输入如下几个参数:
1.一共要划分多少个hash槽出来?就是我们总共要给新添加的节点分多少hash槽,这个参数依实际情况而定
2.这些划分出来的槽要给谁,这里输入7007节点的编号,
3.要让谁出血?因为hash槽目前已经全部分配完毕,要重新从已经分好的节点中拿出来一部分给7007,必然要让另外三个节点把吃进去的吐出来,这里我们可以输入多个节点的编号,每次输完一个点击回车,输完所有的输入done表示输入完成,这样就让这几个节点让出部分slot,如果要让所有具有slot的节点都参与到此次slot重新分配的活动中,那么这里直接输入all即可,
OK,主要就是这几个参数,输完之后进入到slot重新分配环节,分配完成后,通过cluster nodes命令,我们可以发现7007已经具有slot了,如
OK,刚刚我们是添加主节点,我们也可以添加从节点,比如我要把7008作为7007的从节点,添加方式如下:
./redis-trib.rb add-node --slave --master-id 79bbb30bba66b4997b9360dd09849c67d2d02bb9 192.168.31.135:7008 192.168.31.135:7007
其中79bbb30bba66b4997b9360dd09849c67d2d02bb9是7007的编号。
删除节点
删除节点也比较简单,如下:
./redis-trib.rb del-node 127.0.0.1:7005 4b45eb75c8b428fbd77ab979b85080146a9bc017
注意4b45eb75c8b428fbd77ab979b85080146a9bc017是要删除节点的编号。
再注意:删除已经占有hash槽的结点会失败,报错如下:
[ERR] Node 127.0.0.1:7005 is not empty! Reshard data away and try again.
需要将该结点占用的hash槽分配出去(分配方式与上文一致,不赘述)。
故障转移
发现故障节点
-
集群内的节点会向其他节点发送PING命令,检查是否在线
-
如果未能在规定时间内做出PONG响应,则会把对应的节点标记为疑似下线
-
集群中一半以上
负责处理槽的主节点
都将主节点X标记为疑似下线的话,那么这个主节点X就会被认为是已下线
-
向集群广播主节点X
已下线
,大家收到消息后都会把自己维护的结构体里的主节点X标记为已下线
从节点选举
-
当从节点发现自己复制的主节点已下线了,会向集群里面广播一条消息,要求所有有投票权的节点给自己投票(
所有负责处理槽的主节点都有投票权
) -
主节点会向第一个给他发选举消息的从节点回复支持
-
当支持数量超过N/2+1的情况下,该从节点当选新的主节点
故障的迁移
-
新当选的从节点执行
SLAVEOF no one
,修改成主节点 -
新的主节点会撤销所有已下线的老的主节点的槽指派,指派给自己
-
新的主节点向集群发送命令,通知其他节点自己已经变成主节点了,负责哪些槽指派
-
新的主节点开始处理自己负责的槽的命令
集群节点数量
Redis 集群是采用一种叫做哈希槽 (hash slot)
的方式来分配数据的。redis cluster 默认分配了 16384 个slot,当我们set一个key 时,会用CRC16
算法来取模得到所属的slot
,然后将这个key 分到哈希槽区间的节点上,具体算法就是:CRC16(key) % 16384。
Redis集群至少需要3个master节点,当存活的主节点数小于总节点数的一半时,整个集群就无法提供服务了。
集群模式和哨兵模式的区别
-
哨兵模式监控权交给了哨兵系统,集群模式中是工作节点自己做监控
-
哨兵模式发起选举是选举一个leader哨兵节点来处理故障转移,集群模式是在从节点中选举一个新的主节点,来处理故障的转移
转自 https://mp.weixin.qq.com/s?__biz=MzI1NDY0MTkzNQ==&mid=2247484570&idx=1&sn=37ffb660b4d1d250bfd89ece438b3f98&scene=21#wechat_redirect
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具