简介
应用场景
基于redis replication模式+哨兵模式的主从架构,主要使用在高并发高可用场景。
如果还需要针对海量数据做高并发高可用的应用,则需要redis cluster集群架构。
基本描述
redis cluster集群架构,可以支撑n个redis master节点,每一个master节点都可以挂载多个slave节点。
是支持读写分离的架构。写请求统一写入master节点,读请求会从master节点对应的slace节点中去读。
具备高可用,如果master节点宕机,redis cluster可以基于机制,自动将某个slave切换为master节点。
只要基于redis cluster搭建redis集群就可以支撑海量数据+高并发+高可用场景,不需要手动搭建replication主从复制+读写分离+哨兵集群。
内部机制
如何支撑海量数据的高并发访问
(1)会自动将数据进行分片,每一个master存放一部分数据
(2)提供内置高可用机制,部分master不可用时,仍然可以继续对外工作
在redis cluster架构下,每个redis要开放两个端口,比如6379,还有加10000的端口,比如16379。
16379端口号用来进行节点间通信,用于进行故障检测,配置更新,故障转移授权(集群总线:cluster bus
)
cluster bus用一种二进制协议(gossip协议
),主要用于节点间进行高效数据交换,占用更少的网络带宽和处理时间。
如何针对海量数据做数据分片
(1)普通hash算法
描述:针对数据,获取数据key对应的hash值,然后与redis cluster master节点数量进行取模运算,最终一定会将数据分片到集群中的一个master节点。
缺点:如果出现一个master节点宕机,会导致大量的缓存数据失效,不单单是失效节点下的缓存数据,其他缓存数据同样也可能被影响到。大量的数据因为没有缓存,就会直接请求数据库,数据库的负载压力会变大,可能就导致数据库宕机。
(2)一致性hash算法
描述:redis cluster集群的节点会分布在一个圆环上,每一个节点的信息(ip地址等)去做一个hash运算,获取对应的hash值,存放在圆环上;针对数据的请求,同样也是针对数据的key做hash值的获取。然后与节点的hash值做比对, 最终确定数据应该落在圆环的哪个部位。
如果集群中其中一个节点失效,则最多只会影响到这个节点下的缓存数据失效,其他节点的缓存数据并不会产生影响。只会影响失效节点的数据需要访问数据库,减少数据库的访问压力。
缺点:可能存在缓存热点的问题。可能集中在某个hash区间的值会特别多,就会导致大量的数据都涌入同一个master内,造成该master的热点问题,性能出现瓶颈。
虚拟节点: 针对每一个master节点,都均匀分布一些虚拟节点。可以保证大量的数据,都会均匀分布到不同的节点上,而不是大量涌入到同一个master节点上。
功能:实现了自动缓存迁移(一致性hash)+ 自动负载均衡(虚拟节点)
手写一致性hash算法:手写一致性hash算法
(3)redis cluster的hash slot
描述:redis cluster有固定的16384个hash slot,对每个key计算CRC16值,然后对16384取模,可以获取key对应的hash slot信息。redis cluster的每个master节点都会持有部分的hash slot,数据就可以根据hash slot的对应的节点进行存储。hash slot在redis cluster集群的节点增加和删除时,都可以非常方便地进行移动,成本很低。