目录
前言
在Redis中,实现高可用的技术主要包括持久化、主从复制、哨兵和集群,下而分别说明它们的作用,以及解决了什么样的问题。
一、持久化
持久化是最简单的高可用方法,主要作用是数据的备份,将数据存储在硬盘,保证数据不会因为进程退出而丢失数据
1、两种持久化方式
RDB持久化通过将某个时间点的redis服务器存储的数据保存到RDB文件中来实现持久化
基于结果有手动、自动、被动触发
手动触发:直接使用bgsave
自动触发:save m n 900秒至少一次操作
RDB类似于快照周期性的进行保存
AOE持久化是将redis操作日志以追加方式写入文件,类似MySQL的binlog
基于执行语句,有手动、自动方式
手动:bgreweiteaof
自动:基于定期时间执行,基于AOF文件和缓存的差异进行aof
压缩功能:针对于AOF文件进行压缩处理,主要体现在rewrite重写机制
2、两种持久化的区别
区别有四点
- 实现方式:RDB持久化会生成bgsave触发持久化命令但会阻塞新的子进程,当触发bgsave会通知redis主进程fork生成一个子进程来专门做RDB的持久化生成.rdb文件在这过程中主进程无法派生新的子进程,只有rdb文件做完了才会通知主进程阻塞的状态才会解除
而AOF是用了redis服务器执行的所写命令保存到AOF文件中来实现的
- 安全性:AOF安全性比RDB高,如果发送故障,AOF最多丢失1秒内写入的数据,而RDB会丢失上次持久化后写入的数据,AOF只丢失一秒所以安全性高
- 文件体积 :RDB记录的是结果,AOF记录过程,所以AOF文件会越来越大
- 优先级 :由于安全性问题在没有开启AOF持久化时才会使用RDB
总结:
- RDB持久化速度较于AOF更快
- 从rewrite重启后数据恢复角度看AOF更加安全
- 优先级AOF关闭时才会使用RDB
- AOF文件毕RDB文件大,并且首次全量备份后会进行增量备份容易造成服务器磁盘空间问题
2、两种持久化的优点
RDB
优点:文件紧凑,体积小,网络传输快,适合全量复制。恢复速度比AOF快
缺点:做不到实施持久化,需要满足特定格式兼容性较差
AOF
优点:支持秒级的持久化,兼容性好
缺点:文件大恢复速度慢,对性能影响大
二、主从复制
1、主从复制的作用
- 主从复制 主从复制是高可用Redis的基础,哨兵和集群都是在主从复制基础上实现高可用的。主从复制主要实现了数据的多机备份,以及对于读操作的负载均衡和简单的故障恢复。
- 缺陷:故障恢复无法自动化:写操作无法负载均衡:存储能力受到单机的限制。
2、主从复制的流程
- slave加入到主从复制集群会根据配置文件的指向找到master节点,然后发送rsync命令请求同步
- Mastre接收到请求后,由主进程fok一个子进程,子进程开始bgsave得到基于当前的.rdb文件,发送rdb文件给slave
- Slave收到文件后先检查自己数据库是否有数据,无数据则基于rdb文件进行恢复操作,有文件则先清空数据在恢复
- 在恢复过程中master产生的新数据会以AOF保存在缓冲区中,slave再从缓冲区中同步到磁盘中,在此之后master产生的数据会以AOF机制到slave
总结:当开启主从复制后第一次以RDB(相当于增量备份),次后所有数据都是以AOF(类似于增量备份的方式)
三、哨兵
1、哨兵的作用
- 在主从复制的基础上,哨兵实现了自动化的故障恢复。
- 缺陷:写操作无法负载均衡,存储能力受到单机的限制
2、哨兵检测整个系统节点过程
- 三个哨兵之间建立命令连接,周期性检测队友状态
- 哨兵会向master节点(在配置文件中指定)发送两条连接,分别是命令连接和订阅连接(为了周期性获得master节点数据)
- 哨兵向master周期性返回info命令,master(活着的情况下)会返回redis-cli info replication master节点信息+从节点位置
- 哨兵通过master返回信息得到slave信息,再向slaves节点发送info命令,slaves返回数据,从而哨兵集群可以获得整个redis集群的所有信息
- 哨兵会向服务器发送命令连接,建立自己的hello频道,哨兵会向这个hello频道建立订阅,用于哨兵之间消息共享
3、哨兵的主要功能
- 集群监控:负责监控Redismaster和slave进程是否正常工作
- 消息通知:如果某个Redis实例有故障,那么哨兵负责发送消息作为报敬通知给管理员
- 故障转移:如果masternode挂掉了,会自动转移到slave node上
- 配置中心:如果故障转移发生了,通知client客户端新的master地址
4、哨兵模式下的故障迁移
主观下线
哨兵(Sentinel)节点会每秒一次的频率向建立了命令连接的实例发送PING命令,如果在down-after-milliseconds毫秒内没有做出有效响应包括(PONG/LOADING/MASTERDOWN)以外的响应,哨兵就会将该实例在本结构体中的状态标记为SRI_S_DOWN主观下线
客观下线
当一个哨兵节点发现主节点处于主观下线状态是,会向其他的哨兵节点发出询问,该节点是不是已经主观下线了。如果超过配置参数quorum个节点认为是主观下线时,该哨兵节点就会将自己维护的结构体中该主节点标记为SRIO DOWN客观下线询问命令SENTINEL is-master-down-by-addr
master选举
在认为主节点客观下线的情况下,哨兵节点节点间会发起一次选举,命令为:SENTINEL is-master-down-by-addr
只是runid这次会将自己的runid带进去,希望接受者将自己设置为主节点。如果超过半数以上的节点返回将该节点标记为leacer的情况下,会有该leader对故障进行迁移
从节点中挑选出新的主节点的条件
通讯正常
优先级排序
优先级相同时选择offset最大的
四、集群
- 通过集群,Redis解决了写操作无法负载均衡,以及存储能力受到单机限制的问题,实现了较为完善的高可用方案。
-
redis的集群最低需要6个节点,3主3从
redis的哨兵模式基本已经可以实现高可用、读写分离,但是在这种模式每台redis服务器都存储相同的数据,很浪费内存资源,所以在redis3.0上加入了Cluster群集模式,实现了redis的分布式存储,也京是说每台redis节点存储着不同的内容根据官方推荐,集群部署至少要3台以上的master节点,最好使用3主3从六个节点的模式
五、结语
以上只是理论介绍了redis高可用的模式,下篇将介绍主从复制与哨兵的搭建。