共计 3330 个字符,预计需要花费 9 分钟才能阅读完成。
Redis 中怎么实现备份和容灾,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
1. 会话缓存(Session Cache)
Redis 缓存会话有非常好的优势,因为 Redis 提供持久化,在需要长时间保持会话的应用场景中,如购物车场景这样的场景中能提供很好的长会话支持,能给用户提供很好的购物体验。
2. 全页缓存
在 WordPress 中,Pantheon 提供了一个不错的插件 wp-redis,这个插件能以最快的速度加载你曾经浏览过的页面。
3. 队列
Reids 提供 list 和 set 操作,这使得 Redis 能作为一个很好的消息队列平台来使用。
我们常通过 Reids 的队列功能做购买限制。比如到节假日或者推广期间,进行一些活动,对用户购买行为进行限制,限制今天只能购买几次商品或者一段时间内只能购买一次。也比较适合适用。
4. 排名
Redis 在内存中对数字进行递增或递减的操作实现得非常好。所以我们在很多排名的场景中会应用 Redis 来进行,比如小说网站对小说进行排名,根据排名,将排名靠前的小说推荐给用户。
5. 发布 / 订阅
Redis 提供发布和订阅功能,发布和订阅的场景很多,比如我们可以基于发布和订阅的脚本触发器,实现用 Redis 的发布和订阅功能建立起来的聊天系统。
此外还有很多其它场景,Redis 都表现的不错。
二,Redis 使用中单点故障问题
正是由于 Redis 具备多种优良特新,且应用场景非常丰富,以至于 Redis 在各个公司都有它存在的身影。那么随之而来的问题和风险也就来了。Redis 虽然应用场景丰富,但部分公司在实践 Redis 应用的时候还是相对保守使用单节点部署,那为日后的维护带来了安全风险。
在 2015 年的时候,曾处理过一个因为单点故障原因导致的业务中断问题。当时的 Redis 都未采用分布式部署,采用单实例部署,并未考虑容灾方面的问题。
当时我们通过 Redis 服务器做用户购买优惠商品的行为控制,但后来由于未知原因 Redis 节点的服务器宕机了,导致我们无法对用户购买行为进行控制,造成了用户能够在一段时间内多次购买优惠商品的行为。
这种宕机事故可以说已经对公司造成了不可挽回的损失了,安全风险问题非常严重,作为当时运维这个系统的我来说有必要对这个问题进行修复和在架构上的改进。于是我开始了解决非分布式应用下 Redis 单点故障方面的研究学习。
三,非分布式场景下 Redis 应用的备份与容灾
Redis 主从复制现在应该是很普遍了。常用的主从复制架构有如下两种架构方案。
常用 Redis 主从复制
方案一
这是最常见的一种架构,一个 Master 节点,两个 Slave 节点。客户端写数据的时候是写 Master 节点,读的时候,是读取两个 Slave,这样实现读的扩展,减轻了 Master 节点读负载。
方案二
这种架构同样是一个 Master 和两个 Slave。不同的是 Master 和 Slave1 使用 keepalived 进行 VIP 转移。Client 连接 Master 的时候是通过 VIP 进行连接的。避免了方案一 IP 更改的情况。
Redis 主从复制优点与不足
优点
鸿蒙官方战略合作共建——HarmonyOS 技术社区
实现了对 master 数据的备份,一旦 master 出现故障,slave 节点可以提升为新的 master,顶替旧的 master 继续提供服务
实现读扩展。使用主从复制架构,一般都是为了实现读扩展。Master 主要实现写功能, Slave 实现读的功能
不足
架构方案一
当 Master 出现故障时,Client 就与 Master 端断开连接,无法实现写功能,同时 Slave 也无法从 Master 进行复制。
此时需要经过如下操作(假设提升 Slave1 为 Master):
1)在 Slave1 上执 slaveof no one 命令提升 Slave1 为新的 Master 节点。
2)在 Slave1 上配置为可写,这是因为大多数情况下,都将 slave 配置只读。
3)告诉 Client 端 (也就是连接 Redis 的程序) 新的 Master 节点的连接地址。
4)配置 Slave2 从新的 Master 进行数据复制。
架构方案二
当 master 出现故障后,Client 可以连接到 Slave1 上进行数据操作,但是 Slave1 就成了一个单点,就出现了经常要避免的单点故障(single point of failure)。
之后需要经过如下操作:
1)在 Slave1 上执行 slaveof no one 命令提升 Slave1 为新的 Master 节点
2)在 Slave1 上配置为可写,这是因为大多数情况下,都将 Slave 配置只读
3)配置 Slave2 从新的 Master 进行数据复制
可以发现,无论是哪种架构方案都需要人工干预来进行故障转移(failover)。需要人工干预就增加了运维工作量,同时也对业务造成了巨大影响。这时候可以使用 Redis 的高可用方案 -Sentinel
四,Redis Sentinel 介绍
Redis Sentinel 为 Redis 提供了高可用方案。从实践方面来说,使用 Redis Sentinel 可以创建一个无需人为干预就可以预防某些故障的 Redis 环境。
Redis Sentinel 设计为分布式的架构,运行多个 Sentinel 进程来共同合作的。运行多个 Sentinel 进程合作,当多个 Sentinel 同一给定的 master 无法再继续提供服务,就会执行故障检测,这会降低误报的可能性。
五,Redis Sentinel 功能
Redis Sentinel 在 Redis 高可用方案中主要作用有如下功能:
监控
Sentinel 会不断的检查 master 和 slave 是否像预期那样正常运行
通知
通过 API,Sentinel 能够通知系统管理员、程序监控的 Redis 实例出现了故障
自动故障转移
如果 master 不像预想中那样正常运行,Sentinel 可以启动故障转移过程,其中的一个 slave 会提成为 master,其它 slave 会重新配置来使用新的 master,使用 Redis 服务的应用程序,当连接时,也会被通知使用新的地址。
配置提供者
Sentinel 可以做为客户端服务发现的认证源:客户端连接 Sentinel 来获取目前负责给定服务的 Redis master 地址。如果发生故障转移,Sentinel 会报告新的地址。
六,Redis Sentinel 架构
七,Redis Sentinel 实现原理
Sentinel 集群对自身和 Redis 主从复制进行监控。当发现 Master 节点出现故障时,会经过如下步骤:
1)Sentinel 之间进行选举,选举出一个 leader,由选举出的 leader 进行 failover
2)Sentinel leader 选取 slave 节点中的一个 slave 作为新的 Master 节点。对 slave 选举需要对 slave 进行选举的方法如下:
a) 与 master 断开时间
如果与 master 断开的时间超过 down-after-milliseconds(sentinel 配置)* 10 秒加上从 sentinel 判定 master 不可用到 sentinel 开始执行故障转移之间的时间,就认为该 slave 不适合提升为 master。
b) slave 优先级
每个 slave 都有优先级,保存在 redis.conf 配置文件里。如果优先级相同,则继续进行。
c) 复制偏移位置
复制偏移纪录着从 master 复制数据复制到哪里,复制偏移越大表明从 master 接受的数据越多,如果复制偏移量也一样,继续进行选举
d) Run ID
选举具有最小 Run ID 的 Slave 作为新的 Master
流程图如下:
3) Sentinel leader 会在上一步选举的新 master 上执行 slaveof no one 操作,将其提升为 master 节点
4)Sentinel leader 向其它 slave 发送命令,让剩余的 slave 成为新的 master 节点的 slave
5)Sentinel leader 会让原来的 master 降级为 slave,当恢复正常工作,Sentinel leader 会发送命令让其从新的 master 进行复制
看完上述内容,你们掌握 Redis 中怎么实现备份和容灾的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注丸趣 TV 行业资讯频道,感谢各位的阅读!