Redis学习笔记十(集群)

集群

解决问题

  1. 容量不够
  2. 并发写操作
  3. 修改主机的相关信息
  4. 之前通过代理主机来解决,redis3.0之后提供了解决无中心化集群配置
  5. 代理主机方式
    客户端
    代理
    主机1
    从机1
    主机2
    从机2
    主机3
    从机3
    代理从机1
    6.无中心化集群方式
    主机1
    主机2
    从机2
    主机3
    从机3
    从机1
    客户端

集群特点

  1. redis 集群实现了对Redis的水平扩容,即启动N个redis节点,将整个数据库分布存储在这N个节点中,每个节点存储总数据的1/N
  2. 通过分区(partition)可以提供一定程度的可用性(availability): 即使集群中有一部分节点失效或者无法进行通讯, 集群也可以继续处理命令请求。

配置集群

  1. 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
  1. 依照以上配置建立redis6380.conf、redis6381.conf、redis6382.conf、redis6390.conf、redis6391.conf、redis6392.conf文件。只需要将redis6380.conf复制五份,在对应的文件下输入:%s/6380/63xx,修改数字。

  2. 启动6个redis服务(此时文件夹下,应该有对应的nodes-xxxx文件生成)

root@LK:/myredis# redis-server redis6380.conf
root@LK:/myredis# redis-server redis6381.conf
root@LK:/myredis# redis-server redis6382.conf
root@LK:/myredis# redis-server redis6389.conf
root@LK:/myredis# redis-server redis6390.conf
root@LK:/myredis# redis-server redis6392.conf
root@LK:/myredis# ps -ef| grep redis
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
  1. 将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 'yes' to accept): yes
>>> 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.
  1. 集群方式连接
res-cli -c -p 6380
  1. 查看主从机情况,插槽范围
cluster nodes
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
  1. 实际使用过程中集群的要求

    1. 一个集群至少要有三个主节点。
    2. 选项 --cluster-replicas 1 表示我们希望为集群中的每个主节点创建一个从节点。
    3. 分配原则尽量保证每个主数据库运行在不同的IP地址,每个从库和主库不在一个IP地址上
  2. 集群的数据储存原理

    1. 一个 Redis 集群包含 16384 个插槽(hash slot),数据库中的每个键都属于这 16384 个插槽的其中一个,每个主机拥有其中的一部分插槽。
    2. 集群使用公式 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>
  1. 故障恢复
    1. 主机挂掉,挂掉的主机的从机会成为新的主机
    2. 原来主机恢复后,会成为新主机的从机。
    3. 如果一个主机以及下面的从机都挂掉,如果redis.conf文件中的cluster-require-full-coverage yes,则集群都挂掉;如果为no, 则仅挂掉部分的插槽不能使用

jedis配置集群

public class JedisClusterTest {
public static void main(String[] args) { 
Set<HostAndPort> set =new HashSet<HostAndPort>();
//集群中任意一个主机ip都可以使用,会自动发现其他主机,也可以手动放入多个
//需要保持后台redis运行
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

集群的优劣

  1. 优势:
    1. 实现扩容
    2. 分摊压力
    3. 无中心配置相对简单
  2. 不足
    1. 多键操作是不被支持的
    2. 多键的Redis事务是不被支持的。lua脚本不被支持
    3. 由于集群方案出现较晚,很多公司已经采用了其他的集群方案,而代理或者客户端分片的方案想要迁移至redis cluster,需要整体迁移而不是逐步过渡,复杂度较大。
posted @   小懒虫LK  阅读(64)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示