1. Redis集群意义
-
读写分离:写在主节点,读在从节点,从而提高服务器性能,降低Master压力
-
负载均衡:可以多个节点分担读取的负载
-
容灾:Master挂掉,从节点可以顶上,保证系统高可用
Redis有三种集群方案,主从复制、哨兵、cluster集群
2. Redis主从复制
2.1 主从复制概念
主从复制是指将一台Redis服务器(Master)的数据复制到其他Redis服务器(Slave)中,数据由主—>从。一个主节点可以有多个从节点,一个从节点只能有一个主节点。
2.2同步流程
2.2.1 同步流程
从节点在Slave初始化时会全量同步主节点的数据,步骤如下
-
Slave连接Master,发送SYNC命令
-
Master收到SYNC后执行BGSAVE生成RDB,并且将新增命令保存在缓冲区
-
BGSAVE执行完成后,Master将RDB快照发送给Slave,并继续记录被执行的写命令
-
Slave收到快照文件后丢弃所有旧数据,载入收到的快照
-
Master发送完快照后就开始发送缓冲区的写入命令
-
Slave完成快照的读取后就开始接收并执行Master缓冲区的写入命令
2.2.2 增量同步
Master执行一个写命令就向Slave发送相同的写命令,Slave执行写命令
2.3 主从复制的缺点
-
不具备自动容错和恢复功能:需要手动修改IP才能恢复
-
主机宕机数据丢失:主从复制有时间间隔,可能导致数据不一致
-
数据量过大:数据量过大一个主节点存储不了
3. Redis哨兵模式
3.1 什么是哨兵模式
Redis自动化检测主节点是否在工作,当主节点宕机后集群自动能够替换上去
3.1.1Redis-sentinal(哨兵):
-
监控:与主从服务器进行心跳检测,监视主从活动状态
-
提醒:当某个Redis出现问题时,Sentianl可以发出通知
-
自动故障迁移:Master不可用时,Sentianl可以自动选举一个Slave担任新的Master
3.1.2 监控能力
-
主观下线:Sentianl以1/s的频率向所有的进程(Master、Slave、Sentianl)发送ping命令,如果某个实例超过设定时间没有回复那么该Sentianl就认为该实例主观下线
-
客观下线:半数以上的Sentianl认为某个实例主观下线就可以认为该实例客观下线
-
故障转移:通过优先级配置和保存的数据量来判断新Master,然后向整个集群通知新Master。以上能力全部由一个领头Sentianl实现
3.1.3 优缺点
优点:可以自动切换,系统更健壮,可用性更高。
缺点:主从切换期间服务器不可用,且Redis很难支持在线扩容
4. Cluster集群
(图片来源Redis Cluster 集群详解-CSDN博客)
4.1 什么是Cluster集群
Cluster由多个主从节点组组成,每个主从节点组上的数据没有交集
一个Redis组有多个Slot槽位,整个Cluster由2^14个槽位,经过路由确定在某个实例上
每个Master至少有一个Slave
4.2 Cluster集群添加节点
4.2.1 gossip协议
Gossip协议是一种分布式通信协议,用于传播消息,保证网络节点的数据一致性。
gossip 协议包含多种消息,包括 ping,pong,meet,fail 等等。
ping:每个节点都会频繁给其他节点发送 ping,其中包含自己的状态还有自己维护的集群元数据,互相通过 ping 交换元数据;
pong: 返回 ping 和 meet,包含自己的状态和其他信息,也可以用于信息广播和更新;
fail: 某个节点判断另一个节点 fail 之后,就发送 fail 给其他节点,通知其他节点,指定的节点宕机了。
meet:某个节点发送 meet 给新加入的节点,让新节点加入集群中,然后新节点就会开始与其他节点进行通信,不需要发送形成网络的所需的所有 CLUSTER MEET 命令。发送 CLUSTER MEET 消息以便每个节点能够达到其他每个节点只需通过一条已知的节点链就够了。由于在心跳包中会交换 gossip 信息,将会创建节点间缺失的链接。
优点: gossip 协议的优点在于元数据的更新比较分散,不是集中在一个地方,更新请求会陆陆续续,打到所有节点上去更新有一定的延时,降低了压力; 去中心化、可扩展、容错、一致性收敛、简单。 由于不能保证某个时刻所有节点都收到消息,但是理论上最终所有节点都会收到消息,因此它是一个最终一致性协议。
缺点: 元数据更新有延时可能导致集群的一些操作会有一些滞后。 消息的延迟 , 消息冗余 。
4.2.2 Redis添加节点
-
如果请求的Key对应的哈希槽还在当前节点的花,就直接相应
-
如果哈希槽在迁移过程中,但是Key还未迁移走的画,还是可以处理请求
-
如果正在迁移或者已经迁移走的话就会返回重定向错误,里面包括新节点的信息