Redis 高可用原理及部署方法

在这里插入图片描述
一、Redis 的高可用原理
其实 Memcached 在性能上要稍微比 Redis 好,但在易用性和可用性上,Redis 要大大超过Memcached 。
先说易用性。Redis 有五种数据类型:list 、set 、string 、hash 、zset。这表示在使用 Redis 存储数据的时候将会更灵活,能节省很多开发成本。而 Memcached 支持的数据类型比较简单,只有 string,无法满足复杂业务场景的需求。

另外,Redis 还支持原子操作和事务,可以确保操作数据时的准确性,使用非常简单。比如在秒杀中扣减和归还库存,就可以用 Redis 的原子操作和事务来保障库存数据的准确性。

在可用性方面呢,Redis 支持 Master-Slave 模式的数据备份,而 Memcached 不支持; 在故障转移方面,Redis 的可用性也比 Memcached 高。

还有,Memcached 是纯内存的,崩溃后里面存储的信息就丢失了,而 Redis 则可以通过命令将内存中的数据保存到磁盘上,让数据持久化。

换句话说,即使 Redis 节点因为宕机导致内存中的数据丢失,它也可以从磁盘恢复数据到内存,这就大大降低了因宕机导致缓存穿透的风险。应用到秒杀系统里就是,假如秒杀活动进行中,缓存活动信息的 Redis 挂了,由于数据做了持久化,就避免了大量请求直接到 DB。

那 Redis 是如何做到高可用的呢?

它主要通过支持主从模式、哨兵模式、集群模式这三种模式,来满足不同业务特点和可用等级的需求。 其中,主从模式部署最简单,用得也最多,集群模式比较复杂,但可用性最高。具体怎么部署呢?

一、Redis 的部署方法

1、主从模式

主从模式比较简单,可部署多个节点,其中一个作为 Master 节点,剩下的作为 Slave 节点。它的示意图如下:

Drawing 1.png

在主从模式里,客户端同时连接 Master 节点和 Slave 节点,写操作通过 Master 节点执行,并将结果同步给 Slave 节点,读操作通过 Slave 节点执行。假如 Master 节点挂了,不影响读操作,我们可以通过手动修改配置将某个 Slave 节点提升为 Master 节点,重新提供写能力。

主从模式最大的优点是部署简单,最少两个节点便可以构成主从模式,并且可以通过读写分离避免读和写同时不可用。不过,一旦 Master 节点出现故障,主从节点就无法自动切换,直接导致 SLA 下降。所以,主从模式一般适合业务发展初期,并发量低,运维成本低的情况。

后来,为了避免主从无法自动切换的问题,又出现了一种新模式——哨兵模式,它是主从模式的升级。

2、哨兵模式

哨兵模式是如何部署的呢?请看下图:

在这里插入图片描述

相比主从模式,哨兵模式新增了独立部署的节点——哨兵节点(Sentinel)。这些节点虽然不参与数据处理,但它们会像哨兵一样负责监控 Master 和 Slave 的状态及拓扑关系,并把主从关系信息提供给客户端。客户端在连接 Redis 的时候,会先连接哨兵节点,获取 Master 和 Slave 信息,然后再连接 Master 和 Slave。

在三种模式当中,哨兵模式是 Redis 官方推荐的高可用模式,那它是如何做到高可用的呢?

首先,哨兵集群会通过 Ping 和 Info 请求监控所有 Redis 节点的状态,并且哨兵集群内会选举出 Leader 节点。当 Master 节点挂了后,哨兵集群内部会进行投票,如果超过半数节点确认 Master 节点挂了,则会由哨兵集群的 Leader 节点选择一个 Slave 节点进行主从切换。最后,哨兵集群会将新的主从信息通知给客户端,让客户端连接到新的 Master 和 Slave 节点上。

哨兵模式适合读请求远多于写请求的业务场景,比如在秒杀系统中用来缓存活动信息。 如果写请求较多,当集群 Slave 节点数量多了后,Master 节点同步数据的压力会非常大。怎么办呢?为了解决写请求较多的业务场景, Redis 又提供了集群模式。

3、集群模式

集群模式具体是怎么部署的呢?请看下图:

在这里插入图片描述

为了避免单一节点负载过高导致不稳定,集群模式采用一致性哈希算法将 Key 分布到各个节点上。其中,每个 Master 节点后跟若干个 Slave 节点,用于出现故障时做主备切换。

在这种模式下,Master 节点可以同时处理读和写请求。具体来说,客户端可以连接任意 Master 节点,集群内部会按照不同 key 将请求转发到不同的 Master 节点。当然,为了减少 Master 内部转发请求的压力,也可以选择在客户端连接所有 Master 节点,直接在客户端将请求哈希到对应的 Master 节点。

集群模式是如何实现高可用的呢?集群内部节点之间会互相定时探测对方是否存活,如果多数节点判断某个节点挂了,则会将其踢出集群,然后从 Slave 节点中选举出一个节点替补挂掉的 Master 节点。

虽然集群模式避免了 Master 单节点的问题,但集群内同步数据时会占用一定的带宽。所以,只有在写操作比较多的情况下人们才使用集群模式,其他大多数情况,使用哨兵模式都能满足需求。

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值