【Redis】Redis集群相关

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: 面试官:我们来聊一下Redis集群相关的东西吧。不清楚是吧,没关系。那我们今天面试就先到这,感谢参加本次面试~


Redis相关文章


Redis主从模式

主从模式原理


顾名思义,将集群区分成一个主节点多个从节点,读写分离架构,主节点负责写入数据也可以读数据,从节点同步主节点的数据写入做备份,同时支持读操作。


从节点如何处理key的过期

  • 根本原因
  • 从节点不会让 key 过期,而是等待主节点让 key 过期。当主节点让一个key到期时,会下发del命令并传输到所有的从节点。
  • Redis的两种删除策略
  • 惰性删除:当数据过期后,并不会马上删除。而是等到有请求访问时,对数据检查,如果数据过期,则删除数据。
  • 定期删除:每隔一段时间默认100ms,Redis会随机挑选一定数量的Key,检查是否过期,并将过期的数据删除
  • 当读数据请求打到主节点访问删除数据时,主节点会触发惰性删除。但当请求达到从节点则可能读到旧数据,一般有两种原因。
  • Redis3.2之前版本,读从库并不会判断数据是否过期。
  • 解决方案:可以将版本升级到3.2版本后。
  • 跟过期时间的设置方式有关系,我们一般采用 EXPIRE key ttl命令,表示从执行命令那个时刻开始,往后延长ttl 时间。主从复制是异步行为,必然会出现延迟情况,所以ttl时间的开始时间会出现不一致情况。
  • 解决方案:采用Redis的另外两个命令,EXPIREAT key timestam 和 PEXPIREAT key timestamp避免由主从同步命令导致的开始时间延迟问题。

Redis replication

Redis复制过程

  1. 重要概念:
  1. 服务器的唯一id:每个 Redis 服务器在运行期间都有自己的run ID,run ID在服务器启动的时候自动生成。
  2. 复制偏移量 offset:主服务器和从服务器都会维护一个复制偏移量
  1. Redis从2.8以后使用PSYNC命令代替SYNC命令来执行复制时的同步操作
  2. slave刚上线的复制过程
  1. 设置主服务器的ip+端口
  2. 建立套接字链接
  3. 发送ping命令
  4. 验证身份
  5. 向主服务器发送Slave的端口
  6. 同步
  1. PSYNC命令具有完整同步增量同步
  2. 全量同步
  1. 用于初次复制或其他无法进行部分复制的情况,将主节点中的所有数据都发送给从节点
  2. SlaveMaster发送PSYNC请求
  3. 主服务器开启后台保护进程创建RDB快照并发送给从服务器,同时将产生快照阶段产生的新的操作命令存储到缓存区
  4. Master向Slave同步存储缓存区的操作命令
  1. 增量同步
  1. 用于网络中断等情况后的复制,只将中断期间主节点执行的写命令发送给从节点,与全量复制相比更加高效。需要注意的是,如果网络中断时间过长,导致主节点没有能够完整地保存中断期间执行的写命令,则无法进行部分复制,仍使用全量复制。
  2. Redis 主库接收到写操作的命令,首先会写入replication buffer(主要用于主从数据传输的数据缓冲),同时也会把这些操作命令也写入repl_backlog_buffer这个缓冲区。
  3. 如何主从断开了,当然对应的replication buffer也就没有了。这时候就依赖repl_backlog_buffer进行数据的增量同步了。repl_backlog_buffer是一个环形缓冲区,主库会记录自己写到的位置,从库则会记录自己已经读到的位置。
  4. 使用PSYNC {offset} {replication id}实现
  5. Master每执行一个写命令就会向Slave发送相同的写命令。然后Slave接收并执行

新增从库的过程


  1. 从库使用PSYNC请求同步,首次链接不会指定replcationid和offset
  2. master节点收到命令判断为全量同步后就会将自己的replcationid和offset告知slave,回复命令full resync {runId} {offset}。同时,master会执行bgsave命令来生成rdb文件,期间的所有写命令将被写入缓冲区。
  3. master bgsave执行完毕,向slave发送rdb文件。rdb文件发送完毕后,开始向slave发送缓冲区中的写命令。
  4. slave收到rdb文件,丢弃所有旧数据,开始载入rdb文件。
  5. rdb文件同步结束之后,slave执行从master缓冲区发送过来的所有写命令。
  6. 此后 master 每执行一个写命令,就向slave发送相同的写命令。


主从模式数据丢失问题

  1. 无法严格避免数据丢失问题,只能尽可能减轻
  2. redis配置文件中有两个配置
