对线面试官 -Redis(六 如何保证 Redis 高并发 主从复制原理)
面试官:既然聊了这么多 Redis,还没有说到 Redis 线程模型:
派大星:因为 Redis 基于 reactor 模式开发了网络事件处理器,这个事件处理器叫做:文件事件处理器(File Event Handler
),这个文件事件处理器是单线程的,从而 Redis 才叫做单线程的模型。采用 IO 多路复用机制同时监听多个 socket,根据 socket 上的事件来选择对应的事件处理器来处理这个事件。
面试官:不错,那如何保证 Redis 高并发、高可用?Redis 的主从复制原理能介绍一下么?Redis 的哨兵原理能介绍一下么?
面试官心里剖析:其实问这个问题,主要是考考你,redis 单机能承载多高并发?如果单机扛不住如何扩容扛更多的并发?redis 会不会挂?既然 redis 会挂那怎么保证 redis 是高可用的?
派大星:如果你用 Redis 缓存技术的话,肯定要考虑如何用 Redis 来加多台机器,保证 redis 是高并发的,还有就是如何让 Redis 保证自己不是挂掉以后就直接死掉了,即 Redis 高可用。
派大星:这部分可以主要从两方面:
Redis 主从架构,
Redis 实现高并发主要依靠主从架构,一主多从,一般来说,很多项目其实已经足够了,,单住用来写入数据,单机几万 QPS,多从用来查询数据,,多个实例可以提供每秒近上万(10w)的 QPS。
当然如果想要在实现高并发的同时,容纳大量的数据,那么就需要 Redis 集群,使用 Redis 集群之后,可以提供每秒近几十万的读写并发也是可以的。
Redis 基于哨兵实现高可用。
Redis 高可用,如果是做主从架构部署,那么加上哨兵即可,就 i 可以实现,任何一个实例宕机,可以进行主备切换。或者还有 Redis 官方的 Cluster 集群模式,Redis Cluster 是一种服务器 Sharding 技术,3.0 版本开始正式提供
面试官:什么是 Redis 主从架构
主要从核心机制和工作流程两个方面来回答
派大星:Redis replication 的核心机制:
Redis 采用异步方式复制数据到 slave node 上,不过从 Redis2.8 开始,slave node 会周期性的确认自己每次复制的数据量;
一个 master node 是可以配置多个 slave node 的。
slave node 也可以连接其它的 slave node。
slave node 做复制的时候,不会 block master node 的正常工作。
slave node 做复制的时候,也不会 block 自己的查询操作,它会用旧数据来提供服务,但是复制完成的时候,需要删除旧数据集,加载新数据集,这个时候就会暂停对外服务了。
slave node 主要用来进行横向扩容,做读写分离,扩容的 slave node 也可以提高读的吞吐量。
派大星:Redis 主从复制的核心原理(面试问题最多的问题,也可理解为工作流程):
当启动一个 slave node 的时候,它会发送一个PSYNC
命令个 master node,如果这是 slave node 初次连接到 master node,那么会触发一次full resynchronization
全量复制。此时 master 会启动一个后台线程,开始生成一份RDB
快照文件,同时还会将从客户端新收到的所有写命令缓存在内存中。RDB
文件生成完毕后,,master 会将这个RDB
发送给 slave,,slave 会先写入磁盘,然后再从本地磁盘加载到内存中,接着 master 会将内存中缓存的写命令发送到 slave,slave 也会同步这些数据。slave node 如果跟 master node 有网络故障,断开了连接,会自动重连,连接之后 master node 仅会复制给 slave 部分缺少的数据。从 Redis2.8 开始,支持了主从复制的断点续传,
同时我们如果像开启无磁盘化复制:也就是 master 在内存中直接创建 RDB,然后发送给 slave,不会落盘,只需要在配置文件中repl-diskless-sync yes
即可。
另外,master 的各种备份方案,也需要做。万一本地的所有文件丢失了,从备份中挑选一份 rdb 去恢复 master,这样才能确保启动的时候,是有数据的,即使采用了后续讲解的高可用机制,slave node 可以自动接管 master node,但也可能 sentinel 还没检测到 master failure,master node 就自动重启了,还是可能导致上面所有的 slave node 数据被清空。
面试官:那主从复制的时候如何处理的过期 key 的呢?
派大星:slave 不会过期 key,只会等待 master 过期 key,如果 master 过期了一个 key,或者通过 LRU 淘汰了一个 key,那么会模拟一个 del 命令发送给 slave node
面试官:刚刚有提到断点续传,可以聊一聊主从复制断点续传的原理:
派大星:好的,首先 master node 会在内存中维护一个 back log,master 和 slave 都会保存一个 replica offset 还有一个 master run id,offset 就是保存在 backlog 中的。如果 master 和 slave 网络连接断掉了,slave 会让 master 从上次 replica offset 开始继续复制,如果没有找到对应的 offset,会执行一次resynchronization
面试官:不错,那我们继续聊一了 Redis 高可用这个问题吧。
派大星:下次吧,这次有点累啦,嘿嘿。
注意,如果采用了主从架构,那么建议必须开启 master node 的持久化,不建议用 slave node 作为 master node 的数据热备,因为那样的话,如果你关掉 master 的持久化,可能在 master 宕机重启的时候数据是空的,然后可能一经过复制, slave node 的数据也丢了。
如有问题,欢迎加微信交流:w714771310,或关注微信公众号【码上遇见你】。
版权声明: 本文为 InfoQ 作者【派大星】的原创文章。
原文链接:【http://xie.infoq.cn/article/9ef5347ec5d7e88ebdcaa20ff】。
本文遵守【CC BY-NC-ND】协议,转载请保留原文出处及本版权声明。
评论