Redis组件介绍(五)

打印 上一主题 下一主题

主题 1862|帖子 1862|积分 5596

写在前面

今天继续学习redis后面的知识。
Redis 哨兵机制

哨兵 Sentinel 机制

Sentinel(哨兵)是 Redis 的高可用性解决方案。由一个或多个 Sentinel 实例组成的 Sentinel 系统可以监视任意多个主服务器,以及这些主服务器部属的所有从服务器。当被监视的主服务器进入下线状态时,Sentinel 会主动将下线主服务器部属的某个从服务器升级为新的主服务器。简单来说,哨兵就是带有主动故障转移功能的主从架构。
无法解决:

  • 单节点并发压力问题
  • 单节点内存和磁盘物理上限
哨兵架构原理


Redis 集群

集群

Redis 从 3.0 开始支持 Cluster 模式。Redis 集群支持节点的主动发现、支持从主节点的选举和容错、支持在线分片(sharding)等特性。
PING PONG 协议(心跳机制)
集群搭建


创建集群


  • 预备环境安装 Ruby 以及 Redis 集群依赖
    1. yum install -y ruby rubygems
    2. # https://rubygems.org/gems/redis/versions
    3. gem install redis-xxx.gem
    复制代码
  • 在一台机器创建 7 个目录
    1. # 创建目录并复制配置文件
    2. cp /usr/local/soft/bigdata17/redis-install/redis-7.0.0/redis.conf ./7000/
    3. cp /usr/local/soft/bigdata17/redis-install/redis-7.0.0/redis.conf ./7001/
    4. cp /usr/local/soft/bigdata17/redis-install/redis-7.0.0/redis.conf ./7002/
    5. cp /usr/local/soft/bigdata17/redis-install/redis-7.0.0/redis.conf ./7003/
    6. cp /usr/local/soft/bigdata17/redis-install/redis-7.0.0/redis.conf ./7004/
    7. cp /usr/local/soft/bigdata17/redis-install/redis-7.0.0/redis.conf ./7005/
    8. cp /usr/local/soft/bigdata17/redis-install/redis-7.0.0/redis.conf ./7007/
    复制代码
  • 修改不同目录设置文件
    1. # 编辑配置文件(例如 ./7000/redis.conf)
    2. port 7000                           # 修改端口
    3. # bind 127.0.0.1 -::1              # 开启远程连接
    4. protected-mode no
    5. daemonize yes                       # 开启后台运行
    6. dbfilename dump-7000.rdb            # 每台机器的文件不能一样
    7. cluster-enabled yes                 # 开启集群模式
    8. cluster-config-file nodes-7000.conf # 集群节点配置文件
    9. cluster-node-timeout 5000           # 集群节点超时时间
    10. appendonly yes                      # 开启 AOF 持久化
    11. appendfilename "appendonly-7000.aof" # 修改 AOF 文件名
    12. appenddirname "appendonlydir-7000"
    复制代码
  • 指定不同目录设置文件启动七个节点
    1. redis-server 7000/redis.conf
    2. redis-server 7001/redis.conf
    3. redis-server 7002/redis.conf
    4. redis-server 7003/redis.conf
    5. redis-server 7004/redis.conf
    6. redis-server 7005/redis.conf
    7. redis-server 7006/redis.conf
    复制代码
  • 复制集群操作脚本到 bin 目录中
    1. cp /usr/local/soft/bigdata17/redis-install/redis-7.0.0/src/redis-trib.rb /usr/local/soft/redis/bin/
    复制代码
    对于 Redis 7.0.0 之后的版本,使用以下下令:
    1. redis-cli --cluster create 192.168.40.110:7000 192.168.40.110:7001 192.168.40.110:7002 192.168.40.110:7003 192.168.40.110:7004 192.168.40.110:7005 --cluster-replicas 1
    复制代码


  • 查看集群状态
    1. # 查看集群状态
    2. redis-cli --cluster check 192.168.40.110:7000
    复制代码
集群节点状态阐明


  • 主节点

    • 主节点存在 hash slots,且主节点的 hash slots 没有交织
    • 主节点不能删除
    • 一个主节点可以有多个从节点
    • 主节点宕机时多个副本之间主动选举主节点

  • 从节点

    • 从节点没有 hash slots
    • 从节点可以删除
    • 从节点不负责数据的写,只负责数据的同步

使用集群


  • 添加节点(默认为从)
    1. # 添加主节点
    2. redis-cli --cluster add-node 192.168.40.110:7006 192.168.40.110:7000 --cluster-slave
    复制代码
    留意:1. 该节点必须以集群模式启动   2. 默认情况下该节点是以 master 节点形式添加

  • 删除副本节点
    1. # 删除节点
    2. redis-trib.rb del-node 192.168.40.110:7002 0ca3f102ecf0c888fc7a7ce43a13e9be9f6d3dd1
    复制代码
    留意: 1. 被删除的节点必须是从节点或没有被分配 hash slots 的节点
Redis 面试题与理解

穿透(要查询的数据根本不存在)

穿透指用户查询数据时,如果数据既不存在于数据库中,也不存在于缓存中,那么每次请求都会直接访问数据库,从而绕过缓存,导致数据库负载增加。

穿透解决方案


  • 对空值进行缓存
    类似于上面的例子,虽然数据库中没有 id=-1234 的用户数据,但可以在 Redis 中缓存一个空值(key=-1234,value=null),以制止频仍查询数据库。
  • 实时监控
    对 Redis 进行实时监控,发现命中率下降时进行排查,结合运维职员分析访问对象和数据,设置黑名单限制服务。
  • 使用布隆过滤器
    使用 BitMap 作为布隆过滤器,将所有可访问的资源通过简单的映射关系放入布隆过滤器中,当请求到来时,先进行布隆过滤器判定,如果有则放行,否则拦截。
  • 接口校验
    对无效请求(例如 id=-1234)进行拦截,防止其到达 Redis 或数据库。
雪崩(一批数据有,但过期时间到了)

雪崩指大量数据在同一时刻过期,导致大量请求落到数据库,造成数据库压力增加,严峻时可能导致数据库宕机。

雪崩解决方案


  • 使用互斥锁(Mutex Lock)或分布式锁
    只允许一个请求访问后端数据源,其他请求等待并共享效果。
  • 将失效时间分散开
    使用随机数生成缓存的过期时间,制止会合失效。
  • 使用多级缓存架构
    例如使用 nginx 缓存 + Redis 缓存 + 其他缓存,不同层使用不同缓存,可靠性更强。
  • 设置缓存标记
    记载缓存数据是否过期,过期时触发后台线程更新现实的 key。
  • 设置热门数据的永不过期或较长过期时间
    减少热门数据失效的机会。
击穿(针对某一个数据忽然过期,直接查数据库)

击穿指高并发情况下,当一个 key 忽然失效,大量请求直接访问数据库,可能导致数据库负载过高。

击穿解决方案


  • 为缓存数据设置不同的过期时间
    制止会合失效,监控数据,适时调整。
  • 引入两级缓存架构
    使用当地缓存(如 Guava Cache)作为第一级缓存,Redis 作为第二级缓存,设置不同的过期时间。
  • 针对热门数据预加载
    保证缓存不会在同一时间全部失效。
总结

如果大量的请求在redis上得不到相应,那么就会导致这些请求会直接去访问DB,导致DB的压力瞬间变大而卡死或者宕机。

  • 大量高并发请求打在 Redis 上
  • Redis 上的资源未能相应时,直接访问数据库
  • 数据库压力瞬间增大,可能导致数据库宕机,引发一系列“灾难”

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

篮之新喜

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表