Redis集群模式简介
FROM ChatGPT:
Redis集群是Redis的一种高可用解决方案,它通过在多个节点上分片存储数据,实现数据的高可用和扩展。Redis集群最初是在Redis 3.0版本中引入的。
Redis集群的节点由多个主节点和从节点组成,每个主节点都有多个从节点。集群中的每个节点都维护了整个集群的状态信息,节点之间通过Gossip协议进行通信,通过相互交换状态信息来保持集群中节点的一致性。Redis集群使用的哈希槽(hash slot)将键映射到不同的节点,实现了数据的分布式存储。
Redis集群的优点包括:
- 高可用:当集群中的某个节点故障时,集群仍然可以正常运行。
- 扩展性:Redis集群可以支持更多的数据和客户端请求,可以通过增加节点来实现横向扩展。
- 分布式:Redis集群可以将数据分散在不同的节点上,使得数据的读写负载得到了平衡,提高了Redis的性能。
但是Redis集群也存在一些限制和注意事项,例如:
- Redis集群只能支持单个数据库空间,不能在不同节点之间存储不同的数据库。
- Redis集群不支持事务嵌套和 Lua 脚本中的事务操作。
- Redis集群使用的是哈希槽分片,因此在集群运行过程中,不能动态添加或删除哈希槽,否则会导致数据的迁移,对集群性能产生影响。
在实际应用中,如果需要使用Redis集群,需要对集群中的节点进行适当的配置和调优,以确保集群的高可用性、性能和可靠性。
Redis集群容错机制
Redis集群的节点由多个主节点和从节点组成,每个主节点都有多个从节点,从节点和主节点的数据一致。
从节点挂掉,不会影响redis集群数据的写入和读取,只会降低读取的性能和容错能力。从节点启动后会自动从主节点同步数据。
主节点挂掉,Redis集群会将该主节点的从节点切换为新的主节点(一般在几秒内完成),以保证数据可用性和一致性,在新的主节点选出来之前,集群写能力不可用。
参考文档:
- docker搭建3主3从redis集群(主从容错切换、主从扩容、主从缩容)
- K8S部署Redis Cluster集群(三主三从模式)
- redis集群节点宕机
- 深入理解redis cluster的failover机制
- CLUSTER FAILOVER
- Scaling with Redis Cluster
Redis集群操作命令
cluster
命令查看和操作redis集群。
通过给定可选的参数 section ,可以让命令只返回某一部分的信息:
cluster info
:打印redis集群的信息cluster slots
:列出集群的槽信息cluster nodes
:列出集群当前已知的所有节点(node),以及这些节点的相关信息cluster meet <ip> <port>
:将 ip 和 port 所指定的节点添加到集群当中,让它成为集群的一份子cluster forget <node_id>
:从集群中移除 node_id 指定的节点cluster failover
:该命令只能在群集slave节点执行,让slave节点进行一次人工故障切换,成为master。切换过程中redis会阻塞请求(10s),切换完成再处理请求。
Redis集群重启
需求描述:
192.168.56.101-103 三台机器,使用7001和7002端口,搭建了redis集群。
现在想降低内存碎片率,因此计划对redis集群进行重启。
根据Redis集群容错机制,应该挨个节点重启,先重启从节点,再重启主节点。
1、查看master和slave节点
1 | redis-cli -c -h 192.168.56.101 -p 7001 -a 'xxx' cluster nodes |
其中-c
参数的作用是启用集群模式,这样可以自动重定向到正确的节点。
2、挨个从节点重启(端口可能是7001,也可能是7002),一个节点重启完成再进行下一个
1 | redis-cli -c -h 192.168.56.101 -p 7002 -a 'xxx' shutdown |
3、挨个主节点重启(端口可能是7001,也可能是7002),一个节点重启完成再进行下一个
1 | redis-cli -c -h 192.168.56.101 -p 7001 -a 'xxx' shutdown |
Redis集群异常排查
Redis集群模式,Java访问Redis集群报错:
1 | io.lettuce.core.RedisCommandExecutionException: CLUSTERDOWN The cluster is down |
排查方法:
1 | redis-cli -c -h 192.168.56.101 -p 7001 -a 'xxx' cluster nodes |
发现报错:
1 | [ERR] Nodes don't agree about configuration! |
解决办法一:重新握手。
1 | redis-cli -c -h 192.168.56.101 -p 7002 -a 'xxx' cluster meet 192.168.56.101 7001 |
参考文档:Redis [ERR] Nodes don’t agree about configuration!
解决办法二(推荐):重启redis节点。
1 | redis-cli -c -h 192.168.56.101 -p 7002 -a 'xxx' shutdown |