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

  • 时间:
  • 浏览:1

这基于另一个高可用服务设计的最好的办法,即单点故障有一种 本来 个小概率事件,而多个单点一起故障(即master和slave一起挂掉),不到认为是(基本)不需要可能 居于的事件。

作为服务的提供方,我门 一个劲会讲到用户体验那些的疑问。在上述方案当中始终另一个让Client端用的有的是不到 舒服的地方。对于单机版Redis,Client端直接连接Redis Server,我门 只不到给另一个ip和port,Client就不到使用我门 的服务了。而改造成Sentinel模式前一天,Client不得不采用许多支持Sentinel模式的內部依赖包,否则不到修改自己的Redis连接配置,这对于“矫情”的用户来讲显然是不到接收的。有不到 法律最好的办法还是像在使用单机版的Redis那样,只给Client另一个固定的ip和port就不到提供服务呢?

你不可能 会问,为那些Redis要有你你是什么50%的设定?假设我门 允许小于等于50%的Sentinel连通的场景下本来 到进行主从切换。试想一下【异常3】,即服务器1和服务器2之间的网络中断,否则服务器有一种 是不到运行的。如下图所示:

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

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

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

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

Redis Sentinel不到理解为另一个监控Redis Server服务算不算 正常的多线程 ,否则一旦检测到不正常,不到自动地将备份(slave)Redis Server启用,使得內部用户对Redis服务內部出現的异常无感知。我门 按照由简至繁的步骤,搭建另一个最小型的高可用的Redis服务。

为了实现高可用,避免方案1中所述的单点故障那些的疑问,我门 不到增加另一个备份服务,即在两台服务器上分别各启动另一个Redis Server多线程 ,一般情况报告下由master提供服务,slave只负责同步和备份。

在方案4中,一旦服务器1和许多服务器的通信详细中断,不到 服务器2和3会将slave切换为master。对于客户端来说,在不到 一瞬间会有另一个master提供服务,否则一旦网络恢复了,不到 所有在中断期间落在服务器1上的新数据都会丢失。不可能 不需要 每种避免你你是什么那些的疑问,不到配置Redis Server多线程 ,让其在检测到自己网络有那些的疑问的前一天,立即停止服务,避免在网络故障期间还有新数据进来(不到参考Redis的min-slaves-to-write和min-slaves-max-lag这另一个配置项)。

实际上,不可能 你的机器比较空闲,当然本来 到把服务器3顶端也开启另一个Redis Server,形成1 master + 2 slave的架构,每个数据有的是另一个备份,可用性会提升许多。当然也并有的是slave很多越好,毕竟主从同步也是不到时间成本的。

为了避免方案2的那些的疑问,我门 把Redis Sentinel多线程 也额外启动一份,另一个Sentinel多线程 一起为客户端提供服务发现的功能。对于客户端来说,它不到连接任何另一个Redis Sentinel服务,来获取当前Redis Server实例的基本信息。通常情况报告下,我门 会在Client端配置多个Redis Sentinel的链接地址,Client一旦发现某个地址连接不上,会去试图连接许多的Sentinel实例,这当然本来 不到我门 手动实现,各个开发语言中比较热门的redis连接库都帮我门 实现了你你是什么功能。我门 预期是:即使其中另一个Redis Sentinel挂掉了,还有另外另一个Sentinel不到提供服务。

与此一起,在额外启动另一个Sentinel多线程 ,监控另一个Redis Server实例的可用性,以便在master挂掉的前一天,及时把slave提升到master的角色继续提供服务,原本就实现了Redis Server的高可用。

你你是什么搭配仅适合个学数学习娱乐,毕竟你你是什么配置总会有单点故障的那些的疑问无法避免。一旦Redis服务多线程 挂了,不可能 服务器1停机了,不到 服务就不可用了。否则不可能 不到 配置Redis数据持久化的话,Redis內部不可能 存储的数据也会丢失。

不过任何另一个基础服务的提供方,都会被调用方问起的另一个那些的疑问是:你的服务算不算 具有高可用性?最好从不需要可能 你的服务一个劲出那些的疑问,原因我这边的业务跟着遭殃。最近我所在的项目中也自己搭了一套小型的“高可用”Redis服务,在此做一下自己的总结和思考。

搭建任何另一个服务,做到“能用”不言而喻是非常简单的,就像我门 运行另一个单机版的Redis。不过一旦要做到“高可用”,事情就会变得冗杂起来。业务中使用了额外的两台服务器,另一个Sentinel多线程 +另一个Slave多线程 ,本来 为了保证在那小概率的事故中依然做到服务可用。在实际业务中我门 还启用了supervisor做多线程 监控,一旦多线程 意外退出,会自动尝试重新启动。

