jeesz分布式架构-分布式高可用

author author     2022-08-24     389

关键词:

什么是高可用 

高可用HA(High Availability)是分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计减少系统不能提供服务的时间。 

假设系统一直能够提供服务,我们说系统的可用性是100%。 
如果系统每运行100个时间单位,会有1个时间单位无法提供服务,我们说系统的可用性是99%。 
很多公司的高可用目标是4个9,也就是99.99%,这就意味着,系统的年停机时间为8.76个小时。 

如何保障系统的高可用 

我们都知道,单点是系统高可用的大敌,单点往往是系统高可用最大的风险和敌人,应该尽量在系统设计的过程中避免单点。方法论上,高可用保证的原则是“集群化”,或者叫“冗余”:只有一个单点,挂了服务会受影响;如果有冗余备份,挂了还有其他backup能够顶上。 
保证系统高可用,架构设计的核心准则是:冗余。 

有了冗余之后,还不够,每次出现故障需要人工介入恢复势必会增加系统的不可服务实践。所以,又往往是通过“自动故障转移”来实现系统的高可用。 
接下来我们看下典型互联网架构中,如何通过冗余+自动故障转移来保证系统的高可用特性。 

常见的互联网分层架构 

常见互联网分布式架构如上,分为: 

(1)客户端层:典型调用方是浏览器browser或者手机应用APP 
(2)反向代理层:系统入口,反向代理 
(3)站点应用层:实现核心应用逻辑,返回html或者json 
(4)服务层:如果实现了服务化,就有这一层 
(5)数据-缓存层:缓存加速访问存储 
(6)数据-数据库层:数据库固化数据存储 

整个系统的高可用,又是通过每一层的冗余+自动故障转移来综合实现的。 


分层高可用架构实践 

【客户端层->反向代理层】的高可用 

客户端层到反向代理层的高可用,是通过反向代理层的冗余来实现的。以nginx为例:有两台nginx,一台对线上提供服务,另一台冗余以保证高可用,常见的实践是keepalived存活探测,相同virtual IP提供服务。 


自动故障转移:当nginx挂了的时候,keepalived能够探测到,会自动的进行故障转移,将流量自动迁移到shadow-nginx,由于使用的是相同的virtual IP,这个切换过程对调用方是透明的。 

【反向代理层->站点层】的高可用 

反向代理层到站点层的高可用,是通过站点层的冗余来实现的。假设反向代理层是nginx,nginx.conf里能够配置多个web后端,并且nginx能够探测到多个后端的存活性。 


自动故障转移:当web-server挂了的时候,nginx能够探测到,会自动的进行故障转移,将流量自动迁移到其他的web-server,整个过程由nginx自动完成,对调用方是透明的。 


【站点层->服务层】的高可用 

站点层到服务层的高可用,是通过服务层的冗余来实现的。“服务连接池”会建立与下游服务多个连接,每次请求会“随机”选取连接来访问下游服务。 


自动故障转移:当service挂了的时候,service-connection-pool能够探测到,会自动的进行故障转移,将流量自动迁移到其他的service,整个过程由连接池自动完成,对调用方是透明的(所以说RPC-client中的服务连接池是很重要的基础组件)。 

【服务层>缓存层】的高可用 

服务层到缓存层的高可用,是通过缓存数据的冗余来实现的。 
缓存层的数据冗余又有几种方式:第一种是利用客户端的封装,service对cache进行双读或者双写。 


缓存层也可以通过支持主从同步的缓存集群来解决缓存层的高可用问题。 
以redis为例,redis天然支持主从同步,redis官方也有sentinel哨兵机制,来做redis的存活性检测。 


自动故障转移:当redis主挂了的时候,sentinel能够探测到,会通知调用方访问新的redis,整个过程由sentinel和redis集群配合完成,对调用方是透明的。 

说完缓存的高可用,这里要多说一句,业务对缓存并不一定有“高可用”要求,更多的对缓存的使用场景,是用来“加速数据访问”:把一部分数据放到缓存里,如果缓存挂了或者缓存没有命中,是可以去后端的数据库中再取数据的。 
这类允许“cache miss”的业务场景,缓存架构的建议是: 

