Redis集群及性能优化

avatar 2022年8月20日18:17:47 评论 215 次浏览

redis集群架构是基础主从架构的基础下,兼有哨兵的选举功能,并且可以横向拓展的高可用架构。redis集群至少需要三个master节点,并且建议奇数节点的部署模式,主要是由于master的选举规则限制。

redis集群master选举规则是当slave感知master节点变为fail时,会主动广播其他集群中其他节点,只有master节点会返回一个ack信息(master只会响应第一个接受到广播的slave节点并回应),当超过半数的master返回信息后,该slave会升级为主节点,并且广播消息通知到其他集群节点。

redis集群搭建成功后,会给每一个master分配指定的hash槽,存储数据时会根据key值得hash值取模存入具体的master节点。当需要横向扩容时,也可以根据命令分配新的mater指定的hash槽,在分配完hash槽时会将数据自动迁移到新的master。

常见问题:

网络抖动:如果存在网络抖动会导致频繁的切换主从,这时可以cluster-­node­-timeout来设定失联一定的时候才触发主从选举机制。

集群脑裂数据丢失问题:当集群没有过半机制时会存现脑裂问题,主节点还在不断的写数据,但是已经触发了选举,而这段时间写入的数据会存在丢失,解决这类问题可以通过设置

min‐replicas‐to‐write 1

当主节点写入时,最少需要同步到slave节点的个数才能认为是写成功(和选举功能雷同),但这样会消耗一定的性能。

缓存穿透:当存在恶意攻击或者存在代码漏洞时,在查询缓存中和数据库中都不存在的数据,会频繁的查库,导致数据库压力过大。解决办法:缓存空对象、布隆过滤器。

缓存失效(击穿):大量缓存在同一时间失效导致大量请求同一时间请求数据库。解决办法一般是给缓存设置随机的过期时间。

缓存雪崩:缓存层支持不住大量的请求而出现宕机。解决办法:使用sentinel限流、redis集群等策略。

热点缓存重建优化:当热点缓存到期时,大量请求同时发起重建时,建议使用互斥锁或分布式锁来控制只有一个线程重新缓存热点数据。

缓存与数据库双写不一致问题:

  • 通过canal监听binlog日志及时修改缓存信息,缺点:引入了中间件,增加系统的复杂度。
  • 并发小的话,可以给缓存设置过期时间,达到定时刷新的目的;并发高的话,如果是非关键数据,也可以同样的处理方式
  • 对缓存数据要求很高的话,可以采用redission读写锁来控制,共用一个key值,读读的时候可以并发读取,写入的时候单线程写入

redis通常需要设置过期策略来保证分配内存不会被占满:

  • 被动删除:当读时发现已过期再删除
  • 主动删除:redis定期删除已过期的key
  • 当超过一定的maxmemory时触发主动清理策略

四种主动清理策略:

  1. volatile-ttl:在筛选时,会针对设置了过期时间的键值对,根据过期时间的先后进行删 除,越早过期的越先被删除。
  2. volatile-random:就像它的名称一样,在设置了过期时间的键值对中,进行随机删除。
  3. volatile-lru:会使用 LRU (以访问时间为参考)算法筛选设置了过期时间的键值对删除。
  4. volatile-lfu:会使用 LFU (以访问次数为参考)算法筛选设置了过期时间的键值对删除。

在服务刚启动时,如果发生大量的请求过来,会导致没有空闲链接,开始会需要创建很多的连接,降低了访问速率,这种情况一般会采用缓存预热的方式,创建出部分的redis连接。

avatar

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: