一、Redis集群
1.1 问题
容量不够,Redis如何进行扩容?
并发写操作,Redis如何分摊?
另外,主从模式、薪火相传模式、主机宕机,导致IP地址发生变化,应用程序中配置需要修改对应的主机地址、端口等信息(代码中地址肯定写死了)。
之前通过代理主机来解决,但是 redis3.0 中提供了解决方案。就是 无中心化集群 配置
任何一个服务都能作为集群的入口,他们之间可以互相访问。
1.2 什么是集群
Redis集群实现了对Redis的水平扩容,即启动N个redis节点,将整个数据库分布存储在这N个节点中,每个节点存储总数据的 1/N 。
Redis集群通过分区来提供一定程度的可用性:即使集群中有一部分节点失效或无法进行通讯,集群也可以继续处理命令请求。
二、模拟集群
制作6个实例:6379、6380、6381、6389、6390、6391
2.1 配置基本信息
删除 /myredis
目录下的所有 dump**.rdb ,然后再删除 redis6380.conf
和redis6381.conf
,留下 redis6379.conf
修改 redis6379.conf
。仅留下以下内容。
cluster-enabled yes 打开集群模式
cluster-config-file nodes-6379.conf 设定节点配置文件名
cluster-node-timeout 15000 设定节点失联时间,超过该时间(毫秒),集群自动进入主从切换
然后复制5份分别为redis6380.conf
,redis6381.conf
,redis6389.conf
,redis6390.conf
,redis6391.conf
。并将里面的端口信息修改为对应的端口。例如 6379
—> 6380
可以使用快捷键批量替换字符
启动6个redis服务
2.2 将6个节点合成一个集群
组合之前,请确保所有redis实例启动后,nodes-xxxx.conf文件都正常生成。
合体:
# 进入redis的安装目录下的 src 文件夹
cd /export/software/redis-6.2.6/src/
# --cluster 集群操作
# create 创建集群
# --cluster-replicas 1 1代表从机数量。采用最简单的方式配置集群,一台主机,一台从机。6台主机正好三组
# 都填写真实IP地址,不要用127.0.0.1
redis-cli --cluster create --cluster-replicas 1 192.168.121.138:6379 192.168.121.138:6380 192.168.121.138:6381 192.168.121.138:6389 192.168.121.138:6390 192.168.121.138:6391
2.3 采用集群的方式连接
# -c :采用集群策略连接,设置数据会自动切换到相应的“写”主机
# 在redis安装目录下的src文件夹中操作
redis-cli -c -p 6379
2.4 什么是slots
一个Redis集群包含16384个插槽,数据库中的每个键都属于这16384个插槽中的其中一个。
集群使用公式 CRC16(key) % 16384
来计算键 key 属于哪个槽,其中 CRC16(key)
语句用于计算键 key 的CRC16校验和。
集群每个节点负责一部分插槽。
2.4.1 在集群中插入值
2.4.2 查询集群中的值
cluster keyslot cust # 计算key对应的插槽值
cluster countkeysinslot 4847 # 计算该插槽值里面有几个key
cluster getkeysinslot 4847 10 # 在对应插槽中返回10个值
2.5 故障恢复
测试某主机挂掉,和重启后的情况。
三、Jedis操作集群
package com.example.jedis;
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisCluster;
public class RedisClusterDemo {
public static void main(String[] args) {
//创建对象
HostAndPort hostAndPort = new HostAndPort("192.168.121.138", 6379);
JedisCluster jedisCluster = new JedisCluster(hostAndPort);
//进行操作
jedisCluster.set("b1", "value1");
String b1 = jedisCluster.get("b1");
System.out.println(b1);
jedisCluster.close();
}
}
四、Redis集群的优缺点
4.1 优点
- 实现扩容
- 分摊压力
- 无中心配置相对简单
4.2 不足
- 多键操作是不支持的
- 多键的Redis事务是不被支持的。lua脚本不被支持。
- 由于集群方案出现较晚,很多公司已经采用了其他的集群方案,而代理或者客户端分片的方案想要迁移至redis cluster,需要整体迁移而不是逐步过渡,复杂度较大。
参考资源:
- B站尚硅谷:https://www.bilibili.com/video/BV1Rv41177Af?p=1