华子目录
 - 什么是`redis集群`
 - `redis cluster`的`体系架构`
 - 什么是数据`sharding`?
 - 什么是`hash tag`
 - 集群中删除或新增节点,数据如何迁移?
 - `redis集群`如何使用`gossip`通信?
 - 定义
 - `meet信息`
 - `ping消息`
 - `pong消息`
 - `fail消息(不是用gossip协议实现的)`
 - 流量图
 
 - 数据访问如何定位到具体的节点?
 -  
 - `redis cluster主从架构`
 - 创建`redis cluster`的`前提`
 
 
  
 
什么是redis集群
 
redis从3.0开始就支持集群,节点之间使用gossip协议进行通信,实现了去中心化,集群中支持动态的添加和删除节点,动态迁移数据以及自动执行故障转移
 
 - 在
哨兵sentinel机制中,可以解决redis高可用问题,即当master故障后可以自动将slave提升为master,从而可以保证redis服务的正常使用,但是无法解决redis单机写入的瓶颈问题,即单机redis写入性能受限于单机的内存大小、并发数量、网卡速率等因素 集群中某个节点的是否失效,是由整个集群中超过半数的节点监测都失效,才能算真正的失效客户端不需要proxy即可直接连接redis,应用程序中需要配置有全部的redis服务器IP每个哈希槽可以存储若干个key
 
 
- 在
无中心的redis集群当中,其每个节点保存当前节点数据和整个集群状态,每个节点都和其他所有节点连接 
 
redis cluster的体系架构
 

 
什么是数据sharding?
 
redis cluster使用数据分片实现key的存储分布redis cluster将集群划分为16384个槽位,数据库中所有的key进行hash计算后,都会落到这16384个槽位中的其中一个槽位- 那么
key是如何定位到哪个槽位的。可以通过公式进行计算:CRC16(key)%16384,得到的值就是槽位;16384个槽位全部分配给cluster中的节点 每个节点维护自己的槽位,同时每个节点也会存储其他节点维护的槽位信息
 
 - 当然你也可以指定到
哪个槽位,这就涉及到了hash tag 
 
 
什么是hash tag
 
hash tag是用来解决用户想要将一堆数据key全部放到一个槽位而提出来的,用户可以将key设置成这样:原始的key + {tag标签},当redis cluster碰到这样的key,就会提取{}里面的值,进行槽位计算
 
集群中删除或新增节点,数据如何迁移?
 
- 假设
cluster目前有四个节点A,B,C,D - 如果
删除D节点,则会将D节点中的所有槽位全部分配给A,B,C节点 - 如果
新增E节点,则会将A,B,C,D中的部分槽位移动到E节点上 
 
redis集群如何使用gossip通信?
 
定义
 
gossip使得元数据分布式存储,不做集中存放,实现了去中心化,当一个节点信息变更,就会触发集群中整个节点信息的更新,缺点就是更新会有延迟
 
meet信息
 
 
ping消息
 
 
pong消息
 
pong消息是用来回应其他节点向自己发的消息,还可以通过发此消息,让其他节点更新此节点的状态信息
 
fail消息(不是用gossip协议实现的)
 
- 当
集群里的主节点A将主节点B标记为下线时,会通过集群广播一条关于主节点B的fail消息,所有接受到这条消息的节点(包括主从节点)都会将主节点B标记为下线 
 
流量图
 

 
数据访问如何定位到具体的节点?
 
正常访问
 

 
访问已被迁移到其他节点的数据
 

 
redis cluster主从架构
 
Redis cluster的架构虽然解决了并发的问题,但是又引入了一个新的问题,每个Redis master的高可用如何解决?- 那就是对
每个master节点都实现主从复制,从而实现redis高可用性 
 

 
创建redis cluster的前提
 
- 每个
redis node节点采用相同的硬件配置、相同的密码、相同的redis版本 每个节点必须开启的参数
 
cluster-enabled yes  
cluster-config-file nodes-6380.conf   
 
所有redis服务器必须没有任何数据先启动为单机redis且没有任何key value