对于搭建高可用Redis服务,网上已有了统统 方案,类式Keepalived,Codis,Twemproxy,Redis Sentinel。其中Codis和Twemproxy主本来 用于大规模的Redis集群中,也是在Redis官方发布Redis Sentinel前一天twitter和豌豆荚提供的开源避免方案。

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

答案当然是肯定的。这不可能 就要引入虚拟IP(Virtual IP,VIP),如上图所示。我门 不到把虚拟IP指向Redis Server master所在的服务器,在居于Redis主从切换的前一天,会触发另一个回调脚本,回调脚本中将VIP切换至slave所在的服务器。原本对于Client端来说,他仿佛在使用的依然是另一个单机版的高可用Redis服务。

当然目前的第三方库一般有的是可能 实现了你你是什么调用过程,不再不到我门 手动去实现(类式Nodejs的ioredis,PHP的predis,Golang的go-redis/redis,JAVA的jedis等)。

不言而喻以上任意有一种 异常有的是小概率事件,而做到高可用性的基本指导思想本来 :多个小概率事件一起居于的概率不到忽略不计。假使 我门 设计的系统不到容忍短时间内的单点故障,即可实现高可用性。

至此,我门 就用3台机器搭建了另一个高可用的Redis服务。不言而喻网上还有更加节省机器的法律最好的办法,本来 把另一个Sentinel多线程 放在去Client机器上,而有的是服务提供方的机器上。只不过在公司顶端,一般服务的提供方和调用方从不来自同另一个团队。另一个团队一起操作同另一个机器,很容易不可能 沟通那些的疑问原因许多误操作,统统 出于你你是什么人为因素的考虑,我门 还是采用了方案4的架构。否则不可能 服务器3顶端只跑了另一个Sentinel多线程 ,对服务器资源消耗从很多,不到用服务器3来跑许多许多的服务。

鉴于方案3并不到 法律最好的办法做到高可用,我门 最终的版本本来 上图所示的方案4了。实际上这就你不在 们最终搭建的架构。我门 引入了服务器3,否则在3顶端又搭建起另一个Redis Sentinel多线程 ,现在由另一个Sentinel多线程 来管理另一个Redis Server实例。你你是什么场景下,不管是单一多线程 故障、还是单个机器故障、还是某另一个机器网络通信故障,不到继续对外提供Redis服务。

结语

【异常2】某台节点服务器down掉,共要你你是什么节点上所有多线程 都停了(类式某运维手残,把另一个服务器的电源拔了;类式许多老旧机器出現硬件故障)

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

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

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

我的业务中数据量从不大,统统 搞集群服务反本来 浪费机器了。最终在Keepalived和Redis Sentinel之间做了个选用,选用了官方的避免方案Redis Sentinel。

不需要 学习Java高架构、分布式架构、高可扩展、高性能、高并发、性能优化、Spring boot、Redis、ActiveMQ、Nginx、Mycat、Netty、Jvm大型分布式项目实战学习架构师视频免费获取 架构群:点击链接加入群聊【JAVA高级架构】:https://jq.qq.com/?_wv=1027&k=5dbERkY

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

【异常1】某个节点服务器的某个多线程 一个劲down掉(类式某开发手残,把一台服务器的redis-server多线程 kill了)

这时,Sentinel不言而喻是不需要将仅剩的slave切加进去master继续服务的,也就原因Redis服务不可用,不可能 Redis的设定是不到当超过50%的Sentinel多线程 不到连通并投票选用新的master时,才会真正居于主从切换。本例中另一个Sentinel只另一个不到连通,等于50%从不在 不到主从切换的场景中。

首先我门 要定义一下对于Redis服务来说何如才算不算 高可用,即在各种出現异常的情况报告下,依然不到正常提供服务。不可能 宽松许多,出現异常的情况报告下,只经过很短暂的时间即可恢复正常服务。所谓异常,应该共要暗含了以下几种不可能 性:

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

一般情况报告下,我门 搭的自己网站,不可能 平时做开发时,会起另一个单实例的Redis Server。调用方直接连接Redis服务即可,甚至Client和Redis有一种 就居于同一台服务器上。

然而,愿景是美好的,现实却是很残酷的。不到 架构下,依然无法实现Redis服务的高可用。方案3示意图中,红线每种是两台服务器之间的通信,而我门 所设想的异常场景(【异常2】)是,某台服务器整体down机,不妨假设服务器1停机,此时,只剩下服务器2顶端的Redis Sentinel和slave Redis Server多线程 。

然而,我门 实现了Redis Server服务的主从切换前一天,又引入了另一个新的那些的疑问,即Redis Sentinel有一种 也是个单点服务,一旦Sentinel多线程 挂了,不到 客户端就不到 律最好的办法链接Sentinel了。统统 说,方案2的配置并无法实现高可用性。

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