高可用 Redis 服务架构分析与搭建

  • 时间:
  • 浏览:1
  • 来源:UU直播快三官方_大发UU直播快3

为了出理 方案2的什么的什么的问题,亲戚朋友把Redis Sentineltcp连接也额外启动一份,有一一三个白Sentineltcp连接一起为客户端提供服务发现的功能。对于客户端来说,它都可以连接任何有一一三个白Redis Sentinel服务,来获取当前Redis Server实例的基本信息。通常情况下,亲戚朋友会在Client端配置多个Redis Sentinel的链接地址,Client一旦发现某个地址连接不上,会去试图连接或多或少的Sentinel实例,这当然就是还要亲戚朋友手动实现,各个开发语言中比较热门的redis连接库都帮亲戚朋友实现了你这个 功能。亲戚朋友预期是:即使其含晒 一一三个白Redis Sentinel挂掉了,还有另外有一一三个白Sentinel都可以提供服务。

鉴于方案3并那末法律法律法律依据做到高可用,亲戚朋友最终的版本就是上图所示的方案4了。实际上这就是亲戚朋友最终搭建的架构。亲戚朋友引入了服务器3,或者在3上面又搭建起有一一三个白Redis Sentineltcp连接,现在由有一一三个白Sentineltcp连接来管理有一一三个白Redis Server实例。你这个 场景下,不管是单一tcp连接故障、还是单个机器故障、还是某有一一三个白机器网络通信故障,都可以继续对外提供Redis服务。

这时,Sentinel虽然是我不多 将仅剩的slave切加带master继续服务的,也就原应 Redis服务不可用,不可能 Redis的设定是只有当超过3000%的Sentineltcp连接都可以连通并投票选取新的master时,才会真正地处主从切换。本例含晒 一一三个白Sentinel只有有一一三个白都可以连通,等于3000%从找不到都可以主从切换的场景中。

【异常2】某台节点服务器down掉,共要你这个 节点上所有tcp连接都停了(同类某运维手残,把有一一三个白服务器的电源拔了;同类或多或少老旧机器再次出显硬件故障)

然而,亲戚朋友实现了Redis Server服务的主从切换时候,又引入了有一一三个白新的什么的什么的问题,即Redis Sentinel有一种也是个单点服务,一旦Sentineltcp连接挂了,那末客户端就那末律法律法律依据链接Sentinel了。好多好多 说,方案2的配置并无法实现高可用性。

实际上对于服务器2来说,服务器1直接down掉和服务器1网络连不通是一样的效果,反正都不 总是就无法进行任何通信了。假设网络中断时亲戚朋友允许服务器2的Sentinel把slave切换为master,结果就是你现在拥有了有一一三个白都可以对外提供服务的Redis Server。Client做任何的增完整版操作,有不可能 落在服务器1的Redis上,都不 不可能 落在服务器2的Redis上(取决于Client到底连通的是哪个Sentinel),造成数据混乱。即使上面服务器1和服务器2之间的网络又恢复了,那末 们也无法把数据统一了(两份不一样的数据,到底该信任谁呢?),数据一致性完整版被破坏。

规模比较大的互联网公司,一般还会有专门的团队,将Redis存储以基础服务的形式提供给各个业务调用。

搭建任何有一一三个白服务,做到“能用”虽然是非常简单的,就像亲戚朋友运行有一一三个白单机版的Redis。不过一旦要做到“高可用”,事情就会变得复杂起来。业务中使用了额外的两台服务器,五个Sentineltcp连接+有一一三个白Slavetcp连接,就是为了保证在那小概率的事故中依然做到服务可用。在实际业务中亲戚朋友还启用了supervisor做tcp连接监控,一旦tcp连接意外退出,会自动尝试重新启动。

为了实现高可用,出理 方案1中所述的单点故障什么的什么的问题,亲戚朋友还要增加有一一三个白备份服务,即在两台服务器上分别各启动有一一三个白Redis Servertcp连接,一般情况下由master提供服务,slave只负责同步和备份。

一般情况下,亲戚朋友搭的或多或少人网站,不可能 平时做开发时,会起有一一三个白单实例的Redis Server。调用方直接连接Redis服务即可,甚至Client和Redis有一种就地处同一台服务器上。