min-slaves-to-write 1min-slaves-max-lag 10
  1. 其中,min-slaves-to-write默认情况下是0,min-slaves-max-lag默认情况下是10。
  2. 上述参数表示至少有1个salve的与master的同步复制延迟不能超过10s,一旦所有的slave复制和同步的延迟达到了10s,那么此时master就不会接受任何请求,系统故障。
  3. 通过降低min-slaves-max-lag参数的值,可以避免在发生故障时大量的数据丢失,一旦发现延迟超过了该值就不会往master中写入数据发生故障。
  4. 应对方案
  1. 一定场景下用主写主读策略
  2. 保证主从网络相同机房顺畅,监控从节点如果与主节点差距过大将该剔出集群,不在接受读请求。

Redis哨兵模式

哨兵模式原理

  1. Redis 哨兵模式(Sentinel)就是一个自动地监控处理 redis 间故障节点转移工作的一个程序,准确来说,Sentinel 其实是一个 redis 服务端程序,只不过运行在特殊的模式下,不提供数据存储服务,只进行普通 redis 节点监控管理。
  2. 通过不断发送命令,让Redis服务器返回监控其运行状态,包括主服务器和从服务器。
  3. 当哨兵监测到master宕机,会自动将slave切换成master,然后通过发布订阅模式通知其他的从服务器,修改配置文件,让它们切换主机。配置也会修改
  4. 一个哨兵进程对Redis服务器进行监控,可能会出现问题,为此,我们可以使用多个哨兵进行监控。各个哨兵之间还会进行监控,这样就形成了多哨兵模式
  5. 故障切换:假设主服务器宕机,哨兵1先检测到这个结果,系统并不会马上进行故障转移过程,仅仅是哨兵1主观的认为主服务器不可用,这个现象成为主观下线。当后面的哨兵也检测到主服务器不可用,并且数量达到一定值时,那么哨兵之间就会进行一次投票,投票的结果由一个哨兵发起,进行故障切换操作。切换成功后,就会通过发布订阅模式,让各个哨兵把自己监控的从服务器实现切换主机,这个过程称为客观下线。这样对于客户端而言,一切都是透明的。
  6. 在哨兵sentinel机制中,可以解决redis高可用问题,即当master故障后可以自动将slave提升为master,从而可以保证redis服务的正常使用,但是无法解决redis单机写入的瓶颈问题,即单机redis写入性能受限于单机的内存大小、并发数量、网卡速率等因素。

哨兵工作模式

  1. 每个Sentinel以每秒钟一次的频率向mster、slave、其他sentinel发送ping命令
  2. 如果一个实例(instance)距离最后一次有效回复PING命令的时间超过 own-after-milliseconds 选项所指定的值,则这个实例会被Sentinel标记为主观下线。
  3. 如果一个Master被标记为主观下线,则正在监视这个Master的所有 Sentinel 要以每秒一次的频率确认Master的确进入了主观下线状态。
  4. 当有足够数量的Sentinel(大于等于配置文件指定的值)在指定的时间范围内确认Master的确进入了主观下线状态,则Master会被标记为客观下线。
  5. 在一般情况下,每个Sentinel 会以每10秒一次的频率向它已知的所有Master,Slave发送 INFO 命令。
  6. 当Master被Sentinel标记为客观下线时,Sentinel 向下线的 Master 的所有Slave发送 INFO命令的频率会从10秒一次改为每秒一次。
  7. 若没有足够数量的Sentinel同意Master已经下线,Master的客观下线状态就会被移除。 若 Master重新向Sentinel 的PING命令返回有效回复,Master的主观下线状态就会被移除。

主备切换过程

  1. 假设主服务器宕机,哨兵1先检测到这个结果,系统并不会马上进行failover过程,仅仅是哨兵1主观的认为主服务器不可用,这个现象成为主观下线
  2. 当后面的哨兵也检测到主服务器不可用,并且数量达到一定值时,那么哨兵之间就会进行一次投票,投票的结果由一个哨兵发起,进行故障切换操作。
  3. 切换成功后,就会通过发布订阅模式,让各个哨兵把自己监控的从服务器实现切换主机,这个过程称为客观下线。这样对于客户端而言,一切都是透明的。

Redis集群模式

Redis cluster集群原理

  1. 哨兵模式只解决了redis高可用问题,及时将挂掉了master换掉,但无法解决redis单机写入的瓶颈问题
  2. 由多个Redis服务器组成的分布式网络服务集群;至少6台redis服务器3主3从
  3. 集群之中有多个Master主节点,每一个主节点都可读可写;
  4. 节点之间会互相通信,两两相连;
  5. Redis集群无中心节点。可以理解成多个哨兵模式,基于Raft算法管理集群

