Redis三种架构及其原理

一、主从架构

主从架构就是一个master节点,两个slave节点。
主从架构

1.1 Redis主从数据如何同步?

Redis主从架构同步数据分为两种情况:1、全量同步数据 2、部分数据同步。

1.2 全量同步数据

1.当slave和master建立长链接后,slave就会发送psync命令要求同步数据
2.master接收到psync命令后,就会先执行bgsave,将内存的数据生成rdb快照
3.在master生成rdb快照期间,如果还有命令要执行,会缓存到repl buffer当中
4.master将生成的rdb数据发送给slave
5.slave接收到rdb快照后,会清除本地的旧数据,然后再将rdb加载到内存中
6.master将缓存的buffer数据发送给slave
7.slave接收到缓存的buffer数据,会重做本地数据
8.master通过长链接发送命令,实现主从数据一致性


全量同步流程

1.3 部分数据同步

主节点和从节点都会维护一个复制偏移量——offset,如果从节点完整复制了主节点的数据,那么主从节点的复制偏移量就是相同的。
1.master会缓存近期的一些写操作命令,缓存在repl buffer中,默认大小是1mb。
2.slave节点断开重连后建立socket长链接
3.slave发送psync(offset)命令要求同步数据
4.master的buffer中如果有offset,那么将会把offset之后的所有数据都发送给slave,否则将全量同步数据
5.master通过socket长链接发送数据,实现主从数据一致性


部分同步流程

主从复制风暴
当一个主节点有多个从节点时,在同一时刻多个从节点都要同步数据,那么主节点在这一刻的压力会非常大,可能导致主节点出现问题——这个就是主从复制风暴。
为了解决这个问题,可以将主从的架构设置成梯形的,也就是从节点也可以是主节点。

层级复制

二、哨兵架构

在主从架构中,虽然能解决一定的并发和读写分离,但是整个主从架构不是高可用的。一旦主节点下线后,只能人为介入切换主节点,为了解决这个问题,sentinel(哨兵)架构就应运而生。
哨兵是特殊的redis服务,不提供读写服务,主要就是用来监控redis节点。

2.1 sentinel会与主从服务器建立连接

sentinel一旦和主从服务器建立连接后,就能感知到哪个节点是master。当client第一次连接时,sentinel会返回主节点的信息给client,后续client就直接和master进行通信。

2.2 sentinel感知主节点下线

sentinel会定期发送PING命令给其它节点,根据节点是否回复PONG命令来判断哪些节点已下线。一旦sentinel发现master下线,就会选举新的master,然后推送给client。

2.3 sentinel选举流程

1、当某个sentinel发现master下线后,会将自己设置成leader
2、当该sentienl得到了半数以上节点的同意,就会成为sentinel leader
3、sentinel leader开始选取一个存活的slave节点作为新的master,然后推送给client


哨兵架构

三、集群架构

3.1 集群的数据存储

redis cluster是通过逻辑槽位来划分数据,redis cluster总共将所有数据划分为16384个slot(槽位),然后每个节点负责一部分槽位的数据进行存储。

3.2 计算key落入哪个槽位

通过对key使用CRC16进行hash运算,得到一个hash值,然后再使用hash值和16384进行与运算,得到最终的槽位信息。
计算公式:Hash_slot = CRC16(key) & 16384。

3.3 跳转重定位

当服务端发生槽位信息变动时,客户端可能没有感知到最新的槽位信息,让然使用旧的槽位向服务器发送写命令。
当服务器发现该槽位不属于我这个节点管理时,会给客户端响应一个重定位的信息,并附带该槽位对应的节点信息。客户端接收到新的槽位信息后,会更新本地缓存的槽位信息,然后再次发送指令给服务器。

3.4 集群的选举原理

当某个slave发现它的master下线后,会对外广播failover信息,然后开始竞选master,当某个slave节点拥有半数以上的投票结果时,这个slave节点就会成为新的master。
选举流程:
1.slave发现master的状态变成fail
2.slave会对外广播failover信息,然后集群的选举周期+1
3.其它节点接收到广播后,只有master才会响应,并且返回ack
4.当该slave节点拥有半数以上的ack时,就成为新的master

当slave发现master下线后,不是立刻发起选举的,而是有一个delay time,这个delay time就是防止多个slave节点竞选master时票数一致,导致选举失败。

3.5 集群脑裂问题

当集群中出现网络分区问题时,有多个master对外提供服务,当网络分区恢复时,其中一个master将清空数据,变成salve。这样就会导致部分数据丢失,而redis提供了一个配置项,可以降低数据丢失的风险——min-replicas-to-write 1。


集群架构

四、总结

主从架构:能解决读写分离问题,但是只有一个主节点,抗不了很高的并发,主从切换也不支持。
哨兵架构:可以自动切换主从节点,但是仍然只有一个主节点,只解决了高可用。
集群架构:解决了高可用、高并发问题,还引入了逻辑槽位,将数据进行分片存储,降低了单个小集群的读写压力,还支持水平扩展,整体提升了redis的性能。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容