第六届字节跳动青训营缓存集群学习 | 青训营

93 阅读4分钟

主从复制

如果用单点redis,那么redis挂了之后全部请求都打在db,给数据库带来很大压力。

主从复制就是建立一个redis主节点master,可以有多个从节点来同步主节点的数据,从而实现主节点写,从节点读;当主节点宕机了,可以从从节点中选择一个作为主节点来实现故障转移。保证redis的高可用性。

主从复制下,从节点数据过期怎么处理?

从节点数据过期的话,会删除过期数据,并返回空值;

主从过期时间不一致问题?

由于主从同步时,网络传输原因,可能造成过期时间不一致,因为如果采用EXPIRE设置过期时间,是按照命令执行时间开始计时过期时间的;因此可以采用设置UNIX时间戳的过期时间设置方式,但要注意主从节点的时区设置一致。

如何实现主从同步?

  1. 首次主从连接的时候,采用全量同步,用主节点的RDB文件来给从节点进行同步;
  2. 后续操作,采用增量同步,根据主节点的AOF文件,主节点根据从节点的offset偏移量,将偏移量后的数据同步到从节点

主从复制的缺陷

如果主节点宕机,需要人工选取一个从节点来作为新的主节点,进行配置,不能够自动完成。这时就需要哨兵机制了。

Sentinal

Sentinal(哨兵)模式是一种redis的运行方式,在主从复制的基础上,多了哨兵角色,来监控redis节点运行状态,自动完成故障转移。

想要保证高可用性,sentinal数量应大于等于3且为单数。防止sentinal误判。

  1. sentinal会检测集群中所有节点的运行状态
  2. 当主节点故障,且判断出主节点故障的哨兵数量大于预设阈值,则判定主节点下线;
  3. 判定主节点下线后,采取故障转移,把一个从节点升级为主节点,并完成相应主从关系的配置。

每隔sentinal每隔一段时间会向集群中所有节点发送ping命令,如果收到回复超时,则单个sentinal会判断某个redis节点的主观下线;当判断某个节点的sentinal数量大于预设阈值时,则判断该节点客观下线

sentinal如何选举新的master

  1. 首先看从节点的优先级replica-priority,挑优先级最高的从节点选做master;(最高优先级是1,最低是100;0表示永不被升级)
  2. 优先级相同,则看哪个节点的数据偏移量,偏移量越大说明同步到的原主节点数据越多,则优先被选为master;
  3. 最后看runid;每个redis启动时都会生成一个40位的随机数作为runid,选取runid最小的升级。

Cluster集群

为什么需要Cluster集群

传统的主从复制和哨兵集群只有一个master,每个节点都保存全部数据,通过故障转移策略,来保证高可用性,和吞吐量;但是无法解决数据总量过大带来的缓存压力和压力。

因此有了Cluster集群,能够配置多个master节点,每个master节点可以有一个或多个从节点;

存储数据根据key值进行负载均衡,分别存储在各个主从节点;Cluster集群是去(无)中心化的,每个主节点都可以作为集群入口,根据查找的key值不同,根据路由原则,讲请求分发到对应的master。

通过横向扩展可以根据需求方便的进行集群动态扩容和缩容;

一个最基本的cluster集群

为了保证高可用性,最基本的cluster集群要3个master,每个master配有一个slave,当一个master挂掉,由它的从节点代替成为master。

哈希槽slots

一个cluster集群有16384 = 2^14 = 16K个哈希槽,根据key值,对数据进行哈希,分配到每个哈希槽,每个主节点及其从节点负责一定数量的哈希槽的数据存储与访问;

重定向

如果当前访问的key对应的哈希槽与redis节点不对应,则请求会被重定向到相应节点。