数据分片机制

  1. Redis的分布式解决方案,分割数据到多个Redis实例的处理过程,因此每个实例只保存key的一个子集
  2. 采用hash槽分区
  3. 所有的键根据hash函数映射到0-16384整数槽内,根据公式:slot = CRC16(ey) & 16384,每个节点负责维护一部分槽一级槽所映射的键值数据
  4. Redis虚拟槽分区的特点
  1. 解耦数据和节点之间的关系,简化了节点扩容和收缩难度。
  2. 节点自身维护槽的映射关系,不需要客户端或者代理服务维护槽分区元数据
  3. 支持节点、槽和键之间的映射查询,用于数据路由,在线集群伸缩等场景。
  1. 如果集群中新增节点需要从已有节点删除一些hash slot给新节点,同理删除节点也应该将删除节点上的hash slot移动到现有的节点
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
3天前
|
存储 NoSQL 算法
09- Redis分片集群中数据是怎么存储和读取的 ?
Redis分片集群使用哈希槽分区算法,包含16384个槽(0-16383)。数据存储时,通过CRC16算法对key计算并模16383,确定槽位,进而分配至对应节点。读取时,根据槽位找到相应节点直接操作。
73 12
|
3天前
|
NoSQL Linux Redis
06- 你们使用Redis是单点还是集群 ? 哪种集群 ?
**Redis配置:** 使用哨兵集群,结构为1主2从,加上3个哨兵节点,总计分布在3台Linux服务器上,提供高可用性。
383 0
|
3天前
|
负载均衡 监控 NoSQL
Redis的几种主要集群方案
【5月更文挑战第15天】Redis集群方案包括主从复制(基础,读写分离,手动故障恢复)、哨兵模式(自动高可用,自动故障转移)和Redis Cluster(官方分布式解决方案,自动分片、容错和扩展)。此外,还有Codis、Redisson和Twemproxy等工具用于代理分片和负载均衡。选择方案需考虑应用场景、数据量和并发需求,权衡可用性、性能和扩展性。
33 2
|
3天前
|
存储 监控 负载均衡
保证Redis的高可用性是一个涉及多个层面的任务,主要包括数据持久化、复制与故障转移、集群化部署等方面
【5月更文挑战第15天】保证Redis高可用性涉及数据持久化、复制与故障转移、集群化及优化策略。RDB和AOF是数据持久化方法,哨兵模式确保故障自动恢复。Redis Cluster实现分布式部署,提高负载均衡和容错性。其他措施包括身份认证、多线程、数据压缩和监控报警,以增强安全性和稳定性。通过综合配置与监控,可确保Redis服务的高效、可靠运行。
25 2
|
3天前
|
存储 NoSQL Redis
Redis源码、面试指南(5)多机数据库、复制、哨兵、集群(下)
Redis源码、面试指南(5)多机数据库、复制、哨兵、集群
19 1
|
3天前
|
监控 NoSQL Redis
Redis源码、面试指南(5)多机数据库、复制、哨兵、集群(上)
Redis源码、面试指南(5)多机数据库、复制、哨兵、集群
34 0
|
3天前
|
存储 监控 NoSQL
Redis哨兵&分片集群
Redis哨兵&分片集群
20 0
|
3天前
|
NoSQL 算法 Java
深入浅出Redis(八):Redis的集群模式
深入浅出Redis(八):Redis的集群模式
|
3天前
|
NoSQL Redis
透视Redis集群:心跳检测如何维护高可用性
Redis心跳检测保障集群可靠性,通过PING命令检测主从连接状态,预防数据丢失。当连接异常时,自动触发主从切换。此外,心跳检测辅助实现`min-slaves-to-write`和`min-slaves-max-lag`策略,避免不安全写操作。还有重传机制,确保命令无丢失,维持数据一致性。合理配置心跳检测,能有效防止数据问题,提升Redis集群的高可用性。关注“软件求生”获取更多Redis知识!
135 10
透视Redis集群:心跳检测如何维护高可用性
|
3天前
|
监控 NoSQL 算法
Redis集群模式:高可用性与性能的完美结合!
小米探讨Redis集群模式,通过一致性哈希分散负载,主从节点确保高可用性。节点间健康检测、主备切换、数据复制与同步、分区策略和Majority选举机制保证服务可靠性。适合高可用性及性能需求场景,哨兵模式则适用于简单需求。一起学习技术的乐趣!关注小米微信公众号“软件求生”获取更多内容。
69 11
Redis集群模式:高可用性与性能的完美结合!