Redis常见架构及其原理

主从架构

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

Redis主从数据如何同步?

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

全量同步数据

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

部分数据同步

主节点和从节点都会维护一个复制偏移量——offset,如果从节点完整复制了主节点的数据,那么主从节点的复制偏移量就是相同的。

  • master会缓存近期的一些写操作命令,缓存在repl buffer中,默认大小是1mb。
  • slave节点断开重连后建立socket长链接
  • slave发送psync(offset)命令要求同步数据
  • master的buffer中如果有offset,那么将会把offset之后的所有数据都发送给slave,否则将全量同步数据
  • master通过socket长链接发送数据,实现主从数据一致性

主从复制风暴

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

哨兵架构

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

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

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

sentinel感知主节点下线

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

sentinel选举流程

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

集群架构

集群的数据存储

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

计算key落入哪个槽位

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

跳转重定位

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

集群的选举原理

当某个slave发现它的master下线后,会对外广播failover信息,然后开始竞选master,当某个slave节点拥有半数以上的投票结果时,这个slave节点就会成为新的master。

选举流程:

  • slave发现master的状态变成fail
  • slave会对外广播failover信息,然后集群的选举周期+1
  • 其它节点接收到广播后,只有master才会响应,并且返回ack
  • 当该slave节点拥有半数以上的ack时,就成为新的master

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

集群脑裂问题

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

总结

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值