当前位置: 首页 > 科技观察

本文带你领略精髓—Redis的三种集群方式+穿透和雪崩的预防与解决

时间:2023-03-17 10:56:05 科技观察

Redis三种集群方式概述一、主从复制原理从服务器连接到主服务器,发送SYNC(同步)命令;masterserver收到SYNC名称后,开始执行BGSAVE命令生成RDB文件,并使用buffer记录此后执行的所有写命令;主服务器BGSAVE执行后,向所有从服务器发送快照文件,并在发送写命令的过程中继续记录执行情况;从服务器接收到快照文件后丢弃所有旧数据,并加载接收到的快照;主服务器在发送快照文件后开始向从服务器发送缓冲区中的写命令;从服务器完成快照的加载,开始接收命令请求并从主服务器缓冲区执行写入命令;(从服务器初始化完成)主服务器每执行一次写命令都会向从服务器发送相同的写命令,从服务器接收并执行接收到的写命令(从服务器初始化完成后的操作)优点支持主从复制,master会自动同步数据给slave,可以进行读写分离为了卸载Master的读操作压力,Slave服务器可以为client提供只读操作的服务而写入服务仍须由Master完成。Slave也可以接受来自其他Slave的连接和同步请求,可以有效分担Master的同步压力。MasterServer以非阻塞的方式为Slaves提供服务。所以在Master-Slave同步过程中,客户端仍然可以提交查询或者修改请求。SlaveServer也以非阻塞的方式完成数据同步。在同步过程中,如果客户端提交查询请求,Redis会返回同步前的数据。缺点:Redis没有自动容错和恢复功能。主从机宕机会导致前端部分读写请求失败,需要等待机器重启或者手动切换前端IP才能恢复。宿主机宕机,宕机前部分数据无法及时同步到从机,切换IP后会引入数据不一致,降低系统的可用性。Redis很难支持在线扩容,当集群容量达到上限时,在线扩容会变得非常复杂。2.哨兵模式原理当主服务器中断时,可以升级一个从服务器为主服务器继续提供服务,但这个过程需要人工操作。为此,Redis2.8提供了哨兵工具来实现自动化的系统监控和故障恢复功能。哨兵的作用是监控Redis系统的运行状态。它的功能包括以下两个。(1)监控主从服务器是否正常运行。(2)当主服务器出现故障时,从服务器自动转换为主服务器。工作方式每个哨兵(sentinel)进程每秒向Master主服务器、Slave服务器和整个集群中的其他哨兵(sentinel)进程发送一次PING命令。如果一个实例(instance)距离最后一次对PING命令的有效回复的时间超过down-after-milliseconds选项指定的值,则该实例将被Sentinel进程标记为主观下线(SDOWN)。如果一个Master服务器被标记为主观下线(SDOWN),所有正在监视Master主服务器的哨兵(sentinel)进程必须每秒确认一次Master主服务器确实进入了主观下线状态。当有足够的哨兵(sentinel)进程(大于等于配置文件中指定的值)确认Master主服务器在指定时间范围内进入主观下线状态(SDOWN),则Master主服务器会被标记为目标下线(ODOWN)一般情况下,每个哨兵(sentinel)进程都会每隔10秒向集群中的所有Master主服务器和Slave从服务器发送INFO命令。当Master主服务器被哨兵(sentinel)进程标记为客观下线(ODOWN)时,Sentinel(哨兵)进程向下线Master主服务器的所有Slave从服务器发送INFO命令的频率将从一次变为每10秒到每秒一次。如果没有足够多的哨兵(sentinel)进程同意Master主服务器下线,那么Master主服务器的客观下线状态就会被移除。如果Master主服务器再次向Sentinel(哨兵)进程发送PING命令并返回有效回复,Master主服务器主观下线状态将被解除。优点哨兵模式建立在主从模式的基础上,主从模式的所有优点在哨兵模式中都有。主从可自动切换,系统更健壮,可用性更高。缺点Redis难以支持在线扩展,当集群容量达到上限时,在线扩展会变得非常复杂。三、Redis-Cluster集群原理Redissentinel模式基本可以实现高可用和读写分离,但是这种模式下,每个redis服务器存储相同的数据,很浪费内存,所以在redis3.0中加入集群模式实现了redis的分布式存储,也就是说在每个redis节点上存储不同的内容。Redis-Cluster采用无中心结构,其特点如下:所有redis节点相互连接(PING-PONG机制),内部采用二进制协议优化传输速度和带宽。一个节点的故障只有在集群中超过一半的节点检测到故障时才会生效。客户端直接连接redis节点,没有中间代理层。客户端不需要连接到集群中的所有节点,而只需连接到集群中任何一个可用的节点。工作方式在redis的每个节点上,有两个东西,一个是槽(slot),它的取值范围是:0-16383。还有一个是cluster,可以理解为集群管理插件。当我们的accesskey到达后,redis会根据crc16算法得到一个结果,然后将结果取余16384,这样每个key都会对应一个编号在0-16383之间的hash槽,通过这个值,找到相应槽对应的节点,然后直接自动跳转到相应节点进行访问操作。redis-cluster集群为了保证高可用,引入了master-slave模式。一个主节点对应一个或多个从节点。当主节点宕机时,从节点将被启用。当其他主节点ping一个主节点A时,如果超过半数的主节点与A通信超时,则认为主节点A宕机。如果主节点A和它的从节点A1都宕机了,集群就不能再提供服务了。redis中穿透和雪崩的预防和解决理解缓存穿透缓存穿透是指查询一定不存在的数据,因为缓存不命中时需要从数据库中查询缓存,如果找不到数据则不会查询写入缓存,这样会导致每次请求时都从数据库中查询不存在的数据,造成缓存穿透。解决方案将所有可能的查询参数以hash的形式存储起来,先在控制层校验,不匹配则丢弃。最常见的是使用Bloomfilter将所有可能的数据hash成一个足够大的bitmap,一个一定不存在的数据会被这个bitmap拦截,从而避免对底层存储系统的破坏。查询压力。也可以采用更简单粗暴的方法。如果查询返回的数据为空(无论数据不存在还是系统故障),我们仍然缓存空结果,但它的过期时间会很短。长度不超过五分钟。识别缓存雪崩如果缓存在一段时间内失效,就会出现大量的缓存穿透,所有的查询都会落到数据库上,造成缓存雪崩。对此没有完美的解决方案,但可以分析用户行为,尽量将故障时间点分布均匀。大多数系统设计者考虑使用锁或队列来保证缓存的单线程(进程)写入,以避免底层存储系统出现故障时大量并发请求落在底层存储系统上。解决方案缓存过期后,通过加锁或队列控制读数据库和写缓存的线程数。例如,只允许一个线程查询某个key的数据和写cache,其他线程等待。可以使用缓存重载机制提前更新缓存,然后在大并发访问发生前手动触发加载缓存中不同的key,并设置不同的过期时间,让缓存失效的时间尽可能统一。做一个二级缓存,或者双缓存策略。A1是原始缓存,A2是副本缓存。当A1失效时,A2可以访问。A1的缓存过期时间设置为short-term,A2设置为long-term。以上就是我整理的Redis的集群方式和缓存。欢迎评论和更正。程序员应该尽量提前规划和准备自己的职业生涯,寻找出路。不要说“走一步,算一步”之类的话。在这个睁眼就竞争的时代,你可以放松休息,但别人会继续前行,不会等你。古语有云:“对手在学习,敌人在磨刀,闺蜜在减肥,邻家老人在练腰。我们要不断学习,否则就会被学习者超越。”