将kv缓存封装成服务集群,上游设置一个代理(代理可以用集群冗余的方式保证高可用),代理的后端根据缓存访问的key水平切分成若干个实例,每个实例的访问并不做高可用。 


缓存实例挂了屏蔽:当有水平切分的实例挂掉时,代理层直接返回cache miss,此时缓存挂掉对调用方也是透明的。key水平切分实例减少,不建议做re-hash,这样容易引发缓存数据的不一致。 

【服务层>数据库层】的高可用 

大部分互联网技术,数据库层都用了“主从同步,读写分离”架构,所以数据库层的高可用,又分为“读库高可用”与“写库高可用”两类。 

【服务层>数据库层“读”】的高可用 

服务层到数据库读的高可用,是通过读库的冗余来实现的。 
既然冗余了读库,一般来说就至少有2个从库,“数据库连接池”会建立与读库多个连接,每次请求会路由到这些读库。 


自动故障转移:当读库挂了的时候,db-connection-pool能够探测到,会自动的进行故障转移,将流量自动迁移到其他的读库,整个过程由连接池自动完成,对调用方是透明的(所以说DAO中的数据库连接池是很重要的基础组件)。 

【服务层>数据库层“写”】的高可用 

服务层到数据库写的高可用,是通过写库的冗余来实现的。 
以mysql为例,可以设置两个mysql双主同步,一台对线上提供服务,另一台冗余以保证高可用,常见的实践是keepalived存活探测,相同virtual IP提供服务。 


自动故障转移:当写库挂了的时候,keepalived能够探测到,会自动的进行故障转移,将流量自动迁移到shadow-db-master,由于使用的是相同的virtual IP,这个切换过程对调用方是透明的。 

总结 

高可用HA(High Availability)是分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计减少系统不能提供服务的时间。 

方法论上,高可用是通过冗余+自动故障转移来实现的。 

整个互联网分层系统架构的高可用,又是通过每一层的冗余+自动故障转移来综合实现的,具体的: 
(1)【客户端层】到【反向代理层】的高可用,是通过反向代理层的冗余实现的,常见实践是keepalived + virtual IP自动故障转移 
(2)【反向代理层】到【站点层】的高可用,是通过站点层的冗余实现的,常见实践是nginx与web-server之间的存活性探测与自动故障转移 
(3)【站点层】到【服务层】的高可用,是通过服务层的冗余实现的,常见实践是通过service-connection-pool来保证自动故障转移 
(4)【服务层】到【缓存层】的高可用,是通过缓存数据的冗余实现的,常见实践是缓存客户端双读双写,或者利用缓存集群的主从数据同步与sentinel保活与自动故障转移;更多的业务场景,对缓存没有高可用要求,可以使用缓存服务化来对调用方屏蔽底层复杂性 
(5)【服务层】到【数据库“读”】的高可用,是通过读库的冗余实现的,常见实践是通过db-connection-pool来保证自动故障转移 
(6)【服务层】到【数据库“写”】的高可用,是通过写库的冗余实现的,常见实践是keepalived + virtual IP自动故障转移 

开源:minglisoft.cn/technology   扣扣 2042849237

jeesz分布式架构平台介绍

1.项目核心代码结构截图  <!--jeesz工具jar--><module>jeesz-utils</module><!--jeesz公共配置jar--><module>jeesz-config</module><!--jeesz核心框架jar--><module>jeesz-fr 查看详情

jeesz分布式架构平台介绍

1.  项目核心代码结构截图 <!--jeesz工具jar-->     <module>jeesz-utils</module>     <!--jeesz公共配置jar-->   &nbs 查看详情

jeesz分布式架构平台介绍

1.  项目核心代码结构截图 <!--jeesz工具jar-->     <module>jeesz-utils</module>     <!--jeesz公共配置jar-->   &nbs 查看详情

jeesz分布式架构平台介绍

1.  项目核心代码结构截图 <!--jeesz 工具jar-->      <module>jeesz-utils</module>      <!-- jeesz 公共配置j 查看详情

jeesz分布式架构平台介绍

摘要:Jeesz提供了常用工具进行封装,包括日志工具、缓存工具、服务器端验证、数据字典、当前组织机构数据(用户、机构、区域)以及其它常用小工具等。另外还提供一个强大的在线代码生成工具,此工具提供简单的单表、一... 查看详情

