究竟啥才是互联网架构“高可用”

转载自 究竟啥才是互联网架构“高可用”

 一、什么是高可用

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

假设系统一直能够提供服务,我们说系统的可用性是100%

如果系统每运行100个时间单位,会有1个时间单位无法提供服务,我们说系统的可用性是99%

很多公司的高可用目标是49,也就是99.99%,这就意味着,系统的年停机时间为8.76个小时。

百度的搜索首页,是业内公认高可用保障非常出色的系统,甚至人们会通过www.baidu.com 能不能访问来判断“网络的连通性”,百度高可用的服务让人留下啦“网络通畅,百度就能访问”,“百度打不开,应该是网络连不上”的印象,这其实是对百度HA最高的褒奖。

 

二、如何保障系统的高可用

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

保证系统高可用,架构设计的核心准则是:冗余。

有了冗余之后,还不够,每次出现故障需要人工介入恢复势必会增加系统的不可服务实践。所以,又往往是通过“自动故障转移”来实现系统的高可用

接下来我们看下典型互联网架构中,如何通过冗余+自动故障转移来保证系统的高可用特性。

 

三、常见的互联网分层架构


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

1客户端层:典型调用方是浏览器browser或者手机应用APP

2反向代理层:系统入口,反向代理

3站点应用层:实现核心应用逻辑,返回html或者json

4服务层:如果实现了服务化,就有这一层

5数据-缓存层:缓存加速访问存储

6数据-数据库层:数据库固化数据存储

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


四、分层高可用架构实践

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


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

 


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

 

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


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

 


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

 

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


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

 


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

 

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


【服务层】到【缓存层】的高可用,是通过缓存数据的冗余来实现的。

缓存层的数据冗余又有几种方式:第一种是利用客户端的封装,servicecache进行双读或者双写。

 


缓存层也可以通过支持主从同步的缓存集群来解决缓存层的高可用问题。

redis为例,redis天然支持主从同步,redis官方也有sentinel哨兵机制,来做redis的存活性检测。

 


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

 

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

这类允许“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,这个切换过程对调用方是透明的。

 

五、总结

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

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

整个互联网分层系统架构的高可用,又是通过每一层的冗余+自动故障转移来综合实现的,具体的:

1)【客户端层】到【反向代理层】的高可用,是通过反向代理层的冗余实现的,常见实践是keepalived + virtual IP自动故障转移

2)【反向代理层】到【站点层】的高可用,是通过站点层的冗余实现的,常见实践是nginxweb-server之间的存活性探测与自动故障转移

3)【站点层】到【服务层】的高可用,是通过服务层的冗余实现的,常见实践是通过service-connection-pool来保证自动故障转移

4)【服务层】到【缓存层】的高可用,是通过缓存数据的冗余实现的,常见实践是缓存客户端双读双写,或者利用缓存集群的主从数据同步与sentinel保活与自动故障转移;更多的业务场景,对缓存没有高可用要求,可以使用缓存服务化来对调用方屏蔽底层复杂性

5)【服务层】到【数据库“读”】的高可用,是通过读库的冗余实现的,常见实践是通过db-connection-pool来保证自动故障转移

6)【服务层】到【数据库“写”】的高可用,是通过写库的冗余实现的,常见实践是keepalived + virtual IP自动故障转移

 

末了,希望文章的思路是清晰的,希望大家对高可用的概念和实践有个系统的认识,感谢大家。

==【完】==


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/331101.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

maven(3)maven3.3.9使用入门

【0】README1)maven 安装step1)检查 jdk 是否安装且 环境变量 JAVA_HOME 是否设置;step2)download maven: https://maven.apache.org/download.cgi?Preferredftp://mirror.reverse.net/pub/apache/step3)…

TCP接入层的负载均衡、高可用、扩展性架构

转载自 TCP接入层的负载均衡、高可用、扩展性架构 一、web-server的负载均衡 互联网架构中,web-server接入一般使用nginx来做反向代理,实施负载均衡。整个架构分三层: 上游调用层,一般是browser或者APP 中间反向代理层&#xff…

使用poi统计工作职责

1 创建一个新的sheet工作页 Sheet job workbook.createSheet("工作职责统计"); 2 查询工作职责问题选项列表&#xff0c;并设置第一行倒出时间 List<Syslistconfig> listconfigs syslistconfigDao.listConfig(29); //工作职责问题选项列表job.createRow(0)…

漫画:什么是字典序算法

转载自 漫画&#xff1a;什么是字典序算法&#xff1f;算法题目&#xff1a; 给定一个正整数&#xff0c;实现一个方法来求出离该整数最近的大于自身的“换位数”。 什么是换位数呢&#xff1f;就是把一个整数各个数位的数字进行全排列&#xff0c;从而得到新的整数。例如53241…

mybatis_user_guide(2)mybatis3.4.0快速入门

【0】README0&#xff09;以下部分内容转自&#xff1a;“mybatis v.3.4.0 User Guide”&#xff1b;1&#xff09;本文旨在梳理 如何 构建 mybatis 环境&#xff0c;与 db 连接&#xff0c;且采用 JUnit 搭建其测试用例&#xff1b;2&#xff09;本文的环境配置都是基于纯 my…

jQuery中的几个案例:隔行变色、复选框全选和全不选

1 表格隔行变色 1 技术分析&#xff1a; 1 &#xff09;基本过滤选择器&#xff1a; odd: even: 2 &#xff09;jq添加和移除样式&#xff1a; addClass(); removeClass(); 2 代码实现 <script src"js/jquery1.11.3/jquery.min.js" type"text/javasc…

