高可用Redis服务架构微信牛牛棋牌平台出售分析与搭建

    基于内存的Redis应该是所有Web开发业务中最常用的键值数据库,我们经常使用它来存储用户登录状态(会话存储)、plusQuick热数据查询(比mysql快一个数量级)、简单消息队列(LPUSH和BRPOP)、订阅发布(PUB/SUB)系统等等。IDE ReDIS以基本业务的形式存储到各个业务呼叫中。
    
    但是,任何一个基本服务提供商会问的问题之一是:你的服务高度可用吗最好不要在您的服务上造成问题,这样会使我的业务受到影响。最近,我在自己的项目上建立了一小组高可用的Resdis服务,所以我将总结并考虑它。
    
    首先,我们将定义Redis服务的高可用性,在异常情况下Redis服务仍然可以提供服务。或者,更轻松的是,在异常情况下,返回正常服务只需要很短的时间。所谓的异常应该至少包含以下可能性领带:
    
    {异常1 }一个节点服务器上的进程突然下载(例如,开发人员禁用服务器上的ReISIS服务器进程)
    
    {异常2}节点服务器下降,这意味着节点上的所有进程都已停止(例如,禁用的操作员拔出服务器的电源;例如,一些旧机器有硬件故障)
    
    {异常3}任何两个节点服务器之间的通信已中断(例如,临时工人已断开用于两个计算机室之间通信的光纤电缆)
    
    事实上,上述任何异常都是小概率事件,高可用性的基本指导原则是可以忽略同时发生多个小概率事件的概率。短时间,高可用性可以实现。
    
    为了构建高可用的Resis服务,Web上有许多解决方案,如Keepali.、Codis、Twemproxy、Redis Sentinel。Codis和Twemproxy主要用于大型EDIS集群,是在Redis正式发布Re之前由twitter和peapods提供的开源解决方案。dis Sentinel。我的业务中的数据量不大,所以集群服务是机器的浪费。最后,在Keepalived和Redis Sentinel之间进行了选择,选择了Redis Sentinel的官方解决方案。
    
    Redis Sentinel可以被理解为监视Redis Server服务是否正常工作的过程,一旦检测到异常,就可以自动启用备份(从机)Redis Server,从而使外部用户不知道Redis Server中发生的异常E.根据简单而复杂的步骤,我们构建了一个小型的、高度可用的ReISIS服务。
    
    
    
    选项1:单版本ReISIS服务器,没有哨兵
    
    通常,在我们的个人网站上,或者我们通常进行开发时,都会创建一个Reds Server的单个实例。调用者可以直接连接到Redis服务,甚至客户端和Redis本身都在同一台服务器上。这种搭配只适合于个人学习娱乐。这种配置方式存在单点故障无法解决的问题,一旦Redis服务进程挂起或服务器1停机,服务就无法使用,如果不配置Redis数据持久性,存储在Redis中的数据也会丢失。
    
    
    
    场景2:主从同步ReISIS服务器,单实例哨兵
    
    为了实现高可用性,我们必须为解决方案1中描述的单点故障添加备份服务,即,在两个服务器中的每个服务器上启动Redis Server进程,通常由主服务器提供服务,从服务器仅负责同步和备份。e,启动一个额外的Sentinel进程来监视两个Redis Server实例的可用性,以便当主服务器挂起时,从服务器可以被提升到主服务器的角色以继续服务,从而支持Redis Server的高可用性。单点故障本身就是一个小概率事件,并且多个单点故障(即,主从同时挂起)可以被认为是(基本上)不可能发生的事件。
    
    对于Redis服务的调用者,现在连接的是Redis Sentinel服务,而不是Redis Server。当然,第三方库一般都已经实现了这个调用过程,不需要手动实现(例如Nodejs的IORDIS、PHP的PrdIs、GO ReDIS/ReDIS for Golang、JEDIS Java等)。
    
    然而,在实现Redis Server服务的主-从交换机之后,我们引入了一个新问题,即Redis Sentinel本身是单点服务。一旦Sentinel进程挂起,客户端就无法链接到Sentinel,因此方案2的配置无法实现高可用性。
    
    
    
    场景3:主从同步ReISIS服务器,双实例哨兵
    
    为了解决场景2中的问题,我们额外启动了一个Redis Sentinel进程,两个Sentinel进程为客户端提供了同时发现服务的能力。DISS服务器实例。通常,我们在客户端配置多个RADIS前哨链接地址。一旦发现一个地址无法连接,客户端将尝试连接到ReISS哨兵的其他实例。这当然不需要手工完成。流行的各种开发语言中的redis连接库帮助我们实现这个功能。我们的期望是,即使Redis Sentinel中的一个挂断,也有另一个Sentinel可以服务。
    
    但是,在这个框架下,它仍然无法实现ReDIS服务的高可用性。在示意图3中,红线部分是两个服务器之间的通信,而我们设想的异常场景({异常2 })是服务器。作为一个整体下载,假设服务器1处于下降状态,只在服务器2上留下红色前哨和从属ReISIS服务器进程。在这一点上,哨兵实际上不将剩余的奴隶切换到主继承,这使得ReISIS服务不可用,因为ReDIS被配置为AC。只有在超过50%的EtnILL过程可以连接并投票给一个新的主机时,才能在主从之间进行切换。在这种情况下,只有两个哨兵中的一个可以连接,等于50%,而不是主从可切换的场景。
    
    你可能会问,为什么雷迪斯有50%套呢假设我们允许哨兵的连接性小于或等于50%,我们还可以执行主-从交换。设想{异常3},服务器1和服务器2之间的网络中断,但是服务器本身正在运行。如下图所示:
    
    事实上,对于服务器2,服务器1直接下落,服务器1与网络断开是相同的效果,在任何情况下,都突然无法进行任何通信。假设我们允许服务器2的哨兵在网络宕机时切换奴隶到主机,而现在您有两个ReISS S。客户端可以在外部服务。客户端在服务器1的ReDIS上或服务器2的ReDIS(取决于客户端连接到哪一个哨兵)上进行任何添加或删除,造成混淆。即使服务器1和服务器2之间的网络稍后恢复,我们也不能统一数据(两个差异)。租金数据,我们究竟应该相信谁数据一致性被完全破坏。
    
    
    
    场景4:主从同步ReISIS服务器,三实例哨兵
    
    由于场景3不是高可用的,所以我们的最终版本是上面所示的场景4。实际上,这是我们最终构建的体系结构。我们引入了服务器3,并在其上构建了Redis Sentinel进程。现在,三个Sentinel进程管理两个Redis Server实例。在这个场景中,Redis服务可以继续提供给外部世界,无论是单个进程故障、单个机器故障还是两台机器之间的网络通信故障。
    
    实际上,如果您的机器空闲,您还可以打开服务器3上的Redis Server,以形成一个主+2从架构,每个数据有两个备份,这提高了可用性。当然,从服务器越多越好。毕竟,主从同步需要时间成本。
    
    在场景4中,一旦服务器1和其他服务器之间的通信完全中断,服务器2和服务器3将从机切换为主机。如果希望部分解决此问题,可以配置Redis Server进程,以便在其自己的网络上检测到问题时立即停止服务,并避免在网络故障期间出现新数据(请参阅Redis的最小从属写入和最小从属最大滞后配置)。离子项)。
    
    到目前为止,我们已经用3台机器构建了一个高可用的Redis服务。实际上,在Web上有一种更节省机器的方法,即在客户机上而不是在服务提供者的机器上放置哨兵进程。o不是来自同一个团队。因为两个团队在同一台机器上协同工作,所以由于通信问题,很容易误操作,所以对于这个人为因素,我们仍然使用Scheme 4的体系结构。服务器上的H资源。服务器3也可以用于运行一些其他服务。
    
    
    
    易用性:使用RIDIS哨兵作为RIDES的独立版本
    
    作为服务的提供者,我们总是谈论用户体验。总有一个地方,客户机端不那么舒服。对于独立的Redis,客户机端直接连接到Redis服务器,我们需要的只是一个IP和端口,客户机可以使用我们的服务。创建Sentinel模式之后客户机必须采用一些支持Sentinel模式的外部依赖包,并修改其Redis连接配置,这显然对影响用户是不可接受的。是否可以像使用独立服务器那样通过给客户机一个固定的IP和端口来提供服务红魔的离子
    
    答案当然是肯定的。这可以引入虚拟IP(VIP),如上面的IP所示。我们可以将虚拟IP指向Redis Server主机所在的服务器,当发生Redis主-从交换机时,触发回调脚本,将VIP切换到t.因此,对于客户端来说,他似乎还在使用一个独立版本的高度可用的ReISS服务。
    
    
    
    后记
    
    构建任何可用的服务实际上非常简单,比如运行Reedis的独立版本。但是一旦获得高可用性,事情就变得复杂了。业务使用两个额外的服务器,三个哨兵进程和一个从进程,只是为了确保服务仍然有效在实际业务中,我们还使主管能够进行流程监控,一旦流程意外退出,它将自动尝试重新启动。

猜你喜欢

转载自www.cnblogs.com/h5qipaiyuanma/p/9779990.html