写点什么

redis

作者:想要飞的猪
  • 2023-12-01
    广东
  • 本文字数:1451 字

    阅读完需:约 5 分钟

哨兵模式

哨兵模式是 redis 的一种高可用解决方案,sentinel 监控,redis 的主从,当主节点出现故障时,由 sentinel 实现故障转移,选出新的主节点。(其实底层实现的操作就是修改 sentinel.conf 以及 redis 主从节点的 redis.conf 实现把从节点升级为主节点 【sentinel.conf 与 redis.conf 中保存的有主节点与从节点的 ip 与端口】)


  • 当 sentinel 启动时会与主节点服务器建立两个链接

  • 命令链接:主要发送命令(默认每 10 向被监控的主服务器发送一个 info 命令获取主服务器与从服务器的相关信息)

  • 订阅链接:主服务器与从服务器订阅的一个 sentinel:hello 的频道(sentinel 每 2 秒钟会向平道发送携带了 sentinel 自身信息与主服务器信息的消息)

  • 检测与下线

  • 主管下线:sentinel 会每秒钟向它监控的服务器发送 ping 命令,如果在配置的时间内没有正确返回或者是超时了,则 sentinel 主管任务这个实例下线了。

  • 客观下线:当一个 sentinel 发现有实例主管下线时,会向其他的 sentinel 发送查询核实该主机的命令,当认为该主机下线了的 sentinel 达到(quornum)配置的数量时,则该实例主机被判断为客观下线。

  • 故障切换

  • 选举 sentinel leader:当判定主机客观下线时,则 sentinel 需要选举一个 leader 去执行故障转移的操作(选举算法为 raft 算法) - sentinel 先判断自己是否已经给其他的投过票了,如果没有投过票则它就成为候选者(Condidate) - 1、更新故障转移状态为 start,2、当前的 epoch+1 进入一个新的选举期,3、向其他节点发送命令 给自己投票(携带自己的 epoch),5、给自己投一票 - 其他的 sentinel 收到命令时判断是否同意投票(通过 epoch) - condidate 会不不断统计自己的得票,超过超过一半,且超过配置的 quornum 时,这时它就成为了 leader。

  • 故障转移:选举出来的 sentinel leader 会在从服务器中选举出新的主服务器

  • 选择 slave-priorty 最高的——>没有最高的则选择偏移量最大的——>选择 run_id 最小的

  • 修改发送命令修改 sentinel.conf 与 redis.config 命令

集群 cluster

redis 集群是使用分区的方式把,数据分布到多台 redis 实例上,以至于没太实例包含一部分数据。


分区的意义


  • 实现存储能力的横向扩展

  • 性能的提升 分区的方式

  • 根据分区主键 ID 来分区

  • 优点:实现简单,迁移方便;缺点:热点数据分布不均匀;

  • client 客户端分区:对于给定的一个 key 直接在客户端就直接选择好正确的节点,然后进行读写

  • 一致性 hash 算法实现

  • 在 redis5.0 之前需要自主实现集群高可用和故障转移

  • redis5.0 之后自带的 redisCluster 是一个区中心化的依靠 Gossip 协议来传播信息的集群

  • Gossip 协议 节点每秒钟随机选择一些主机把收到的信息传播出去,收到信息的节点做同样的事情。redis-cluster 把所有的物理节点(实例)映射到【0-16383】个 slot 上。slot 必须在节点上连续分配,不然集群不能工作。


哨兵模式与 redis-cluster 的区别


  • 拓扑结构不同

  • 哨兵模式:是有由一个或者多个哨兵组成,监控 redis 的主节点和从节点,主

  • 集群模式:集群通过分片的方式存储数据,每个节点都可以和其他节点通信,

  • 功能不同

  • 哨兵模式:主要是实现 redis 的高可用

  • 集群模式:不仅实现 redis 的高可用,还通过分片,实现存储的横向扩展

  • 故障转移不同

  • 哨兵模式:节点出现故障时,由哨兵切换从节点为主节点。

  • 集群模式:自主实现数据分片,自主实现故障转移

Redis key 失效回收

  • 惰性删除:在调用 get,exist 等操作时删除;

  • 定时删除:默认 10 秒删除(可以在 redis.conf 中配置)

内存淘汰策略

  • URL:默认的,最近最少使用

  • LFU:最不常用的键

  • random:随机选择 以上三种都是 两种:在所有的 key 中选择,以及带过期时间的 key 中选择

  • no:禁止淘汰(一般用作数据库时使用)


用户头像

还未添加个人签名 2020-06-05 加入

还未添加个人简介

评论

发布
暂无评论
redis_想要飞的猪_InfoQ写作社区