一、什么是高可用

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

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

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

很多公司的高可用目标是4个9,也就是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,这个切换过程对调用方是透明的。

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


【反向代理层】到【站点层】的高可用,是通过站点层的冗余来实现的。假设反向代理层是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自动故障转移

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

==【完】==

【转自】58沈剑 架构师之路

转载于:https://www.cnblogs.com/bad-man/p/7837203.html

【转载】究竟啥才是互联网架构“高可用”相关推荐

  1. 【 58沈剑 架构师之路】究竟啥才是互联网架构“高并发”

    2019独角兽企业重金招聘Python工程师标准>>> 一.什么是高并发 高并发(High Concurrency)是互联网分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设 ...

  2. 究竟啥才是互联网架构“高并发”

    为什么80%的码农都做不了架构师?>>>    一.什么是高并发 高并发(High Concurrency)是互联网分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计保证系 ...

  3. 互联网架构“高并发”

    互联网架构"高并发" 一.什么是高并发 高并发(High Concurrency)是互联网分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计保证系统能够同时并行处理很多请 ...

  4. 后端架构高可用可伸缩

    Reference: https://www.cnblogs.com/liuroy/p/6537660.html 后端架构高可用可伸缩 去年参加技术分享活动,七牛的一个技术简要的介绍了一些高可用可伸缩 ...

  5. 六、系统架构 - 高可用架构设计

    目录 网站可用性 可用性度量 如何计算可用性? 如何实现高可用? 高可用的网站架构 高可用的应用层 通过负载均衡进行无状态应用的失效转移 有状态应用集群的Session管理 高可用的服务层 高可用的数 ...

  6. 架构师之路 — 部署架构 — 高可用集群 — N+1 高可用模型

    目录 文章目录 目录 前言 高可用集群架构 高可用集群模型模型 N+1 模型 N+1 模型关键技术 单进程多定时器的设计 冗余节点快速切换技术 服务器池多级检测机制 前言 本地是对论文<服务器池 ...

  7. 亿级流量电商详情页系统实战:缓存架构+高可用服务架构+微服务架构

    <缓存架构+高可用服务架构+微服务架构>深入讲解了亿级流量电商详情页系统的完整大型架构.同时最重要的是,在完全真实的大型电商详情页系统架构下,全流程实战了整套微服务架构,包含了基于领域驱动 ...

  8. 综合架构-高可用服务

    综合架构-高可用服务 高可用服务介绍说明 高可用服务工作原理 如何实现部署高可用服务 高可用keepalived服务部署流程 高可用服务企业应用 高可用服务常见异常问题 ----脑裂问题 如何实现ke ...

  9. 互联网架构“高并发”解决思路

    2020年没写过啥内容,做一下知识回顾吧,标题可能有点"标题党",见谅. 高并发的简易理解:保证系统能够同时并行处理的很多的请求. 高并发,高可用,高效率三个名词是个有侧重.简称& ...

最新文章

  1. IDEA创建方法时快速添加注释
  2. fastcgi pass php-fpm,Nginx中fastcgi_pass的配置问题
  3. 笔记 — 动画效果(Css3)
  4. java反射 虚拟机优化_面试官问我:Java反射是什么?我回答竟然不上来......
  5. java多线程模拟实现12306售票
  6. 法布里斯·贝拉:一个人就是一支队伍
  7. git commit -m 'comment' 遇到 'npm' 不是内部或外部命令,也不是可运行的程序 或批处理文件。
  8. HDU2030 汉字统计【入门】
  9. 二:SpringMVC知识整理
  10. 绿盟科技网络安全威胁周报2017.02 请关注Microsoft Edge远程权限提升漏洞 CVE-2017-0002...
  11. java内嵌浏览器插件
  12. DM7 达梦数据库 物理备份 相关概念说明
  13. Android屏幕、坐标系、Padding、Margin
  14. 防护等级 ipx9、ipx9k、ip69、ip69k之间的区别
  15. 惠普m128fn中文说明书_惠普M128fn使用教程
  16. 抓包|获取移动app里的数据,什么是抓包?
  17. openwrt支持wpa3加密
  18. 小码农的代码(一)----------SpringJDBC的使用
  19. Google 最大数据中心发生爆炸,三名技术人员受伤
  20. PyQt5_pyqtgraph蜡烛图

热门文章

  1. 苏宁云仓投入使用,此时物流爆发是否来得及?
  2. 高质量的友谊总是发生在两个优秀的独立人格之间
  3. @include与jsp:include的区别
  4. 巨人网络开发工程师试题
  5. 修改mysql表结构语句
  6. [转]Sandcastle初探——官方版的NDoc
  7. 必看,经典sql面试题(学生表_课程表_成绩表_教师表)
  8. [C#]用HttpWebRequest加载证书建立SSL通道时发生异常的解决办法
  9. Linux 日志系统详解
  10. 提升磁盘IO性能的几个技巧