Redis 部署架构主要有单机模式、主从模式、哨兵模式和集群模式。
单机部署,读写都在一台机器,有性能瓶颈,如果宕机了就会导致缓存不可用。
由于单机模式在⾼并发下会出现性能瓶颈,升级到⼀主多从的⽅式,master节点处理写操作,slave节点处理从操作,slave从master同步数据。
主从同步在salve和master刚连接的时候进⾏全量同步,全量同步结束后开始增量同步。如果有需要,slave在任何时候都可以发起全量同步,其主要策略就是⽆论如何⾸先会尝试进⾏增量同步,如果不成功,则会要求slave进⾏全量同步,之后再进⾏增量同步。
在master和slave节点建⽴连接之后,slave会向master发送增量同步(slave会携带⾃⼰的repid和offset),master接收了slave的增量同步请求之后,就会拿⾃身的replId和slave的replId进⾏判断,如果相同则进⾏增量同步,不相同则进⾏全量同步。之后master会将⾃⼰的replId和offset发送给slave。全量同步,master会执⾏bgsave⽣成⾃⼰的RDB⽂件,将⾃⼰的RDB⽂件发送给slave,slave清除原来已经有的RDB,将新的RDB加载到内存之中。
增量同步是指在全量同步之后,从节点与主节点之间仅传输增量数据的同步⽅式。通过增量同步,从节点可以实时地获取主节点的写命令并应⽤到⾃⼰的数据集中,保持与主节点的数据⼀致性。 增量同步的具体步骤为:
哨兵模式(Sentinel)是主从复制模式的⼀种进阶形式,继承了主从复制的所有优势,如数据⼀致性和读写分离。它的核⼼优点在于能够⾃动实现主从切换和故障转移,从⽽提升了系统的可⽤性和鲁棒性。在哨兵模式下,系统能够从⼿动切换转变为⾃动切换,极⼤地增强了系统的⾃动化程度和稳定性。然⽽,哨兵模式也存在⼀定的局限性,特别是在在线扩容⽅⾯。当集群容量接近或达到上限时,进⾏扩容操作相对较为复杂和困难。
通过引⼊哨兵进程,周期性地向Redis节点发送命令,并等待节点的响应,来判断被监控的Redis实例是否正常运⾏。若发现主节点出现故障,哨兵将基于预设的投票机制,⾃动将某个从节点晋升为新的主节点,保持服务的连续性和数据的可⽤性。
由于哨兵本身也是个独⽴的进⾏,因此也存在稳定性问题。哨兵⾄少需要 3 个实例才能保证⾃⼰的健壮性。
主观下线判定方法:
哨兵进程会使⽤ PING 命令检测它⾃⼰和主、从库的⽹络连接情况,⽤来判断实例的状态。
如果Sentinel发现主库或从库对 PING 命令的响应超时了,那么,Sentinel就会先把它标记为主观下线。
客观下线判定方法:
当⼀个哨兵节点发现主节点处于主观下线状态时,会向其他的哨兵节点发出询问,该节点是不是已经主观下线了。
如果超过配置参数quorum个节点认为是主观下线时,该哨兵节点就会将⾃⼰维护的结构体中将该主节点标记为SRIO DOWN(客观下线)。
客观下线询问命令是:SENTINEL is-master-down-by-addr <master ip> <master 端⼝号> <⽤于选举哨兵leader的配置> <*>。
在哨兵集群主节点客观下线的情况下,哨兵节点节点间会发起⼀次选举,命令为:SENTINEL is-master-down-by-addr <master ip> <master 端⼝号> <⽤于选举哨兵leader的配置> <该哨兵节点id>,只是runid这次会将哨兵⾃⼰的runid带 进去, 希望其他哨兵将⾃⼰设置为主节点。如果超过半数以上的哨兵节点返回将该节点标记为leader的情况下,会由该leader对故障进⾏迁移。leader选举一般采用Raft选举算法。
Raft算法是⼀种基于领导者的⼀致性算法,它要求集群中的每个节点都有三种⻆⾊:领导者(leader)、候选者(candidate)和跟随者(follower)。 领导者负责发起选举请求,候选者负责投票,跟随者负责响应领导者的指 令。Raft算法的核⼼是选举过程,分为以下⼏个步骤:
最终,只有⼀个候选者能够获得多数的票数,成为领导者,结束选举。
哨兵在选择新主库时,先按照⼀定的筛选条件,把不符合条件的从库去掉,再按照⼀定的规则,给剩下的从库逐个打分,将得分最⾼的从库选为新主库。选举过程如下:
⾄此故障迁移完成。
Redis cluster是 Redis 3.0开始引⼊的分布式存储⽅案。集群由多个节点(Node)组成,Redis 的数据分布在这些节点中。集群中的节点分为主节点和从节点,只有主节点负责读写请求和集群信息的维护,从节点只进⾏主节点数据和状态信息的复制。
数据分区(或称数据分⽚)是集群最核⼼的功能,集群将数据经过CRC16哈希到指定的节点上,⼀⽅⾯突破了Redis单机内存⼤⼩的限制,存储容量⼤⼤增加,另 ⼀⽅⾯每个主节点都可以对外提供读服务和写服务,⼤⼤提⾼了集群的响应能⼒,Redis单机内存⼤⼩受限问题。
客户端连接集群中任⼀实例即可发送命令,当 Redis Instance 收到⾃⼰不负责的 slot 的请求时,会将负责请求 Key 所在 slot 的 Redis Instance 地址返回给客户端,客户端收到后⾃动将原请求重新发往这个地址。⼀个Key 到底属于哪个 Slot 由(HASH SLOT =CRC16(key)mod 16384)决定。只有master 节点会被分配槽位,slave 节点不会分配槽位。
在Redis Cluster中,主节点之间会进⾏定期的健康检查和状态同步,确保数据的⼀致性。当其它主节点 ping ⼀个主节点 A 时,如果半数以上的主节点与 A 通信超时,那么认为主节点 A 宕机了,这时候主节点 A 的从节点可以通过选举机制快速选出新的主节点,实现故障的⾃动转移,从⽽确保服务的连续性。选举过程如下:
期间,所有⼦节点发送请求的时机有所有不同,所以基本都有先后顺序,很少会出现票数相同情况,如果相同,则重新选举,直到选出 master 为⽌。所以⾄少需要3主3从个节点,否则当节点出现问题,就会出现选举失败。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。