Redis_cluster工作原理及分布式算法

Redis_cluster 工作原理

Redis 集群历史实现方式

Redis 现目前都是使用Redis_cluster,但是在前几年的时候,Redis的集群搭建都是使用使用建立在一些中间件的基础上,包括codis,或者twemproxy,有一些Redis中间件,cluster 通过读写Redis中间件,redis中间件负责将写入的数据分布式存储在多个redis节点实例上

现在Redis的集群使用,都使用Redis原生支持的Redis集群模式Redis_cluster

Redis 单机主从性能瓶颈说明

Redis 单机主从性能瓶颈和系统内存大小相关,如果服务器有 10G 内存可供Redis 使用的情况下,那么Redis 单机主从最高可以支撑10G数据的存储,因为单机主从的话,Redis slave node 上存储的数据是保持和Master node 一致的,所以,master node 的存储数据量就为整个单机主从集群存储数据量
Redis 单机Master架构说明

Redis cluster 集群模式说明

理解了上述单机主从性能瓶颈之后,Redis cluster 集群就是基于上述单机主从的横向扩容,将数据进行分布式存储,
Redis 集群说明
Redis_cluster
支撑N个redis master node,每个 master node 都可以挂在多个slave node
每个 master node 都属于读写分离架构,对于每个master 来说,写就写入到master node,读就从master 对应的 slave 去读
因为每个master 都有自己的slave node, 所以如果master node 宕掉,Redis clsuter 这套机制,就会自动将该节点的slave node 切换成master

Redis 集群不同数据量使用情况说明

如果系统的数据量很少,只有几个G的数据量,单机内存可以支持的情况下,那么直接使用 replication + sentinal集群的模式就足够了
Redis_cluster 模式主要针对的是海量数据+高并发的使用场景,如果系统缓存数据量很大,那么使用Redis——cluster 模式就可以了

replication

一个redis master node 多个 slave node 集群

Redis cluster 介绍

特点

  1. 自动将数据进行分片,每个master 上放一部分数据
  2. 提供内置的高可用支持,部分master 不可用时,还是可以继续工作的
  3. 在Redis cluster架构下,每隔redis要放开两个端口号,比如一个是6379,另一个就是加了10000的端口号:16379
    16379 这个端口号是用来进行节点间通信的,也就是cluster bus的东西,集群总线,cluster bus的通信,用来进行故障检测,配置更新,故障转移授权等等
    cluster bus用了另外一种二进制的协议,主要适用于节点间进行高效的数据交换,占用更少的网络带宽和处理时间

数据存储算法

Redis 集群的数据分布式存储算法由最开始的hash 算法,一致性hash算法(memcached),到后面的redis cluster 自己的算法hash slot算法
使用不同的算法,就决定了在多个master 节点的时候,数据如何分布在这些节点

hash算法

这个算法相对来说比较古老,现目前其实很少有用到缓存的分布式集群中,一般在多数据库的分库分表中可能还在使用
hash 算法流程
当向Redis replication 集群发送一条数据时,会先将该条数据的key值进行hash运算,然后将得出来的结果对集群中的replication数量进行取模, 最终获得一个replication节点的下标,然后放入该下标的replication中
hash算法计算

问题分析

hash 算法是最基本的的数据分布存储的算法,但是同样问题也是比较大,如果当上述图谱中的某一套 replcation 失效,那么将会导致整个集群中几乎所有的缓存数据失效,这样持久层的压力会突然增大,有可能会将持久层数据直接打垮
最大的问题就是在于任意一个replication 节点宕机,需要剩余的所有数据重新计算,来进行数据存储恢复

一致性hash算法(自动缓存迁移) + 虚拟节点(自动负载均衡)

一致性hash算法与hash算法最大的区别就是,虚拟构建了一个环状空间,首先有三个replication 节点,然后会先将这些节点进行hash运算,将这三个节点均匀的放在这个环状空间,然后当有数据进行存储或者读取数据的时候,先将这个key进行hash运算,然后在环状空间中确定key hash 的位置,然后顺时针获取最近的节点,来进行存储和读取数据
一致性hash算法模型图

问题分析

一致性hash算法同样存在节点宕机后数据丢失的问题,不过这种算法可以保证只有原来部署在宕机节点上的数据丢失,也就是最多只会增加1/3的流量冲击到数据库
但是同样有个问题,那就是无法将缓存hash热点数据分割,可能集中在某个hash范围之内的数据特别多,那么这样大量的数据就会涌入到同一个redis replication,这样会对整个集群效率影响极大
要解决上述问题,就需要增加节点在环形空间中的散列分布,但是又不能直接部署新的节点,所以,虚拟节点的概念就产生了
虚拟节点说明
虚拟节点+一致性hash算法,这种组合形式可以保证在极端情况下,只会丢失产生故障的replication节点,并且只要虚拟节点够多,可以完全保证数据均匀的散列分布在各个节点上,保证了整个集群的负载均衡

redis cluster 的 hash slot算法
  1. redis cluster 有固定的16384个hash slot,对每隔key 计算CRC16值,然后堆16384取模,可以获取key对应的hash slot
  2. redis cluster中每个master都会持有部分slot,比如有3个master,那么可能每个masster持有5000个hash slot
  3. hash slot让node的增加和移除很简单,增加一个master,就将其他的master的hash slot移动部分过去,减少一个master,就将它的hash slot移动到其他的master上去
  4. 移动hash slot的成本是非常低的
  5. 客户端的api可以对指定的数据,让他们走同一个hash slot,通过hash tag来实现
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值