Redis已经大量应用于各类互联网架构场景中,其优异的性能,良好的操做性,以及大量的场景应用案例,使得Redis备受瞩目。本文做者向你们介绍了一种Redis在非大集群分布式应用场景下的灾备解决方案。一块儿来品读一下吧~
Redis是一个高性能的key-value非关系型数据库,因为其具备高性能的特性,支持高可用、持久化、多种数据结构、集群等,使其脱颖而出,成为经常使用的非关系型数据库。
此外,Redis的使用场景也比较多。redis
wp-redis
,这个插件能以最快的速度加载你曾经浏览过的页面。咱们常经过Reids的队列功能作购买限制。好比到节假日或者推广期间,进行一些活动,对用户购买行为进行限制,限制今天只能购买几回商品或者一段时间内只能购买一次。也比较适合适用。数据库
此外还有不少其它场景,Redis都表现的不错。缓存
正是因为Redis具有多种优良特新,且应用场景很是丰富,以致于Redis在各个公司都有它存在的身影。那么随之而来的问题和风险也就来了。Redis虽然应用场景丰富,但部分公司在实践Redis应用的时候仍是相对保守使用单节点部署,那为往后的维护带来了安全风险。安全
在2015年的时候,曾处理过一个由于单点故障缘由致使的业务中断问题。当时的Redis都未采用分布式部署,采用单实例部署,并未考虑容灾方面的问题。服务器
当时咱们经过Redis服务器作用户购买优惠商品的行为控制,但后来因为未知缘由Redis节点的服务器宕机了,致使咱们没法对用户购买行为进行控制,形成了用户可以在一段时间内屡次购买优惠商品的行为。数据结构
这种宕机事故能够说已经对公司形成了不可挽回的损失了,安全风险问题很是严重,做为当时运维这个系统的我来讲有必要对这个问题进行修复和在架构上的改进。因而我开始了解决非分布式应用下Redis单点故障方面的研究学习。架构
Redis主从复制如今应该是很广泛了。经常使用的主从复制架构有以下两种架构方案。运维
此时须要通过以下操做(假设提高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提供了高可用方案。从实践方面来讲,使用Redis Sentinel能够建立一个无需人为干预就能够预防某些故障的Redis环境。
Redis Sentinel设计为分布式的架构,运行多个Sentinel进程来共同合做的。运行多个Sentinel进程合做,当多个Sentinel同一给定的master没法再继续提供服务,就会执行故障检测,这会下降误报的可能性。
Redis Sentinel在Redis高可用方案中主要做用有以下功能:
Sentinel集群对自身和Redis主从复制进行监控。当发现Master节点出现故障时,会通过以下步骤:
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
流程图以下:
![]()
使用sentinel实现了Redis的高可用,当master出现故障时,彻底无需人工干预便可实现故障转移。避免了对业务的影响,提升了运维工做效率。
在部署sentinel的时候,建议使用奇数个sentinel节点,最少三个sentinel节点。
因为sentinel知识点比较多,这里仅给你们进行介绍,让你们有个了解。
原文:https://www.sohu.com/a/167105...