Redis如何实现高可用
Redis实现高可用主要有三种部署模式:主从模式、哨兵模式和集群模式。
主从模式
Redis是一主(master)多从(slave),主节点负责读写操作,从节点只负责读操作,一个主节点可以有多个从节点,而一个从节点只能有一个主节点,从节点的数据来自于主节点,实现原理是主从复制机制。主从复制机制包括全量复制,增量复制两种方式,一般当slave第一次启动连接master的时候采用全量复制,过程如下:- 当slave启动时,会向master发送sync命令;
- master接收到sync命令后会开始在后台保存快照(执行rdb操作),并用缓存区记录后续的所有写操作;
- master执行完后,向所有slave发送rdb快照文件;
- slave收到rdb快照文件后,载入、解析收到的快照;
- master快照发送完毕后,开始向slave发送缓冲区中的写命令;
- salve接受命令请求,并执行来自master缓冲区的写命令;
在slave和master全量同步之后,master上的数据,如果再次发生更新,就会触发增量复制。增量复制的过程主要是master每执行一个写命令就会向slave发送相同的写命令,slave接收并执行收到的写命令。
哨兵模式
此段来自:redis如何实现高可用【主从复制、哨兵机制】
哨兵机制需要主从复制的支持,Redis的哨兵(sentinel) 系统用于管理多个 Redis 服务器,该系统执行以下三个任务:
- 监控(Monitoring): 哨兵(sentinel) 会不断地检查Master和Slave是否运作正常。
- 提醒(Notification):当被监控的某个Redis出现问题时, 哨兵(sentinel) 可以通过 API 向管理员或者其他应用程序发送通知。
- 自动故障迁移(Automatic failover):当一个Master不能正常工作时,哨兵(sentinel) 会开始一次自动故障迁移操作,它会将失效Master的其中一个Slave升级为新的Master, 并让失效Master的其他Slave改为复制新的Master; 当客户端试图连接失效的Master时,集群也会向客户端返回新Master的地址,使得集群可以使用Master代替失效Master。
哨兵(sentinel) 是一个分布式系统,你可以在一个架构中运行多个哨兵(sentinel) 进程,这些进程使用流言协议(gossip protocols)来接收关于Master是否下线的信息,并使用投票协议(agreement protocols)来决定是否执行自动故障迁移,以及选择哪个Slave作为新的Master。每个哨兵(sentinel) 会向其它哨兵(sentinel)、master、slave定时发送消息,以确认对方是否活着,如果发现对方在指定时间(可配置)内未回应,则暂时认为对方已挂(所谓的主观认为宕机 Subjective Down,简称sdown)。若哨兵群中的多数sentinel,都报告某一master没响应,系统才认为该master彻底死亡(即:客观上的真正down机,Objective Down,简称odown),通过一定的投票算法,从剩下的slave节点中,选一台提升为master,然后自动修改相关配置。哨兵是一个运行在特殊模式下的 Redis 服务器,可以在启动一个普通 Redis 服务器时通过给定 --sentinel 选项来启动哨兵(sentinel)。
集群模式
此段参考:怎么实现Redis的高可用?
Redis 的哨兵模式基本已经可以实现高可用,读写分离 ,但是在这种模式下每台 Redis 服务器都存储相同的数据,浪费内存,所以在redis3.0上加入了 Cluster 集群模式,实现了 Redis 的分布式存储。Redis Cluster集群通过Gossip协议进行通信,常用的Gossip消息分为4种,分别是:ping、pong、meet、fail。
- meet消息:通知新节点加入。
- ping消息:集群内交换最频繁的消息,集群内每个节点每秒向多个其他节点发送ping消息,用于检测节点是否在线和交换彼此状态信息。
- pong消息:当接收到ping、meet消息时,作为响应消息回复给发送方确认消息正常通信。pong消息内部封装了自身状态数据。节点也可以向集群内广播自身的pong消息来通知整个集群对自身状态进行更新。
- fail消息:当节点判定集群内另一个节点下线时,会向集群内广播一个fail消息,其他节点接收到fail消息之后把对应节点更新为下线状态。
每一个节点都有两个属性,一个是插槽(取值范围为0-16383),用于唯一标识节点;另一个是所属集群。当要存取某一个key时,Redis 会根据 crc16的算法得出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,通过这个值,去找到对应的插槽所对应的节点,然后在该节点上进行存取。为了保证高可用,redis-cluster集群引入了主从模式,一个主节点对应一个或者多个从节点,当主节点宕机的时候,就会启用从节点,如果主从节点都宕机了,那么该集群就无法再提供服务了。
参考:
https://blog.csdn.net/weixin_43564627/article/details/121329499
https://blog.csdn.net/itcats_cn/article/details/82428716
https://blog.csdn.net/weixin_45827693/article/details/120550267