Redis
基础知识
数据结构
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等)同步给所有从节点和客户端,从节点会更改日志复制的目标修改为新的主节点
哨兵如何把新主节点信息通知给客户端
- 客户端和哨兵建立连接后,客户端会订阅哨兵提供的频道
- 主从切换完毕后,哨兵就会像
+switch-master频道发布新主节点信息(ip、port等) - 客户端监听到频道消息后,会和新主节点建立连接