Redis-Cluster集群原理

1、redis-sentinel模式的不足之处

使用Redis Sentinel 模式架构的缓存体系,在使用的过程中,随着业务的增加不可避免的要对Redis进行扩容,熟知的扩容方式有两种,一种是垂直扩容,一种是水平扩容。垂直扩容表示通过加内存方式来增加整个缓存体系的容量比如将缓存大小由2G调整到4G,这种扩容不需要应用程序支持;水平扩容表示表示通过增加节点的方式来增加整个缓存体系的容量比如本来有1个节点变成2个节点,这种扩容方式需要应用程序支持。垂直扩容看似最便捷的扩容,但是受到机器的限制,一个机器的内存是有限的,所以垂直扩容到一定阶段不可避免的要进行水平扩容,如果预留出很多节点感觉又是对资源的一种浪费因为对业务的发展趋势很快预测。Redis Sentinel 水平扩容一直都是程序猿心中的痛点,因为水平扩容牵涉到数据的迁移。迁移过程一方面要保证自己的业务是可用的,一方面要保证尽量不丢失数据所以数据能不迁移就尽量不迁移。针对这个问题,Redis Cluster就应运而生了。

2、redis-cluster集群的概念

redis cluster是Redis的分布式解决方案,在3.0版本推出后有效地解决了redis分布式方面的需求

自动将数据进行分片,每个master上放一部分数据

提供内置的高可用支持,部分master不可用时,还是可以继续工作的

支撑N个redis master node,每个master node都可以挂载多个slave node

高可用,因为每个master都有salve节点,那么如果mater挂掉,redis cluster这套机制,就会自动将某个slave切换成master

(1)由多个Redis服务器组成的分布式网络服务集群;

(2)有多个Master主节点,每一个主节点都可读可写;(redis-sentinel只有一个主节点,高并发请求时,不能缓解写压力)

(3)节点之间会互相通信,两两相连;

(4)Redis集群无中心节点。

3、redis-cluster集群节点复制

 在Redis-Cluster集群中,可以给每一个主节点添加从节点,主节点和从节点直接遵循主从模型的特性。

当用户需要处理更多读请求的时候,添加从节点可以扩展系统的读性能。

4、redis-cluster集群节点故障转移

Redis集群的主节点内置了类似Redis Sentinel的节点故障检测和自动故障转移功能,当集群中的某个主节点下线时,集群中的其他在线主节点会注意到这一点,并对已下线的主节点进行故障转移。

集群进行故障转移的方法和Redis Sentinel进行故障转移的方法基本一样,不同的是,在集群里面,故障转移是由集群中其他在线的主节点负责进行的,所以集群不必另外使用Redis Sentinel。 

5、redis-cluster集群数据分片策略

Redis-cluster分片策略,是用来解决key存储位置的。

100w条数据,5个master,每个master就负责存储20w条数据,分布式数据存储

集群将整个数据库分为16384个槽位slot,所有key-value数据都存储在这些slot中的某一个上。一个slot槽位可以存放多个数据,key的槽位计算公式为:slot_number=crc16(key)%16384,其中crc16为16位的循环冗余校验和函数。

集群中的每个主节点都可以处理0个至16383个槽,当16384个槽都有某个节点在负责处理时,集群进入上线状态,并开始处理客户端发送的数据命令请求。

6、redis-cluster集群redirect转向

由于Redis集群无中心节点,请求会随机发给任意主节点;

主节点只会处理自己负责槽位的命令请求,其它槽位的命令请求,该主节点会返回客户端一个转向错误;

客户端根据错误中包含的地址和端口重新向正确的负责的主节点发起命令请求。

在redis cluster写入数据的时候,其实是你可以将请求发送到任意一个master上去执行

但是,每个master都会计算这个key对应的CRC16值,然后对16384个hashslot取模,找到key对应的hashslot,找到hashslot对应的master

如果对应的master就在自己本地的话,set mykey1 v1,mykey1这个key对应的hashslot就在自己本地,那么自己就处理掉了

但是如果计算出来的hashslot在其他master上,那么就会给客户端返回一个moved error,告诉你,你得到哪个master上去执行这条写入的命令

7、redis-cluster的不足之处

默认情况下,redis cluster的核心的理念,主要是用slave做高可用的,每个master挂一两个slave,主要是做数据的热备,还有master故障时的主备切换,实现高可用的

redis cluster默认是不支持slave节点读或者写的,跟我们手动基于replication搭建的主从架构不一样的

jedis客户端,对redis cluster的读写分离支持不太好的,默认的话就是读和写都到master上去执行的

如果你要让最流行的jedis做redis cluster的读写分离的访问,那可能还得自己修改一点jedis的源码,成本比较高

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章