一、什么是高可用

高可用HA(High 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)数据-数据库层:数据库固化数据存储

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

四、分层高可用架构实践

1.客户端层->反向代理层的高可用

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

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

2. 反向代理层->站点层的高可用

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

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

3. 站点层->服务层的高可用

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

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

4. 服务层>缓存层的高可用

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

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

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

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

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

这类允许“cache miss”的业务场景,缓存架构的建议是:

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

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

5. 服务层>数据库层的高可用

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

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

服务层数据库读的高可用,是通过读库的冗余来实现的。

既然冗余了读库,一般来说就至少有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自动故障转移。

转载于:https://www.cnblogs.com/afee666/p/6930029.html

互联网高可用架构技术实践相关推荐

  1. 互联网高并发架构技术实践

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

  2. 高并发、高性能下的 会员系统[同程艺龙] — 高可用架构设计实践

    目录 会员系统[同程艺龙] - 高可用架构设计实践 ES高可用方案 ES双中心主备集群架构 ES流量隔离三集群架构 ES集群深度优化提升 会员Redis缓存方案 Redis双中心多集群架构 高可用会员 ...

  3. 异地多活高可用架构设计实践与思考

    一.引 随着业务的快速发展,对于很多公司来说,构建于单地域的技术体系架构,会面临诸如下面的多种问题:础设施的有限性限制了业务的可扩展性:机房.城市级别的故障灾害,影响服务的可持续性. 为解决遇到的这些 ...

  4. 来自滴滴、微博、唯品会、魅族、点评关于高可用架构的实践分享

    架构师小组交流会:每期选一个时下最热门的技术话题进行实践经验分享. 第二期:因为大家对全链路压测的问题比较感兴趣,因此做了一番探讨. 参与嘉宾:滴滴技术负责人彭令鹏.魅族系统架构师何伟.唯品会应用架构 ...

  5. 《MySQL性能优化和高可用架构实践》简介与推荐序

    #好书推荐##好书奇遇季#<MySQL性能优化和高可用架构实践>,京东当当天猫都有发售.腾讯云架构师宋立桓倾情奉献,定价59元,网店打折销售其实没多少钱. 互联网公司里面几乎很少有公司不用 ...

  6. 面向大规模流量活动的高可用架构实践

    分享的内容主要分为三个部分: 1.大流量活动的系统扩容评估方法 2.系统高可用架构设计实践 3.大规模流量活动的实践案例 大流量活动的系统扩容评估方法 大流量活动有多种形式,除了我们常见的电商大促(双 ...

  7. TA大数据分析系统的高可用架构从设计到实现

    随着大数据时代的到来,对海量数据进行数据分析,并依据分析结果进行精细化运营成为各大企业的重要课题.但大数据行业门槛高,自建平台成本高.难度大.效率低,因此企业越来越需要专业的大数据分析工具. 针对市场 ...

  8. 技术分享:从双11看实时数仓Hologres高可用设计与实践

    简介:本文将会从阿里巴巴双11场景出发,分析实时数仓面临的高可用挑战以及针对性设计. 2021年阿里巴巴双11完美落下为帷幕,对消费者来说是一场购物盛宴,对背后的业务支撑技术人来说,更是一场年度大考. ...

  9. 《MySQL性能优化和高可用架构实践》阅读总结

    文章目录 介绍 第1章 MySQL架构介绍 1.1 MySQL简介 1.2 MySQL主流的分支版本 1.3 MySQL存储引擎 1.4 MySQL逻辑架构 1.5 MySQL物理文件体系结构 第2章 ...

最新文章

  1. 微服务平台的发展趋势
  2. 真正毁掉一个人的,是“打工者心态”
  3. Android网络连接监听
  4. 23-26 Python File方法、OS文件/目录方法、异常处理、内置函数
  5. Code Complete-13/7/29
  6. NumericUpDown使用备注
  7. Golang练习题(自己认为比较不错的)
  8. idea 启动选择profiles_玩转SpringBoot 2 之项目启动篇
  9. Strings_append_学习
  10. java访问oracle集群,JAVA查询Oracle数据库集群连接字符串
  11. 深入探索Java工作原理:JVM,内存回收及其他
  12. 【BZOJ】3524: [Poi2014]Couriers
  13. js获取当前页面高度
  14. 通州十三五规划精华版:增几十万就业机会/一批地铁
  15. 大数据-浅谈hive优化
  16. 稳压二极管的原理及应用
  17. 申请Freenom免费顶级域名的正确做法
  18. 三个数相减的平方公式_小学二年级数学34个必考公式以及重难点解析
  19. java如何做网页_java怎么做一个简单网页?网页包括什么?
  20. dom4j的Element

热门文章

  1. UITableViewDataSource Protocol Reference
  2. 第十五章:交互式界面(十一)
  3. windows 2003 迁移域控制器到 windows 2008
  4. Android 性能测试之方向与框架篇
  5. Grunt的配置及使用(压缩合并js/css)
  6. Android 四大组件之一(Activity)
  7. SSISDB1:使用SSISDB管理Package
  8. 杭电2094--产生冠军(拓扑排序)
  9. C++学习之路: 前向申明
  10. 用unity3d切割图片