21. Redis集群有哪些方案,知道吗?
Redis 常见集群方案有三种:主从复制、哨兵模式和 Redis Cluster。
主从复制是一个 master 搭配多个 slave。master 主要负责写,也可以读;slave 会同步 master 的数据,通常承担读请求。它主要解决读扩展和数据备份问题,但 master 宕机后不能自动故障转移。
哨兵模式是在主从复制的基础上增加 Sentinel 监控。Sentinel 会监控 master 和 slave 的状态,如果 master 宕机,会自动从 slave 中选举新的 master,并通知客户端更新连接,所以它主要解决 Redis 的高可用问题。
Redis Cluster 是分片集群。它通过 hash slot 把数据分散到多个 master 节点上,每个 master 负责一部分槽位和数据,每个 master 也可以配置 slave 用于故障转移。它既能扩展 Redis 的内存容量和整体吞吐量,也能提高可用性。
22. 那你来介绍一下主从同步。
Redis 主从同步一般用于读写分离和数据备份,通常是一主多从,master 主要负责写,slave 同步 master 的数据并承担读请求。
主从同步分为全量同步和增量同步。第一次建立主从关系,或者 slave 落后 master 太多时,会触发全量同步。master 会生成 RDB 快照发送给 slave,slave 清空本地数据后加载 RDB,同时 master 会把生成和发送RDB 期间产生的新写命令缓存起来,等 slave 加载完成后再发送过去。
全量同步完成后,master 后续收到的写命令会持续同步给 slave,保持数据同步。如果 slave 短暂断开后重连,会尝试增量同步,会带上自己的复制偏移量 offset,master 根据 replication id 和 offset 判断能不能从 repl_backlog 复制积压缓冲区中补发缺失命令。如果可以,就增量同步;如果不可以,就重新全量同步。
23. 怎么保证Redis的高并发高可用?
Redis 的高并发和高可用要分开说。
高并发方面,Redis 本身是基于内存的,读写性能很高;同时可以通过主从复制做读写分离,让 slave 分担读请求。如果数据量或者写压力更大,可以使用 Redis Cluster,通过 hash slot 将数据分散到多个 master 节点上,提升整体吞吐量和容量。
高可用方面,可以使用主从复制加哨兵模式。Sentinel 会监控 master 和 slave,如果 master 宕机,会自动从 slave 中选举新的 master,并通知客户端连接新的 master。旧 master 恢复后会作为 slave 挂到新的 master 下。
所以主从复制主要提升读并发和数据备份,哨兵主要解决自动故障转移,Redis Cluster 既可以做分片扩容,也可以配合 slave 实现高可用。
24. 你们使用Redis是单点还是集群,哪种集群?
我们项目中使用的是 Redis 主从加哨兵模式,是一主一从。master 主要负责写,slave 同步数据并承担读请求,Sentinel 负责监控节点状态和故障转移。
当时没有使用 Redis Cluster,主要是因为数据量和写入压力还没有达到必须分片的程度。主从加哨兵已经可以满足读扩展、数据备份和高可用,维护成本也更低。
如果单实例内存压力变大,我们会优先按业务拆分 Redis 实例,比如不同服务使用独立的 Redis 主从节点,避免单个 Redis 实例过大,影响 RDB、主从同步和故障恢复。