redis
哨兵模式
哨兵模式是 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:禁止淘汰(一般用作数据库时使用)
评论