从 Linux 源码看 Socket 的阻塞和非阻塞

转载自 从 Linux 源码看 Socket 的阻塞和非阻塞笔者一直觉得如果能知道从应用到框架再到操作系统的每一处代码&#xff0c;是一件Exciting的事情。大部分高性能网络框架采用的是非阻塞模式。笔者这次就从linux源码的角度来阐述socket阻塞(block)和非阻塞(non_block)的区别。 本…

pojo和javabean的区别

【0】README 1&#xff09;本文转自&#xff1a; http://wenku.baidu.com/view/eba89bbcf121dd36a32d828a.html 【1】正文如下&#xff1a; POJO 和JavaBean是我们常见的两个关键字&#xff0c;一般容易混淆&#xff0c;POJO全称是Plain Ordinary Java Object / Pure Old Jav…

使用poi调整字体格式、添加单元格注释、自动调整列宽

1 创建新的工作铺 import java.io.FileOutputStream;import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFCellStyle; import org.apache.poi.hssf.usermodel.HSSFFont; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apa…

MySQL 的索引是什么?怎么优化?

转载自 MySQL 的索引是什么&#xff1f;怎么优化&#xff1f; 摘要: 索引对大数据的查询速度的提升是非常大的&#xff0c;Explain可以帮你分析SQL语句是否用到相关索引。 索引类似大学图书馆建书目索引&#xff0c;可以提高数据检索的效率&#xff0c;降低数据库的IO成本。My…

maven(5)坐标和依赖

【0】README1&#xff09;本文部分文字转自 “maven实战”&#xff0c;旨在 review “maven(5)坐标和依赖” 的相关知识&#xff1b;【2】坐标详解 1&#xff09;intro&#xff1a;坐标用于定位 类库&#xff0c;而一组maven 坐标通过一些元素来进行定义的&#xff1a;groupId…

poi中文api文档

POI中文API文档 一、 POI简介 Apache POI是Apache软件基金会的开放源码函式库&#xff0c;POI提供API给Java程序对Microsoft Office格式档案读和写的功能。二、 HSSF概况 HSSF 是Horrible SpreadSheet Format的缩写&#xff0c;通过HSSF&#xff0c;你可以用纯Java代码来读取、…

聊聊MyBatis缓存机制

转载自 聊聊MyBatis缓存机制前言MyBatis是常见的Java数据库访问层框架。在日常工作中&#xff0c;开发人员多数情况下是使用MyBatis的默认缓存配置&#xff0c;但是MyBatis缓存机制有一些不足之处&#xff0c;在使用中容易引起脏数据&#xff0c;形成一些潜在的隐患。个人在业务…

maven(6)仓库

【0】README1&#xff09;本文部分文字转自 “maven实战”&#xff0c;旨在 review “maven(6)仓库” 的相关知识&#xff1b; 【1】何为 Maven仓库1&#xff09;intro to 构件&#xff1a;在maven中&#xff0c;任何一个依赖&#xff0c;插件或者项目构建的输出&#xff0c;都…

防止用户重复提交表单数据,session方式,js方式

1. 使用session的方式创建Token令牌解决 创建一个生成令牌的工具类&#xff0c;在该类中有返回类的对象&#xff0c;生成token的方法public class TokenUtil {/**单例设计模式&#xff08;保证类的对象在内存中只有一个&#xff09;*1、把类的构造函数私有*2、自己创建一个类的…

mybatis_user_guide(3)XML配置

【-1】README1&#xff09;本文全文总结于 http://www.mybatis.org/mybatis-3/zh/configuration.html#environments【0】MyBatis 的配置文件包含了影响 MyBatis 行为甚深的设置&#xff08;settings&#xff09;和属性&#xff08;properties&#xff09;信息。文档的顶层结构如…

easyUI 运用窗口和form表单制作导出功能

这里运用到easyUI的窗口模式和form表单的提交制作一个有条件的导出excel数据统计的功能&#xff0c;主要是知道了怎么运用easyUI的窗口和表单 jsp中&#xff1a;<!-- 导出数据来源条件窗口 --><div id"exportSign" ><form id"condition" me…

分布式一致性算法:可能比你想象得更复杂

转载自 分布式一致性算法&#xff1a;可能比你想象得更复杂分布式系统的难题张大胖遇到了一个难题。他们公司的有个服务器&#xff0c;上面保存着宝贵的数据&#xff0c;领导Bill 为了防止它挂掉&#xff0c; 要求张大胖想想办法把数据做备份。张大胖发挥了抽象的能力&#xff…

mybatis_user_guide(4) Mapper XML 文件

【-1】README 1&#xff09;本文全文总结于 http://www.mybatis.org/mybatis-3/zh/sqlmap-xml.html【0】SQL 映射文件有很少的几个顶级元素&#xff08;按照它们应该被定义的顺序&#xff09;&#xff1a; cache – 给定命名空间的缓存配置。cache-ref – 其他命名空间缓存配置…

Hibernate关联关系配置(一对多、一对一和多对多)

第一种关联关系&#xff1a;一对多&#xff08;多对一&#xff09; “一对多”是最普遍的映射关系&#xff0c;简单来讲就如消费者与订单的关系。 一对多&#xff1a;从消费者角的度来说一个消费者可以有多个订单&#xff0c;即为一对多。 多对一&#xff1a;从订单的角度来…