当然目前的第三方库一般都不 可能 实现了你这个 调用过程,不再还要亲戚朋友手动去实现(同类Nodejs的ioredis,PHP的predis,Golang的go-redis/redis,JAVA的jedis等)。

易用性:像使用单机版Redis一样使用Redis Sentinel

作为服务的提供方,亲戚朋友总是会讲到用户体验什么的什么的问题。在上述方案当中始终有有一一三个白让Client端用的都不 那末舒服的地方。对于单机版Redis,Client端直接连接Redis Server,亲戚朋友只还要给有一一三个白ip和port,Client就都可以使用亲戚朋友的服务了。而改造成Sentinel模式时候,Client不得不采用或多或少支持Sentinel模式的外部依赖包,或者还要修改或多或少人的Redis连接配置,这对于“矫情”的用户来讲显然是只有接收的。有那末法律法律法律依据还是像在使用单机版的Redis那样,只给Client有一一三个白固定的ip和port就都可以提供服务呢?

首先亲戚朋友要定义一下对于Redis服务来说怎么都可以才算不算高可用,即在各种再次出显异常的情况下,依然都可以正常提供服务。不可能 宽松或多或少,再次出显异常的情况下,只经过很短暂的时间即可恢复正常服务。所谓异常,应该共要含晒 了以下几种不可能 性:

基于内存的Redis应该是目前各种web开发业务中最为常用的key-value数据库了,亲戚朋友总是在业务中用其存储用户登陆态(Session存储),加速或多或少热数据的查询(相比较mysql而言,速率单位单位有数量级的提升),做简单的消息队列(LPUSH和BRPOP)、订阅发布(PUB/SUB)系统等等。

对于搭建高可用Redis服务,网上已有了好多好多 方案,同类Keepalived,Codis,Twemproxy,Redis Sentinel。其中Codis和Twemproxy主就是用于大规模的Redis集群中,也是在Redis官方发布Redis Sentinel时候twitter和豌豆荚提供的开源出理 方案。

我的业务中数据量从不大,好多好多 搞集群服务反就是浪费机器了。最终在Keepalived和Redis Sentinel之间做了个选取,选取了官方的出理 方案Redis Sentinel。

说到这里,也给亲戚朋友推荐有一一三个白架构交流学习群:835544715,上面会分享或多或少资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化那先 成为架构师必备的知识体系。还能领取免费的学习资源,相信对于不可能 工作和遇到技术瓶颈的码友,在你这个 群里会是你还要的内容。

方案3:主从同步Redis Server,双实例Sentinel

Redis Sentinel都可以理解为有一一三个白监控Redis Server服务算不算正常的tcp连接,或者一旦检测到不正常,都可以自动地将备份(slave)Redis Server启用,使得外部用户对Redis服务外部再次出显的异常无感知。亲戚朋友按照由简至繁的步骤,搭建有一一三个白最小型的高可用的Redis服务。

虽然以上任意有一种异常都不 小概率事件,而做到高可用性的基本指导思想就是:多个小概率事件一起地处的概率都可以忽略不计。就是亲戚朋友设计的系统都可以容忍短时间内的单点故障,即可实现高可用性。

答案当然是肯定的。这不可能 就要引入虚拟IP(Virtual IP,VIP),如上图所示。亲戚朋友都可以把虚拟IP指向Redis Server master所在的服务器,在地处Redis主从切换的时候,会触发有一一三个白回调脚本,回调脚本中将VIP切换至slave所在的服务器。那末 对于Client端来说,他仿佛在使用的依然是有一一三个白单机版的高可用Redis服务。

与此一起,在额外启动有一一三个白Sentineltcp连接,监控有一一三个白Redis Server实例的可用性,以便在master挂掉的时候,及时把slave提升到master的角色继续提供服务,那末 就实现了Redis Server的高可用。

对于Redis服务的调用方来说,现在要连接的是Redis Sentinel服务,而都不 Redis Server了。常见的调用过程是,client先连接Redis Sentinel并询问目前Redis Server中哪个服务是master,那先 是slave,或者再去连接相应的Redis Server进行操作。

