Redis(三十)- Redis集群操作和故障恢复&集群的Jedis开发

简介: 上一篇文章我们介绍了集群的基本概念,以及如何搭建一个简单的Redis集群。Redis(二十九)- Redis集群的介绍以及搭建,这篇文章我们接着来学习Redis集群。

1. 简介

上一篇文章我们介绍了集群的基本概念,以及如何搭建一个简单的Redis集群。Redis(二十九)- Redis集群的介绍以及搭建,这篇文章我们接着来学习Redis集群。

2. 基本的原理概念

1. redis cluster 如何分配这六个节点

一个集群至少要有三个主节点。

选项 --cluster-replicas 1 表示我们希望为集群中的每个主节点创建一个从节点。

分配原则尽量保证每个主数据库运行在不同的IP地址,每个从库和主库不在一个IP地址上。

这是为了尽量减少发生故障的风险,想象一下,如果主库和从库在同一个IP地址上,当这个服务器宕机之后,岂不是主库和从库都宕机了。

2. 什么是slots

在集群的启动日志中,我们可以看到All 16384 slots convered 这句日志。

一个Redis集群包含16384个插槽(hash slots),数据库中的每个键都属于这16384个插槽的其中一个。插槽可以理解为是每个内存区域,数据库将内存区域分为16384块。


集群使用公司 CRC16(key)%16384 来计算键key属于哪个槽,其中CRC16(key) 语句用于计算键key的CRC16校验和。


集群中每个主节点负责处理其中一部分插槽,在上图中我们可以看出,

节点6379 负责处理 0号至5460号插槽

节点6380 负责处理 5461号至10922号插槽

节点6381负责处理 10923号至16383号插槽。


简单来说,Redis集群在存储键值对时,首先会计算key的插槽值,然后,就将值有该插槽值的节点中。

3. 集群操作

向集群中插入单键值对,如果计算的插槽值不在当前的主节点上时,集群会切换到有该插槽值的主节点上。

不在一个slot下的键值对,是不能使用 mget,mset等多键操作。可以通过{} 来定义组的概念,从而使key中{}内相同内容的键值对放在一个slot中。

查询某个键所在的插槽值

获取某个插槽值上的键值

统计某个插槽上的键值数量,这里之所以统计不到是由于4847插槽值在6379主节点上。

4. 故障恢复

如果主节点下线,从节点可以自动升为主节点,超时的时间是15秒,这里将主节点6379下线之后,查看集群状态可以发现从节点6391自动升为了主节点。

原来的主节点恢复后,原主节点会变成从节点。这里重新启动节点6379可以发现,其变成了6391的从节点。

如果所有某一段插槽的主从节点都宕掉了,redis服务是否还能继续?

如果某一段插槽的主从都挂掉,而cluster-require-full-coverage 为yes,那么,整个集群都挂掉。

如果某一段插槽的主从都挂掉,而cluster-require-full-coverage 为no, 那么,该插槽的数据全部不能使用,也无法存储。

在redis.conf中的参数 cluster-require-full-coverage

5. 集群的Jedis开发

即使连接的不是主机,集群也会自动切换主机存储,主机写,从机读。

无中心化主从集群。无论从哪台主机写的数据,其他主机都能读到数据。

public class RedisClusterDemo {
    public static void main(String[] args) {
        // 创建对象
        HostAndPort hostAndPort = new HostAndPort("192.168.122.1", 6379);
        JedisCluster jedisCluster = new JedisCluster(hostAndPort);
        // 进行操作
        jedisCluster.set("name", "张三");
        String nameValue = jedisCluster.get("name");
        System.out.println(nameValue);
        jedisCluster.close();
    }
}

6. redis集群的优缺点

6.1. 优点

实现扩容,可以水平添加主机,实现扩容

分摊压力,将单主机的压力分摊到多主机上

无中心配置相对简单。

6.2. 缺点