jeesz分布式架构

...企业快速定制化业务。以下是我为公司规划的大型互联网分布式企业微服务云架构: &nbs 查看详情

高可用的分布式系统架构探讨

...正常访问。正常提供对外服务。因为大型网站的复杂性,分布式,廉价服务器,开源数据库,操作系统等特点。要保证高可用是很困难的,也就是说网站的故障是不可避免的。如何提高可用性,就是需要迫切解决的问题。首先,... 查看详情

jeesz分布式架构

...一系列框架的有序集合。利用SpringBoot的开发模式简化了分布式系统基础设施的开发,如服务发现、注册、配置中心、消息总线、负载均衡、断路器、数据监控等(这里只简单的列了一部分),都可以用SpringBoot的开发风格做到一... 查看详情

jeesz分布式架构-restful服务

 摘要:REpresentationalStateTransfer(REST) 是一种架构原则,其中将 web 服务视为资源,可以由其 URL 唯一标识。RESTfulWeb 服务的关键特点是明确使用 HTTP 方法来表示不同的操作的调用。REST 的基本设计... 查看详情

jeesz分布式架构-restful服务

1.REST介绍REpresentationalStateTransfer(REST) 是一种架构原则,其中将 web 服务视为资源,可以由其 URL 唯一标识。RESTfulWeb 服务的关键特点是明确使用 HTTP 方法来表示不同的操作的调用。REST 的基本设计... 查看详情

如何设计出高可用的分布式架构

在分布式架构中,SOA和微服务架构是最常见的两种分布式架构,而且目前服务网格的概念也越来越火了,我们就先从这些常见的架构开始。SOA架构解析SOA全称是:ServiceOrientedArchitecture,中文释义为“面向服务的架构”。它是一种... 查看详情

搭建jeesz分布式架构9--消息中间件简介

...息中间件简介1.     消息中间件在JEESZ分布式架构中的作用1)    消息中间件在分布式系统中完成消息的发送和接收。2)    消息中间件可利用高效可靠的消息传递机制进行平台无关的... 查看详情

搭建jeesz分布式架构7--zookeeper注册中心安装

   ZooKeeper是一个分布式开源框架,提供了协调分布式应用的基本服务,它向外部应用暴露一组通用服务——分布式同步(DistributedSynchronization).命名服务(NamingService).集群维护(GroupMaintenance)等,简化分布式应用协... 查看详情

搭建jeesz分布式架构7--zookeeper注册中心安装

ZooKeeper是一个分布式开源框架,提供了协调分布式应用的基本服务,它向外部应用暴露一组通用服务——分布式同步(DistributedSynchronization).命名服务(NamingService).集群维护(GroupMaintenance)等,简化分布式应用协调及其管理的... 查看详情

汇总

前言(1):服务端高并发分布式架构演进之路前言(2):什么是微服务?前言(3):分布式的坑1.大型网站架构演化2.大型网站架构演化的价值观3网站架构设计误区4网站架构模式5大型网站核心架构要素6网站性能测试7Web前端性能优化8应... 查看详情

高性能高可用的分布式架构体系(转)

...服务、云计算、移动互联网领域,专业的云平台服务里,分布式技术为支撑平台正常运作关键性技术。从商业利润和运维成本角度出发,千方百计榨干服务器的每一分性能很大程度上影响着网站的商业价值,因此对性能的追求,... 查看详情

tidb分布式高可用架构

 架构图:650)this.width=650;"src="http://s4.51cto.com/wyfs02/M01/8A/55/wKiom1gtcCWhUUA6AAAiJCTEifk249.png-wh_500x0-wm_3-wmp_4-s_250024448.png"title="aaa.png"alt="wKiom1gtcCWhUUA6AAAiJCTEifk249.png-wh 查看详情

jeesz分布式架构集成阿里云oss存储

1.服务接口定义/***文件上传 1:头像2:显示图片3:个人封面 :4:基础图片*@paramrequest*@paramresponse*@paramuid用户id*@paramuserType文件上传 1:头像2:显示图片3:个人封面 :4:基础图片0:视频*@paramfiles上传的文件对象*@return*... 查看详情