Redis(一)-----主从复制 : https://blog.csdn.net/Coxhuang/article/details/104645557
Redis(二)-----数据分区 : https://blog.csdn.net/Coxhuang/article/details/104645989
Redis(三)-----集群方案 : https://blog.csdn.net/Coxhuang/article/details/104667132
Redis(四)-----持久化 : https://blog.csdn.net/Coxhuang/article/details/104682409
Redis(五)-----应用场景 : https://blog.csdn.net/Coxhuang/article/details/104688015
Redis(六)-----缓存穿透/缓存雪崩/缓存击穿 : https://blog.csdn.net/Coxhuang/article/details/104688168
Redis(七)—淘汰删除策略 : https://blog.csdn.net/Coxhuang/article/details/104788308
将众多小内存的Redis实例整合起来,将分布在多台机器上的众多CPU核心的计算能力聚集到一起,完成海量数据存储和高并发多写操作
主要方案有以下两个
Codis
国产开源Redis集群方案
Cluster
官方提供的Redis集群方案
Codis是无状态的,它只是一个转发代理的中间件,这意味着我们可以启动多个Codis实例,供客户端使用,每个Codis节点是平等的
Codis主要是将特定的key转发到特定的Redis实例,具体转发如下:
在扩容/删除Redis节点的时候,Codis槽位与Redis对应关系会发生改变,那如何实现Codis同步呢 ???
Codis需要使用一个分布式同步工具来配置存储数据库实现持久化槽位关系,Codis开始使用Zookeeper,后来etcd也同样支持
Codis槽位关系存储在zookeeper中(并且提供一个Dashboard可以用来观察和修改槽位关系),当槽位发生变化时,Codis Proxy会监听到变化并重新同步槽位关系
刚开始Codis只有一个Redis实例的时候,1024个槽位全部指向同一个Redis实例,然后新增一个Redis实例,这时,需要对槽位关系进行修改,将一半的槽位划分到新的Redis节点,这就意味着对这一半的槽位里面的key进行迁移,迁移到新的Redis实例
Redis新增实例,手动均衡太繁琐,所以Codis提供自动均衡功能,自动均衡功能会在系统比较空闲的时候,观察诶个Redis实例对应的槽位数量,如果不均衡,就会自动迁移
Redis Cluster方案中,所有的Redis节点组成一个完全图,任意节点到其他节点都是可达的,去中心化,没有主节点概念
Redis Cluster将所有的数据分为2的14次方(16384)槽位,每个Redis节点负责其中的一部分槽位,槽位信息存储在节点中,不像Codis,不需要另外的分布式存储空间存储节点槽位信息,当Redis Cluster的客户端来连接集群时,也会得到一份集群的槽位配置信息,这样客户端要查找某个key,可以直接定位到目标Redis节点
Redis Cluster默认会对key使用CRC16算法进行hash,等到一个整数值,然后用这个整数值对16384求余得到具体的槽位信息