一.redis replication的容量瓶颈问题
我们知道redis replication+sentiel是单master节点多slave节点的这样一个架构,这样的话就会存在一个容量瓶颈问题。就是说,如果你的master节点的内存容量为16G,那么就算你把所有的内存都给redis使用的话,最大的缓存容量也就是16G,而每个slave节点的数据是跟slave节点是保持一致的,也就是说整个redis replication 集群的缓存容量为16G。当你的数据接近16G的时候,redis就会执行数据过期或淘汰算法,比如LRU。那么客户端再请求那些被清除过的数据的时候,因为redis已经将他清除,这时候就是直接去数据库查询数据,这样就会变相的降低系统的吞吐量,使系统能够承受的并发量变低。
二.使用redis cluster集群架构解决单master的容量瓶颈问题
我们再使用redis replication的时候,为了提升集群能够承受的QPS我们会水平扩容slave节点,这样就能比较轻松的增加redis replication集群的QPS。对于单master节点的容量瓶颈问题,我们也可以采取这个策略,如果redis集群中的master节点也可以水平扩容的话,是不是就可以增加集群所能缓存的数据容量了。我们使用redis cluster便能够实现这个目标。
三.redis cluster简介
1.redis cluster它可以支持多个master节点,每个master可以挂载多个slave。
2.它也支持读写分离的架构,对于每个master节点来说,写在master节点,读都会去这个master节点对应的slave节点。
3.redis cluster也能保证高可用性,每个master节点有多个slave节点,那么如果master挂掉,redis cluster会自动切换一个slave为master。
4.在redis cluster架构下,每个redis要放开两个端口号,比如一个是6379,另外一个就是加10000的端口号,比如16379
16379端口号是用来进行节点间通信的,也就是cluster bus集群总线。cluster bus进行通信,用来进行故障检测,配置更新,故障转移授权。
5.cluster bus用了另外一种二进制的协议,主要用于节点间进行高效的数据交换,占用更少的网络带宽和处理时间。
四.redis cluster和redis replication如何选择
如果你的数据量不大,一般只有几个G,主要是应对高并发的场景,那么你使用redis replication便足够了。但是如果你的数据量很大,那么你就可以选择redis cluster,它不仅可以支撑高并发,高可用,还可以支持海量数据的场景。
五.数据分布算法:hash算法,一致性hash算法+虚拟节点,redis cluster的hash slot算法简介
1.hash算法
hash算法是比较老的一种数据分布算法,当客户端要读取一个key的时候,先计算这个key的hash值,然后使用这个值对当前master节点的数量进行取模,然后根据结果选择对应的master节点。
hash算法的弊端(大量缓存重建):在运行的时候如果一台master宕机了,那么会造成这台机器上的所有缓存丢失,如果是三台的话,立马就会丢失三分之一的数据。但是这个算法还有一个弊端,如果其中一台master宕机的话,那么当前取模的数量就会减一,这要就会造成结果错位,这是什么意思呢?就是说本来有三台master节点,其中一台宕机了,那么现在就以2取模,宕机发生的时候三分之一的数据就已经没有了,现在以2取模,本来结果为2的key说不定就会被指向其他的master,那么这部分数据还是会取不到,直接造成大量的请求直接去数据库拿数据。所以传统的hash算法多用在数据库分库分表上,对应高并发的缓存存储会有不小的问题,对于高并发场景是不能接受的。
2.一致性hash算法(自动缓存迁移)+虚拟节点(自动负载均衡)
一致性hash算法的原理如下图所示:
一致性hash算法的弊端:
使用虚拟节点来解决热点数据问题
3.redis cluster的hash slot 算法
redis cluster有固定的16384个hash slot,对每个key计算CRC16值,然后对16384取模,可以获取key对应的hash slot,redis cluster中每个master都会持有部分slot,比如有3个master,那么可能每个master持有5000多个hash slot,hash slot让node的增加和移除很简单,增加一个master,就将其他master的hash slot移动部分过去,减少一个master,就将它的hash slot移动到其他master上去,移动hash slot的成本是非常低的。
redis cluster 使用的hash slot算法可以使请求均匀的打在每台master上,即使一台服务器宕机,短时间内这台宕机的master上的数据不能访问,但是redis cluster会快速的将这台master上的hash slot 转移到别的master上,其他master上的数据并不会受到影响,因为每个key都有它对应的hash slot,而且移动这些hash slot速度很快,成本也很低。
如果你想要指定数据走指定的hash slot,redis cluster 也会有相应的API可以实现,通过hash tag实现。