你这个 搭配仅适合个学得习娱乐,毕竟你这个 配置总会有单点故障的什么的什么的问题无法出理 。一旦Redis服务tcp连接挂了,不可能 服务器1停机了,那末服务就不可用了。或者不可能 那末配置Redis数据持久化励志的话 ,Redis外部不可能 存储的数据也会丢失。

你不可能 会问,为那先 Redis要有你这个 3000%的设定?假设亲戚朋友允许小于等于3000%的Sentinel连通的场景下也都可以进行主从切换。试想一下【异常3】,即服务器1和服务器2之间的网络中断,或者服务器有一种是都可以运行的。如下图所示:

不过任何有一一三个白基础服务的提供方,还会被调用方问起的有一一三个白什么的什么的问题是:你的服务算不算具有高可用性?最好从我不多 可能 你的服务总是出什么的什么的问题,原应 我这边的业务跟着遭殃。最近我所在的项目中也或多或少人搭了一套小型的“高可用”Redis服务,在此做一下或多或少人的总结和思考。

如果学习Java高架构、分布式架构、高可扩展、高性能、高并发、性能优化、Spring boot、Redis、ActiveMQ、Nginx、Mycat、Netty、Jvm大型分布式项目实战学习架构师视频免费获取 架构群:835544715

方案2:主从同步Redis Server,单实例Sentinel

这基于有一一三个白高可用服务设计的法律法律依据,即单点故障有一种就是个小概率事件,而多个单点一起故障(即master和slave一起挂掉),都可以认为是(基本)我不多 可能 地处的事件。

然而,愿景是美好的,现实却是很残酷的。那末架构下,依然无法实现Redis服务的高可用。方案3示意图中,红线主次是两台服务器之间的通信,而亲戚朋友所设想的异常场景(【异常2】)是,某台服务器整体down机,不妨假设服务器1停机,此时,只剩下服务器2上面的Redis Sentinel和slave Redis Servertcp连接。

实际上,不可能 你的机器比较空闲,当然也都可以把服务器3上面也开启有一一三个白Redis Server,形成1 master + 2 slave的架构,每个数据都不 有一一三个白备份,可用性会提升或多或少。当然也并都不 slave不多越好,毕竟主从同步也是还要时间成本的。

方案4:主从同步Redis Server,三实例Sentinel

结语

点击链接加入群聊【JAVA高级架构】:https://jq.qq.com/?_wv=1027&k=5dbERkY

【异常3】任意有一一三个白节点服务器之间的通信中断了(同类某临时工手残,把用于有一一三个白机房通信的光缆挖断了)

至此,亲戚朋友就用3台机器搭建了有一一三个白高可用的Redis服务。虽然网上还有更加节省机器的法律法律法律依据,就是把有一一三个白Sentineltcp连接放上Client机器上,而都不 服务提供方的机器上。只不过在公司上面,一般服务的提供方和调用方从不来自同有一一三个白团队。有一一三个白团队一起操作同有一一三个白机器,很容易不可能 沟通什么的什么的问题原应 或多或少误操作,好多好多 出于你这个 人为因素的考虑,亲戚朋友还是采用了方案4的架构。或者不可能 服务器3上面只跑了有一一三个白Sentineltcp连接,对服务器资源消耗从不多,还都可以用服务器3来跑或多或少或多或少的服务。

在方案4中,一旦服务器1和或多或少服务器的通信完整版中断,那末服务器2和3会将slave切换为master。对于客户端来说,在那末一瞬间会有有一一三个白master提供服务,或者一旦网络恢复了,那末所有在中断期间落在服务器1上的新数据还会丢失。不可能 如果主次出理 你这个 什么的什么的问题,都可以配置Redis Servertcp连接,让其在检测到或多或少人网络有什么的什么的问题的时候,立即停止服务,出理 在网络故障期间还有新数据进来(都可以参考Redis的min-slaves-to-write和min-slaves-max-lag这有一一三个白配置项)。

方案1:单机版Redis Server,无Sentinel

【异常1】某个节点服务器的某个tcp连接总是down掉(同类某开发手残,把一台服务器的redis-servertcp连接kill了)