集群
解决问题
- 容量不够
- 并发写操作
- 修改主机的相关信息
- 之前通过代理主机来解决,redis3.0之后提供了解决无中心化集群配置
- 代理主机方式6.无中心化集群方式
集群特点
- redis 集群实现了对Redis的水平扩容,即启动N个redis节点,将整个数据库分布存储在这N个节点中,每个节点存储总数据的1/N。
- 通过分区(partition)可以提供一定程度的可用性(availability): 即使集群中有一部分节点失效或者无法进行通讯, 集群也可以继续处理命令请求。
配置集群
redis.conf
配置文件修改
| 开启daemonize yes |
| Pid文件名字 |
| 指定端口 |
| Log文件名字 |
| Dump.rdb名字 |
| Appendonly 关掉或者换名字 |
| cluster-enabled yes 打开集群模式 |
| cluster-config-file nodes-xxx.conf 设定节点配置文件名 |
| cluster-node-timeout 15000 设定节点失联时间,超过该时间(毫秒),集群自动进行主从切换。 |
redis.conf
主要内容配置
| include /myredis/redis.conf |
| pidfile /var/run/redis_6380.pid |
| port 6380 |
| dbfilename dump6380.rdb |
| cluster-enabled yes |
| cluster-config-file nodes-6380.conf |
| cluster-node-timeout 15000 |
-
依照以上配置建立redis6380.conf、redis6381.conf、redis6382.conf、redis6390.conf、redis6391.conf、redis6392.conf文件。只需要将redis6380.conf复制五份,在对应的文件下输入:%s/6380/63xx
,修改数字。
-
启动6个redis服务(此时文件夹下,应该有对应的nodes-xxxx文件生成)
| root@LK:/myredis |
| root@LK:/myredis |
| root@LK:/myredis |
| root@LK:/myredis |
| root@LK:/myredis |
| root@LK:/myredis |
| root@LK:/myredis |
| root 86630 2002 0 13:04 ? 00:00:00 redis-server 127.0.0.1:6382 [cluster] |
| root 86641 2002 0 13:05 ? 00:00:00 redis-server 127.0.0.1:6392 [cluster] |
| root 86715 2002 0 13:07 ? 00:00:00 redis-server 127.0.0.1:6380 [cluster] |
| root 86721 2002 0 13:08 ? 00:00:00 redis-server 127.0.0.1:6390 [cluster] |
| root 86731 2002 0 13:08 ? 00:00:00 redis-server 127.0.0.1:6381 [cluster] |
| root 86738 2002 0 13:08 ? 00:00:00 redis-server 127.0.0.1:6391 [cluster] |
| root 86749 59701 0 13:08 pts/0 00:00:00 grep --color=auto redis |
- 将6个服务集成为集群
在redis安装目录下/opt/redis-7.0.2/src
| redis-cli --cluster create --cluster-replicas 1 127.0.0.1:6382 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6392 127.0.0.1:6390 127.0.0.1:6391 |
如果有远程连接,尽量不要用127.0.0.1
--replicas 1 采用最简单的方式配置集群,主机要有一个从机。
| root@LK:/opt/redis-7.0.2/src# redis-cli --cluster create --cluster-replicas 1 127.0.0.1:6382 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6392 127.0.0.1:6390 127.0.0.1:6391 |
| >>> Performing hash slots allocation on 6 nodes... |
| Master[0] -> Slots 0 - 5460 |
| Master[1] -> Slots 5461 - 10922 |
| Master[2] -> Slots 10923 - 16383 |
| Adding replica 127.0.0.1:6390 to 127.0.0.1:6382 |
| Adding replica 127.0.0.1:6391 to 127.0.0.1:6380 |
| Adding replica 127.0.0.1:6392 to 127.0.0.1:6381 |
| >>> Trying to optimize slaves allocation for anti-affinity |
| [WARNING] Some slaves are in the same host as their master |
| M: 3e81415f445fcfb480732a1550abc482a830513c 127.0.0.1:6382 |
| slots:[0-5460] (5461 slots) master |
| M: c6724e82265a3277458ef7e21e9ef0aa0e0965a6 127.0.0.1:6380 |
| slots:[5461-10922] (5462 slots) master |
| M: e761f014598833ba20d6c0256dd520b9824cf082 127.0.0.1:6381 |
| slots:[10923-16383] (5461 slots) master |
| S: 0f240fe2623bedb042c74917f75f65b5b8b45bcc 127.0.0.1:6392 |
| replicates 3e81415f445fcfb480732a1550abc482a830513c |
| S: 7052c51e19ee25dfb568cb09cd463383083eb4ea 127.0.0.1:6390 |
| replicates c6724e82265a3277458ef7e21e9ef0aa0e0965a6 |
| S: ce2aa0395048c81e9e47c7344cf7fb20f9d2fc8c 127.0.0.1:6391 |
| replicates e761f014598833ba20d6c0256dd520b9824cf082 |
| Can I set the above configuration? (type |
| >>> Nodes configuration updated |
| >>> Assign a different config epoch to each node |
| >>> Sending CLUSTER MEET messages to join the cluster |
| Waiting for the cluster to join |
| |
| >>> Performing Cluster Check (using node 127.0.0.1:6382) |
| M: 3e81415f445fcfb480732a1550abc482a830513c 127.0.0.1:6382 |
| slots:[0-5460] (5461 slots) master |
| 1 additional replica(s) |
| M: c6724e82265a3277458ef7e21e9ef0aa0e0965a6 127.0.0.1:6380 |
| slots:[5461-10922] (5462 slots) master |
| 1 additional replica(s) |
| S: 7052c51e19ee25dfb568cb09cd463383083eb4ea 127.0.0.1:6390 |
| slots: (0 slots) slave |
| replicates c6724e82265a3277458ef7e21e9ef0aa0e0965a6 |
| M: e761f014598833ba20d6c0256dd520b9824cf082 127.0.0.1:6381 |
| slots:[10923-16383] (5461 slots) master |
| 1 additional replica(s) |
| S: 0f240fe2623bedb042c74917f75f65b5b8b45bcc 127.0.0.1:6392 |
| slots: (0 slots) slave |
| replicates 3e81415f445fcfb480732a1550abc482a830513c |
| S: ce2aa0395048c81e9e47c7344cf7fb20f9d2fc8c 127.0.0.1:6391 |
| slots: (0 slots) slave |
| replicates e761f014598833ba20d6c0256dd520b9824cf082 |
| [OK] All nodes agree about slots configuration. |
| >>> Check for open slots... |
| >>> Check slots coverage... |
| [OK] All 16384 slots covered. |
- 集群方式连接
- 查看主从机情况,插槽范围
| 127.0.0.1:6380> cluster nodes |
| e761f014598833ba20d6c0256dd520b9824cf082 127.0.0.1:6381@16381 master - 0 1656134521873 3 connected 10923-16383 |
| ce2aa0395048c81e9e47c7344cf7fb20f9d2fc8c 127.0.0.1:6391@16391 slave e761f014598833ba20d6c0256dd520b9824cf082 0 1656134522877 3 connected |
| 7052c51e19ee25dfb568cb09cd463383083eb4ea 127.0.0.1:6390@16390 slave c6724e82265a3277458ef7e21e9ef0aa0e0965a6 0 1656134521000 2 connected |
| 0f240fe2623bedb042c74917f75f65b5b8b45bcc 127.0.0.1:6392@16392 slave 3e81415f445fcfb480732a1550abc482a830513c 0 1656134520000 1 connected |
| c6724e82265a3277458ef7e21e9ef0aa0e0965a6 127.0.0.1:6380@16380 myself,master - 0 1656134518000 2 connected 5461-10922 |
| 3e81415f445fcfb480732a1550abc482a830513c 127.0.0.1:6382@16382 master - 0 1656134521000 1 connected 0-5460 |
-
实际使用过程中集群的要求
- 一个集群至少要有三个主节点。
- 选项 --cluster-replicas 1 表示我们希望为集群中的每个主节点创建一个从节点。
- 分配原则尽量保证每个主数据库运行在不同的IP地址,每个从库和主库不在一个IP地址上。
-
集群的数据储存原理
- 一个 Redis 集群包含 16384 个插槽(hash slot),数据库中的每个键都属于这 16384 个插槽的其中一个,每个主机拥有其中的一部分插槽。
- 集群使用公式 CRC16(key) % 16384 来计算键 key 属于哪个槽, 其中 CRC16(key) 语句用于计算键 key 的 CRC16 校验和 。
| 127.0.0.1:6380> set k1 v1 |
| -> Redirected to slot [12706] located at 127.0.0.1:6381 |
| OK |
| 127.0.0.1:6381> |
根据输入的key计算插槽位置,选择存储位置并跳转到对应的服务器地址
| |
| 127.0.0.1:6381> mset t1{cust} v1 t2{cust} v2 t3{cust} v3 |
| -> Redirected to slot [4847] located at 127.0.0.1:6382 |
| OK |
| |
| 127.0.0.1:6382> keys * |
| 1) "t2{cust}" |
| 2) "k2" |
| 3) "t3{cust}" |
| 4) "t1{cust}" |
| |
| 127.0.0.1:6382> get t2{cust} |
| "v2" |
| #查询当前键值的插槽位置 |
| cluster keyslot <cust> |
| #查询当前槽位有几个值,只能查询当前服务器的插槽 |
| cluster countkeysinslot <slot> |
| # 获取当前槽位count数量的值 |
| cluster getkeysinslot <slot> <count> |
- 故障恢复
- 主机挂掉,挂掉的主机的从机会成为新的主机
- 原来主机恢复后,会成为新主机的从机。
- 如果一个主机以及下面的从机都挂掉,如果redis.conf文件中的
cluster-require-full-coverage yes
,则集群都挂掉;如果为no
, 则仅挂掉部分的插槽不能使用
jedis配置集群
| public class JedisClusterTest { |
| public static void main(String[] args) { |
| Set<HostAndPort> set =new HashSet<HostAndPort>(); |
| |
| |
| set.add(new HostAndPort("127.0.0.1",6380)); |
| JedisCluster jedisCluster=new JedisCluster(set); |
| jedisCluster.set("kk1", "vv1"); |
| System.out.println(jedisCluster.get("kk1")); |
| |
| Map<String, JedisPool> clusterNodes = jedisCluster.getClusterNodes(); |
| clusterNodes.forEach((s, jedisPool) -> System.out.println(s+jedisPool.toString())); |
| } |
| } |
jedis的操作参考学习笔记六
| vv1 |
| 127.0.0.1:6382redis.clients.jedis.JedisPool@7f690630 |
| 127.0.0.1:6390redis.clients.jedis.JedisPool@edf4efb |
| 127.0.0.1:6392redis.clients.jedis.JedisPool@2f7a2457 |
| 127.0.0.1:6381redis.clients.jedis.JedisPool@566776ad |
| 127.0.0.1:6380redis.clients.jedis.JedisPool@6108b2d7 |
| 127.0.0.1:6391redis.clients.jedis.JedisPool@1554909b |
集群的优劣
- 优势:
- 实现扩容
- 分摊压力
- 无中心配置相对简单
- 不足
- 多键操作是不被支持的
- 多键的Redis事务是不被支持的。lua脚本不被支持
- 由于集群方案出现较晚,很多公司已经采用了其他的集群方案,而代理或者客户端分片的方案想要迁移至redis cluster,需要整体迁移而不是逐步过渡,复杂度较大。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具