不支持多键操作

    多键的Redis事务是不被支持的,lua脚本也不支持

    总结

    本文详细介绍Redis集群操作和故障恢复&集群的Jedis开发


    相关文章
    |
    存储 负载均衡 NoSQL
    【赵渝强老师】Redis Cluster分布式集群
    Redis Cluster是Redis的分布式存储解决方案,通过哈希槽(slot)实现数据分片,支持水平扩展,具备高可用性和负载均衡能力,适用于大规模数据场景。
    917 2
    |
    存储 NoSQL 数据库
    Redis 逻辑数据库与集群模式详解
    Redis 是高性能内存键值数据库,广泛用于缓存与实时数据处理。本文深入解析 Redis 逻辑数据库与集群模式:逻辑数据库提供16个独立存储空间,适合小规模隔离;集群模式通过分布式架构支持高并发和大数据量,但仅支持 database 0。文章对比两者特性,讲解配置与实践注意事项,并探讨持久化及性能优化策略,助你根据需求选择最佳方案。
    1374 5
    |
    NoSQL 算法 Redis
    【Docker】(3)学习Docker中 镜像与容器数据卷、映射关系!手把手带你安装 MySql主从同步 和 Redis三主三从集群!并且进行主从切换与扩容操作,还有分析 哈希分区 等知识点!
    Union文件系统(UnionFS)是一种**分层、轻量级并且高性能的文件系统**,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem) Union 文件系统是 Docker 镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
    1139 6
    |
    存储 监控 NoSQL
    Redis高可用架构全解析:从主从复制到集群方案
    Redis高可用确保服务持续稳定,避免单点故障导致数据丢失或业务中断。通过主从复制实现数据冗余,哨兵模式支持自动故障转移,Cluster集群则提供分布式数据分片与水平扩展,三者层层递进,保障读写分离、容灾切换与大规模数据存储,构建高性能、高可靠的Redis架构体系。
    |
    缓存 NoSQL Java
    基于SpringBoot的Redis开发实战教程
    Redis在Spring Boot中的应用非常广泛,其高性能和灵活性使其成为构建高效分布式系统的理想选择。通过深入理解本文的内容,您可以更好地利用Redis的特性,为应用程序提供高效的缓存和消息处理能力。
    1792 79
    |
    负载均衡 NoSQL Redis
    【赵渝强老师】Redis的主从复制集群
    Redis主从复制是指将一台Redis服务器的数据复制到其他Redis服务器,实现数据热备份、故障恢复、负载均衡及高可用架构的基础。主节点负责写操作,从节点同步数据并可提供读服务,提升并发处理能力。
    506 5
    |
    存储 NoSQL 算法
    Redis的集群架构与使用经验
    本文介绍了Redis的集群架构与使用经验,包括主从复制、哨兵集群及Cluster分片集群的应用场景与实现原理。内容涵盖Redis主从同步机制、数据分片存储方式、事务支持及与Memcached的区别,并讨论了Redis内存用尽时的处理策略。适用于了解Redis高可用与性能优化方案。
    |
    存储 NoSQL Redis
    阿里面试:Redis 为啥那么快?怎么实现的100W并发?说出了6大架构,面试官跪地: 纯内存 + 尖端结构 + 无锁架构 + EDA架构 + 异步日志 + 集群架构
    阿里面试:Redis 为啥那么快?怎么实现的100W并发?说出了6大架构,面试官跪地: 纯内存 + 尖端结构 + 无锁架构 + EDA架构 + 异步日志 + 集群架构
    阿里面试:Redis 为啥那么快?怎么实现的100W并发?说出了6大架构,面试官跪地: 纯内存 + 尖端结构 +  无锁架构 +  EDA架构  + 异步日志 + 集群架构
    |
    存储 NoSQL 算法
    Redis分片集群中数据是怎么存储和读取的 ?
    Redis集群采用的算法是哈希槽分区算法。Redis集群中有16384个哈希槽(槽的范围是 0 -16383,哈希槽),将不同的哈希槽分布在不同的Redis节点上面进行管理,也就是说每个Redis节点只负责一部分的哈希槽。在对数据进行操作的时候,集群会对使用CRC16算法对key进行计算并对16384取模(slot = CRC16(key)%16383),得到的结果就是 Key-Value 所放入的槽,通过这个值,去找到对应的槽所对应的Redis节点,然后直接到这个对应的节点上进行存取操作
    |
    缓存 NoSQL Redis
    Redis原理—3.复制、哨兵和集群
    详细介绍了Redis的复制原理、哨兵原理和集群原理。