主从模式,薪火相传模式问题:
主机宕机,导致ip地址发生变化,应用程序中配置需要重新修改对应的主机地址、端口等信息
sentinel模式基本可以满足一般生产的需求,具备高可用性
当数据量过大到一台服务器存放不下,主从模式或sentinel模式就不能满足需求了,需要对存储的数据进行分片,将数据存储到多个Redis实例中(分片)
解决方案:无中心化集群配置
cluster集群特点:
* 方便扩容,多个redis节点网络互联,数据共享,分摊压力,无中心配置相对简单
* 所有的节点都是一主一从(也可以是一主多从),其中从不提供服务,仅作为备用(主节点提供读/写)
* 不支持同时处理多个key(如MSET/MGET),因为redis需要把key均匀分布在各个节点上,并发量很高的情况下同时创建key-value会降低性能并导致不可预测的行为
* 支持在线增加、删除节点
* 客户端可以连接任何一个主节点进行读写
Redis集群:启动N个redis节点,每个节点存储总数据的1/N,一个集群至少要有三个主节点
1.redis cluster配置:
cluster-enabled yes 打开集群模式
cluster-config-file nodes-6379.conf 设定节点配置文件名
cluster-node-timeout 15000 设定节点失联时间,超过该时间(毫秒),集群自动进行主从切换
2.启动所有Redis服务
3.创建集群
redis-cli --cluster create --cluster-replicas 1 主 主 主 [主] 从 从 从 [从]
--cluster-replicas :表示副本为1
4.登录集群
redis-cli -c -h 192.168.30.128 -p 7001 -a 123456
[5].查看集群信息 CLUSTER INFO
[6].列出节点信息 CLUSTER NODES
7.测试设置/获取数据
redis cluster集群是去中心化的,每个节点都是平等的,连接哪个节点都可以获取和设置数据
8.测试master挂掉
master节点如果挂掉,它的slave节点变为新master节点继续对外提供服务,而原来的master节点如果重启,则变为新master节点的slave节点
9.cluster-require-full-coverage
cluster-require-full-coverage为yes,如果某一段插槽的主从都挂掉,整个集群都挂掉
cluster-require-full-coverage为no,如果某一段插槽的主从都挂掉,该插槽数据全都不能使用,也无法存储
slots:
一个 Redis 集群包含 16384 个插槽(hash slot),每个节点负责处理一部分插槽
计算键 key 属于哪个槽: CRC16(key) % 16384
redis-cli每次录入、查询键值,redis都会计算出该key应该送往的插槽,如果不是该客户端对应服务器的插槽,redis会报错,并告知应前往的redis实例地址和端口
redis-cli客户端提供了 –c 参数实现自动重定向,redis-cli -c –p 6379 登入后,再录入、查询键值对可以自动重定向
jedis开发:
无论连接哪台主机进行存储,集群会自动切换到key所属正确slot主机存储
public static void main(String[] args) {
Set<HostAndPort>set =new HashSet<HostAndPort>();
set.add(new HostAndPort("192.168.31.211",6379));
JedisCluster jedisCluster=new JedisCluster(set);
jedisCluster.set("k1", "v1");
System.out.println(jedisCluster.get("k1"));
}
Redis Cluster模式
最新推荐文章于 2024-06-13 09:00:30 发布