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。
常见问题:
min‐replicas‐to‐write 1
当主节点写入时,最少需要同步到slave节点的个数才能认为是写成功(和选举功能雷同),但这样会消耗一定的性能。
缓存穿透:当存在恶意攻击或者存在代码漏洞时,在查询缓存中和数据库中都不存在的数据,会频繁的查库,导致数据库压力过大。解决办法:缓存空对象、布隆过滤器。
缓存失效(击穿):大量缓存在同一时间失效导致大量请求同一时间请求数据库。解决办法一般是给缓存设置随机的过期时间。
缓存雪崩:缓存层支持不住大量的请求而出现宕机。解决办法:使用sentinel限流、redis集群等策略。
热点缓存重建优化:当热点缓存到期时,大量请求同时发起重建时,建议使用互斥锁或分布式锁来控制只有一个线程重新缓存热点数据。
缓存与数据库双写不一致问题:
- 通过canal监听binlog日志及时修改缓存信息,缺点:引入了中间件,增加系统的复杂度。
- 并发小的话,可以给缓存设置过期时间,达到定时刷新的目的;并发高的话,如果是非关键数据,也可以同样的处理方式
- 对缓存数据要求很高的话,可以采用redission读写锁来控制,共用一个key值,读读的时候可以并发读取,写入的时候单线程写入
redis通常需要设置过期策略来保证分配内存不会被占满:
- 被动删除:当读时发现已过期再删除
- 主动删除:redis定期删除已过期的key
- 当超过一定的maxmemory时触发主动清理策略
- volatile-ttl:在筛选时,会针对设置了过期时间的键值对,根据过期时间的先后进行删 除,越早过期的越先被删除。
- volatile-random:就像它的名称一样,在设置了过期时间的键值对中,进行随机删除。
- volatile-lru:会使用 LRU (以访问时间为参考)算法筛选设置了过期时间的键值对删除。
- volatile-lfu:会使用 LFU (以访问次数为参考)算法筛选设置了过期时间的键值对删除。
在服务刚启动时,如果发生大量的请求过来,会导致没有空闲链接,开始会需要创建很多的连接,降低了访问速率,这种情况一般会采用缓存预热的方式,创建出部分的redis连接。
您可以选择一种方式赞助本站
支付宝扫一扫赞助
微信钱包扫描赞助
赏