Redis-cluster集群模式

Redis-cluster集群模式下的各种问题

Redis-cluster集群模式

哨兵模式最大的缺点就是每隔slave都要存放一样的数据,而数据量如果非常大的话,会造成经常要淘汰key-value,导致redis的命中率大大下降。所以有出现了另一种集群模式。

redis-cluster集群:redis将数据分片,分布在各台机器,每一份数据都不是重复的,当我们要访问的时候,运用一致性Hash算法命中对应的机器。

实现分片的算法:一致性hash -> hash slot算法 不同的算法,决定在多个master节点的时候,数据如何分布到这些节点上面

  • 一致性hash算法可能会造成热点数据大量的集中在同一个master中,造成整个系统的性能瓶颈。
  • hash slot算法:在一致性hash的基础上,使用虚拟节点的技术,给每个master都在每隔区间内设置虚拟节点,使得圆环上原本每个master与master之间的数据都被均匀地分布在各个master之间,取代了原来整段都是分布在同一个master上,将压力分散到每台master上,从而提升了系统性能的稳定性。
  • hash slot算法中 每个cluster集群有固定16384个hash slot,对每隔key计算CRC16的,然后对16384(2的16次方)取模,从而获取key的hash slot,每个master都会持有部分的slot(取决于总共有多少个master去“瓜分”这些slot),hash slot让node的增加和移除非常简单,增加一个master就将它master的hash slot分一部分给他,减少一个master,则将其slot移动到其他slot当中,移动hash slot的成本是非常低的。客户端可以对指定的数据,让它们落到同一个hash slot当中去,可以通过hash tag实现。
Redis-cluster的核心原理
  1. 节点之间的通信:采用gossip协议进行通信,与集中式不同的是,元数据的更新比较分散,不是集中在一个地方,更新会陆续地打到所有地节点上,有一定的延迟,但是可以降低单机的压力
  2. 每个节点都开启10000端口与其他节点通信,每隔一段时间都会往另外几个节点返送ping消息,同时其他几个节点收到ping之后返回pong
  3. gossip协议
    1. meet:某个节点发送meet给新加入的节点,让新节点加入到集群当中,然后新的节点就会开始与其他节点通信
    2. Ping:每隔节点都会频繁给其他节点发送Ping,包含自己的状态和自己维护的元数据,每隔节点通过Ping交换数据。
    3. pong:返回ping和meet,包含自己的状态和其他信息,也可以用于信息广播和更新
    4. fail:某个节点判断另外一个节点fail之后,就会发送fail给其他节点,通知其他节点指定的节点宕机了
  4. Ping指令使用非常频繁,每次Ping都会携带一些元数据,所以可能会加重网络负担,每个节点每秒都会执行10次Ping,每次选择5个最久没有通信的其他节点,如果发现某个节点通信延时达到了cluster_node_timeout /2,就回立即发送Ping,避免数据交换延时过长,每次Ping都会带上自己的元数据以及1/10集群数量的其他节点的信息,发送出去进行数据交换

读写分离:支持多个redis master node,写操作写到master当中,读操作往slave中读

高可用性:如果某个master宕机了,会自动将某个slave切换为master

我们要做redis集群只需要使用redis cluster去搭建redis集群即可,不在需要手工去搭建replcation复制+主从架构+读写分离+哨兵集群+高可用

如果数据量不是很多,而且主要是用于高并发的场景,比如就几个g,单机单master+多slave就可以了

,但如果要支持海量数据+高并发+高可用的场景,就要运用redis-cluster去搭建集群了

面向集群的Jedis内部实现原理
  • 基于重定向的客户端 : redis-cli -c 自动重定向

    • 请求重定向客户端可能会挑选任意一个redis实例去发送命令,每个redis实例接收到命令都会计算器hash slot,如果对应则直接处理,如果不对应,则返回,让客户端进行重定向
    • 通过Key计算CRC16的值,再对16384取模则可以得到hash slot 用hash tag可以手动指定key 对应的slot 同一个hash tag 下的key 都会在一个hash slot中
    • hash slot查找 :节点之间通过gossip协议数据交换,就可以知道每个hash slot在哪个节点上面
  • smart jedis

    • 本地维护一份hash slot映射表缓存,大部分情况下可以直接走本地缓存找到hashslot
    • Jedis Cluster工作原理: 每次Jedis cluster初始化的时候,就会随机选择一个node,初始化hashslot ->node映射表,同时为每个节点创建一个Jedis pool连接池,每次基于JedisCluster执行操作,首先JedisCluster都会在本地计算key的hashslot,然后在本地映射表查看对应的节点,如果发现对应的节点返回moved,那么利用该节点的元数据,更新本地缓存映射表,重复这个步骤知道找到对应的节点,如果重试超过5次,则报错。
    • hashslot迁移和ask重定向
      • 如果hash slot正在迁移,那么会返回ask重定向给jedis,jedis接收到ask重定向之后,会重新定位到目标节点去执行,但是因为ask发生在hash slot的迁移过程中,所以jediscluster收到ask是不会更新hashslotbb本地缓存的
Redis cluster高可用主备切换原理
  • 判断节点宕机
    • 如果一个节点认为另外一个节点宕机,那么就是pFail,主观宕机
    • 如果多个节点都认为一个节点宕机,那么就是fail,客观宕机,跟哨兵模式一样
    • 在cluster-node-timeout内,某个节点一直没有返回pong,那么就回呗认为pfail
    • 如果一个节点认为某个节点pfail了,那么会在gossip消息中,Ping给其他节点,如果超过半数节点都认为fail,那么就会变成fail
  • 从节点过滤
    • 对宕机的master 从其所有slave中,选择一个切换成为Master,检查每个slave与master断开连接的时间,如果超过了cluster-node-timeout*cluster-slave-validity-factor,那么就没有资格切换成为master
  • 从节点选举
    • 每个slave都根据自己对master复制数据的offset,来设置一个选举时间,offset越大,选举时间越靠前,所有master都给要选举地节点投票,某个slave地票数如果超过半数,则选举成功。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值