Redis-Cluster集群

Redis自2.8版本提供了正式的sentinel机制之后,具备集群的高可用性,基本可以满足一般的生产需求,但是当数据量大到一台服务器根本存放不下的情况时,主从同步模式或哨兵机制就不能满足需求了,这个时候就需要对存储的数据进行分片,将数据存储到多个Redis实例中。

Redis Cluster是Redis官方提供的分布式解决方案,在3.0版本后推出,有效地解决了Redis分布式需求。可以将Redis Cluster看作是主从同步和哨兵机制的结合体,在此基础上又提供了高级的功能。

Redis-Cluster集群_第1张图片

Redis Cluster是一个去中心化的集群,每个节点都会跟其他节点保持连接,用来交换彼此的信息。Client只要与其中一个节点连接,就可以访问其他节点并进行读写操作。而且每个节点有两个TCP端口:一个是与客户端连接的命令端口(例如6379),还有一个集群总线端口(为16379),是使用二进制协议的节点到节点通信通道。命令端口和集群总线端口偏移量是固定的,始终为10000,而且一定要保障这两个端口的正常。

在初建Redis Cluster的时候,添加节点add-node命令可以让节点相互握手,然后通过流言协议gossip交换信息。如果一个节点Redis1在集群中,新节点Redis7加入的时候与Redis1节点握手,Redis1节点会把集群内的其他节点信息通过gossip协议发送给Redis7,Redis7会一一与这些节点完成握手,从而加入到集群中。

数据分片算法:

节点取余:根据key的hash值和节点数取模的方式计算出节点ID,然后向对应的节点提交数据,新增或者删除节点会造成大量的数据迁移。

一致性哈希:对于任何的哈希函数,都有其取值范围。我们可以用环形结构来标识范围。通过哈希函数,每个节点都会被分配到环上的一个位置,每个键值也会被映射到环上的一个位置,然后顺时针找到相邻的节点,新增或者删除节点会造成数据分布不均匀。

虚拟槽:这也是Redis Cluster使用的数据分片算法,Cluster共使用16384个槽,每个Redis节点上有一定数量的槽。Cluster会根据key计算出槽的值来确定key归属的节点。

Redis-Cluster集群_第2张图片

Cluster集群数据访问:
 当Client提交数据到某个Cluster节点后,Cluster节点要先根据CRC16(key)&16383算式来计算出数据要落到哪个虚拟槽内,如果槽在这个节点上,直接执行命令;如果槽不在该节点上,节点会执行cluster nodes命令获取整个数据分布表,然后返回正确的目标节点信息给Client,这样就能每次请求到正确的节点,而一旦数据分布表发生变化,请求到错误的节点,返回信息后,需要重新执行cluster nodes命令更新数据分布表。Client重新提交数据到目标节点,所以Redis Cluster使用重定向而不是代理方式处理请求。

Redis-Cluster集群_第3张图片

均衡集群的slave:

在Cluster集群中,一个master连同其下的slave节点,我们称之为一个group,如果这个master节点的全部slave节点宕机,那么这个master节点成为了孤儿master节点,原来就没有slave的master节点不能认为是孤儿master节点。

Redis Cluster支持均衡slave功能,官方称为Replica migration:集群能把某个slave较多的group上的slave迁移到那些孤儿master上,该功能可通过cluster-migration-barrier参数配置(默认为1),slave在每次定时任务时都会检查是否需要迁移slave,即是否变成孤儿master的slave。

Redis Cluster一些常用配置:

配置信息包含在了redis.conf中,要修改的主要有6个选项(每一个节点都需要做这些配置)

cluster-enabled yes  #开启集群
cluster-config-file nodes-6379.conf #集群配置信息文件,由Redis自行更新,不用手动配置。每个节点都有一个集群配置文件用于持久化保存集群信息,需确保与运行中实例的配置文件名    不冲突。
cluster-node-timeout 15000  #节点互连超时时间,毫秒为单位
cluster-slave-validity-factor 10  #在进行故障转移的时候全部slave都会请求申请为master,但是有些slave可能与master断开连接一段时间了导致数据过于陈旧,不应该被提升为master。该参数就是用来判断slave节点与master断线的时间是否过长。判断方法是:比较slave断开连接的时间和(node-timeout * slave-validity-factor)+ repl-ping-slave-period如果节点超时时间为三十秒, 并且slave-validity-factor为10,假设默认的repl-ping-slave-period是10秒,即如果超过310秒slave将不会尝试进行故障转移
cluster-migration-barrier 1 #master的slave数量大于该值,slave才能迁移到其他孤立master上,如这个参数被设为2,那么只有当一个主节点拥有2个可工作的从节点时,它的一个从节点才会尝试迁移。
cluster-require-full-coverage yes #集群所有节点状态为ok才提供服务。建议设置为no,

我们总结一下Redis Cluster结构特点:

所有的节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽。
节点的fail是通过集群中超过半数的节点检测失效时才生效。
Client与节点直连,不需要中间proxy层。客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可。
Redis Cluster把所有的物理节点映射到[0-16383]slot上(不一定是平均分配),Cluster负责维护Node-->slot-->value。
支持重定向而不是代理方式处理请求。
可以均衡集群中的slave节点。

集群故障处理:

参考另一篇:https://blog.csdn.net/weixin_39523456/article/details/105199497

你可能感兴趣的:(中间件)