基础知识

数据结构

Redis有5种基本数据结构:String(字符串)、List(列表)、Set(集合)、Hash(散列)、ZSet(有序集合)

3种特殊数据类型:Bitmap(位图)、HyperLogLog(基数统计)、GEO(地理位置)

保证Redis的高可用

部署多个Redis做主从,主节点只用于写入数据,从节点用于读取数据,通过主从复制把数据复制保证数据的一致性;并通过哨兵模式保证主节点的存在

主从复制

主从复制分为全量复制和增量复制

全量复制:主节点通过命令(bgsave)生成RDB文件,然后将文件发送给从节点,从节点清空全部数据,加载RDB文件;主节点开始生成RDB文件到从节点加载完毕RDB文件这段时间内的写命令会放到缓冲区,并在从节点加载完RDB文件后,主节点在把缓存区的命令发送到从节点

增量复制:主从节点之间会有一个TCP长连接,主节点会将收到的写命令会异步的通过TCP发送给从节点

主从复制全量复制使用RDB的原因

RDB是压缩后的二进制数据,占用空间小;AOF是一条条的写命令,占用空间大,并且回复数据需要顺序执行命令

哨兵

哨兵能够监控所有Redis节点的状态,当发现主节点宕机,可以执行主从故障转移

状态监控:哨兵会和所有的节点维持一个心跳 (ping),当一个哨兵发现主节点主观下线了 ,就会向哨兵集群(三个以上)内的其他哨兵发起投票,如果超半数判定这个主节点下线了,那么就客观判定主节点确实是下线了,这时候会做一个故障转移

故障转移:哨兵集群有一个哨兵Leader(通过Raft算法的Leader选举思想),Leader会从所有的从节点中挑选一个从节点转从为主

如何挑选从节点:

  • slave优先级(从节点优先级),配置文件中replica-priority配置的值,值越小,优先级越高
  • 复制进度(日志完整度),与旧主节点数据最接近的从节点
  • 节点Id,当上面的条件都一样时,按照节点Id从小到大的顺序,进行选择

选举好新的主节点后,会把新主节点的信息(ip、port等)同步给所有从节点和客户端,从节点会更改日志复制的目标修改为新的主节点

哨兵如何把新主节点信息通知给客户端

  1. 客户端和哨兵建立连接后,客户端会订阅哨兵提供的频道
  2. 主从切换完毕后,哨兵就会像+switch-master频道发布新主节点信息(ip、port等)
  3. 客户端监听到频道消息后,会和新主节点建立连接