老司机带你玩转面试(3):Redis 高可用之主从模式

前文回顾

建议前面文章没看过的同窗先看下前面的文章:html

「老司机带你玩转面试(1):缓存中间件 Redis 基础知识以及数据持久化」面试

「老司机带你玩转面试(2):Redis 过时策略以及缓存雪崩、击穿、穿透」redis

Redis 主从模式

在生产环境使用 Redis ,彻底禁止使用单机模式,单机模式风险过高,一台机器出于某些缘由挂掉,就会致使整个缓存服务死掉,因此,咱们须要使用多台机器来保证 Redis 的高可用,同时也顺便提高了并发性。缓存

对于 Redis 缓存而言,更常见的应用场景是支持读高并发,而写高并发的场景相对比较少(不能说没有,只能说相对读高并发比较少)。服务器

所以,使用主从模式,一主多从,主负责写,而且将数据复制到其它的 slave 节点,从节点负责读。全部的读请求所有走从节点。这样也能够很轻松实现水平扩容,支撑读高并发。架构

经典的主从模式架构图以下:并发

主从同步策略:

master 和 slave 刚刚链接的时候,进行全量同步。全量同步结束后,进行增量同步。less

固然,若是有须要,slave 在任什么时候候均可以发起全量同步。redis 策略是,不管如何,首先会尝试进行增量同步,如不成功,要求从机进行全量同步。异步

全量同步:

master 执行 BGSAVE 命令,生成一个 RDB 文件, 发送给 slave , slave 加载 RDB 文件达到与 master 维持一致。高并发

  1. slave 链接 master 后,发送 SYNC 命令。
  2. master 接收到 SYNC 命名后,开始执行 BGSAVE 生成 RDB 文件,并使用缓冲区记录此后执行的全部写命令。
  3. master BGSAVE 执行完后,向全部 slave 发送快照文件,并在发送期间继续记录被执行的写命令。
  4. slave 收到快照文件后丢弃全部旧数据,载入收到的快照。
  5. master 快照发送完毕后开始向 slave 发送缓冲区中的写命令。
  6. salve 完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲区的写命令。
  7. 第一次全量同步完成。

增量同步

Redis 增量复制是指 slave 初始化后开始正常工做时 master 发生的写操做同步到 slave 的过程。

增量复制的过程主要是 master 每执行一个写命令就会向 slave 发送相同的写命令,从服务器接收并执行收到的写命令。

心跳信息

主从节点互相都会发送心跳信息。

master 默认每隔 10 秒发送一次心跳信息,slave 每隔 1 秒发送一个心跳信息。

注意点:

  • Redis 使用异步的方式将数据从 master 节点复制到 slave 节点,slave 会周期性地确认本身每次复制的数据量。
  • slave 作复制的时候,不会 block master 正常工做。
  • slave 作复制的时候,也不会 block 本身当前的查询工做,只是查询的时候依然会使用旧数据,等到复制完成后,须要删除老数据加载新数据的时候才会 block 当前的查询工做。
  • slave 主要用来作横向扩容,提高读的吞吐量,必定程度上作到了读的高可用。
  • slave 不必定要链接到 master ,也能够 slave 链接到 slave 。
  • slave 不会处理过时 key ,只会等待 master 过时 key。若是 master 过时了一个 key,或者经过 LRU 淘汰了一个 key,那么会模拟一条 del 命令发送给 slave。

无磁盘化主从复制

master 节点能够在内存中直接建立 RDB 文件,而后将 RDB 文件直接发送给 salve 节点,不在本身本地落地到磁盘,这个操做只须要在配置文件中开启 repl-diskless-sync yes

可是这样作的风险会比较高,所以,强烈建议在 master 上开启持久化服务。

若是必定要在 master 节点上设置不开启持久化,请在确保 Redis 实例不会自动重启。

为啥要确保实例不会自动重启?

下面给你们分享一个案例,这是生产环境真实发生过的事情,都是血的教训。

一个主从结构的 Redis 集群,当 master 没有配置开启数据持久化,某个时间,忽然 master 节点宕机,而后自动重启,当 master 节点自动重启后,因为没有开启数据持久化,这时的 master 节点中是无数据的,当 salve 节点进行数据同步的时候,会把 salve 节点的数据也作清空操做。这时,整个主从结构的 Redis 集群全都没有数据,大量的请求过来发现 Redis 没有数据,致使请求落到了 DB 上,结果是毁灭性的。

主从模式存在的问题是,它仅仅只作到了读高可用,若是一旦 master 节点挂掉了,就没办法写数据了,只剩下 slave 节点还能读数据,可是数据同步也没有了,只能靠人工干预进行恢复,这并非咱们想要的高可用。

咱们还须要写高可用,这就引出了 Redis 的高可用架构:哨兵模式。

简单来说,哨兵模式就是在 master 节点不可用后,能够自发的进行主备切换,或者叫作故障转移。

master 节点在发生故障后,整个集群能够自动检测,将某个 salve 自动切换成 master 节点,这种模式才算是实现了 Redis 真正意义上的高可用。

参考

www.cnblogs.com/daofaziran/…

您的扫码关注,是对小编坚持原创的最大鼓励:)
相关文章
相关标签/搜索