高可用性指你提供的服务要始终可用, 不管天灾(停电, 断网, 磁盘空间满, 服务器硬件损坏等), 人祸(软件bug, 黑客破坏, 误操作等), 甚至地震, 洪水抑或战争.

高可性性的指标就是可用时间与总时间之比

availability = uptime/(uptime + downtime)

现在普遍要求可用性至少达到两个九, 最好在四个九以上, 也就是说你的服务要达到如下要求

为了达到高可用性, 必须在设计, 实现, 运维等各个方面着手, 才到达到随时可用的目标.
根据我的经验, 分以下三个方面来谈谈

高可用性设计
高可用性实现
高可用性运维

高可用性和高扩展性相关, 另外再深谈关于扩展性的话题
高可用性设计
高可用的不二法宝是冗余, 也就是说, 为了避免单点失败(Single Point Failure), 会增加一到多个点, 而且最好放在不同的物理位置, 降低多点失败的概率.
具体来说, 服务器之间的关系有主从(primary/slave)关系, 主主(active-active)关系.
再细分的话有一主多仆, 多主多仆, 对等自治等关系, 是一个服务器集集群还是多个服务器集群.
举例来说, 我有一个聊天服务器, 提供公司内部的机密对话聊天服务
通过 Web App 经 Web Socket 通过 TLS 和服务器进行通讯.
这台服务器放在北京总部, 时而由于断网和断电造成服务器不可用, 于是我又增加了一台服务器, 为避免总部大厦停电可能造成其他分公司的服务不可用, 后来又在上海分公司搭建了两台服务器. 最终的拓扑结构如下:
数据存储采用 Cassandra , LoadBalancer 用 HAProxy, ChatService 是自己写的应用服务器, 数据存储采用Cassandra

这个架构符合了基本的高可用性要求, 没有单点失败, 数据通过Cassandra 进行存储, 并且进行内部及跨区域的数据同步.
高可用性的关键难点在于状态同步和一致性要求, 上例中采用的 Cassandra 只能保证最终一致性, 要是用于支付结算系统, 会有点问题.
Cassandra 看起来很美, 它不象MySQL, 结点之间没有主从之分, 均为可读可写, 高度可扩展, 可是实际应用起来, 在大数据量, 高并发请求的场景下经常出现读取数据超时的情况
避免单点失败是基本要求,要达到两个九以上,这还远远不够。
当大量用户请求峰值来临时,极有可能由于压力过大,造成整个系统不可用,这时候,要么按需扩展增加服务器,存储器等资源,要么让服务降级或变慢,也要保持整个系统的可用。
要尽可能地自动化,在重大故障和紧急时刻也要能及时通知运维工程师进行快速反应和故障恢复。有道是,隐患险于明火,防范胜于胜于救灾,责任重于泰山,在技术和非技术层面都要做好预案,做足功课,有备无患。
基本度量 metrics, 我们可以做如下的基本功课

分流
使用反向代理, 负载均衡器将负载均匀分配给多个微服务器实例, 简单场景下使用简单的 round-robbin 策略就够了.
复杂的情况下必须参照各个微服务实例上的负载情况做分流
限流
每个实例的负载是一定的, 如果负载过高, 超过了其处理能力, 可能会造成整个系统不可用的状况.
对于特定用户, IP和组织, 我们最好设定一个上限的阀值, 根据metrics 统计, 如果超过这个阀值可以返回错误码(429)让其过会儿重试(retry-after)
断流
当某个实例持续出现问题, 与其超时, 失败, 再不断重试, 不如直接断开, 过会儿再尝试访问它, 这个在断路器模式再详细讨论
这个断路器的打开和关闭也是基于 metrics

高可用性实现
设计要为失败而设计, 在实现时要处处考虑失败的可能性, 比如异常关机, 内存耗尽了, 磁盘满了, 网断了, 以及安全性考虑, 防止可能的恶意攻击和破坏.
安全方面的 AAA认证, 授权, 审计, 防止SQL 注入, 跨域攻击, 在 [微服务实战之安全性] 详述.
我们在编程开发中要牢记三点

容错
防错
纠错

容错
所谓容错性开发,是指在系统某些模块或外部依赖出错的情况下,系统依然能保持基本可用
比如

网络连接断开了或不可达,进行重试直至恢复
内存不够用了, 就序列化到一部分到磁盘上后释放一部分内存
某个外部服务不可用, 给予用户友好提示并提供备选方案

防错
而防错性开发是指预先采取措施防止错误, 比如对于输入参数的有效性及合法性检查, 数据存储总有冗余和备份, 这是实现高用性的重点, 其中尤其要注意

防止资源耗尽.

在内存, CPU, 磁盘, 带宽, 数据库等外部资源的使用上, 必须牢记资源有借有还, 切勿任意无节制的使用.
常见的有错误有

  1. 内存泄漏
  2. 文件句柄泄漏
  3. 内部集合增长过快, 删除过慢
  4. 网络或数据库连接泄漏
  5. 栈空间溢出
  6. 无节制的创建线程
  7. 不当的循环造成的CPU繁忙
  8. 某些异常导致的 log过多且没有 rotate ,从而把磁盘写满

对请求频率加以限制 Rate Limit

对于超过规定的频率和数量的请求, 服务器会对特定的客户端暂停或降级服务,防止局部问题影响整个系统的稳定。

加强欺诈检测和保护 Fraud detection and protection

对于可疑的请求和客户端定义按既有策略进行检测和保护, 比如对于单位时间内来自某个IP地址或者某个帐号的超量请求, 异常密码尝试, 异常越权尝试进行暂时锁定
纠错
纠错性开发是指预先设置错误处理预案,制订应急响应, 比如在上线新版本出现重大bug时,在至多几分钟内就能迅速回滚至上个版本, 或者可以迅速关掉引起错误某个功能开关
在系统中定义了一些告警阀值,并设置回调,一旦触发警报,即进入紧急状态,采取紧急措施
如磁盘剩余空间预警,则自动清理一周之前的日志数据,并呼叫值班人员紧急待命,或者增加磁盘空间或挂接新磁盘
如发现下游所依赖的服务响应太慢或如发现日志中某一类错误超过阀值,则立即触发告警和自动分析程序, 提醒值班人员排查原因并给予解决
并且要支持自动和手动故障恢复 Auto fallback and manual fallback, 对于单点失败零容忍

单个服务器挂掉无所谓
单个机房挂掉无所谓
单个数据中心挂掉无所谓
单个地区中的服务挂掉无所谓

具体来说就是提供足够的冗余备份.
基于HTTP Restful 的无状态服务可以充分利用dns, load balance 的相应的功能
而一些基于长连接的有状态服务,dns不管用,LB的支持也有缺陷,可能需要应用程序自己来设计实现服务的 Failover
高可用性运维
基本要求是按需求快速恢复故障,快速部署或回滚服务,从容应对各种突发事件,快速解决各种软硬件故障,一句话,又快又稳,安全第一.
基本手段有:

  1. 实时监控和度量 Monitor and metrics

每台服务器和重特性都有足够的监控和度量, 比如常规的健康检查 Health Check , 可以每分钟做一次, 比较简单的做法是服务提供health check 和接口或API, 通过调用这些API并检查其结果来判断服务是否可用, 是否需要做服务切换.

实时产线自动化测试

有一些基于TCP或UDP的心跳检查, 基于SNMP 事件的监控机制, 个人觉得 TaP( Test Against Production) 产线自动化功能测试最有针对性, 检查的粒度最细, 也最能发现一些深层次的问题
比如挑出一些比较重要和稳定的自动化测试用命, 在系统的某个闲时, 直接在产品线上运行一系列有针对性的测试

定时进行常规化维护

比如定期对日志文件进行归档, 清理无用文件和数据库记录, 定时重启服务器以防止细微的内存泄漏和内存碎片等等

灾难 Disaster Recover

在遇到突发的重大软硬件故障时, 及时进行灾难恢复, 将服务切换到备份服务器, 集群或数据中心上

感兴趣可以加Java架构师群获取Java工程化、高性能及分布式、高性能、深入浅出。高架构。性能调优、Spring,MyBatis,Netty源码分析和大数据等多个知识点高级进阶干货的直播免费学习权限 都是大牛带飞 让你少走很多的弯路的 群…号是:855801563 对了 小白勿进 最好是有开发经验

注:加群要求

1、具有工作经验的,面对目前流行的技术不知从何下手,需要突破技术瓶颈的可以加。

2、在公司待久了,过得很安逸,但跳槽时面试碰壁。需要在短时间内进修、跳槽拿高薪的可以加。

3、如果没有工作经验,但基础非常扎实,对java工作机制,常用设计思想,常用java开发框架掌握熟练的,可以加。

4、觉得自己很牛B,一般需求都能搞定。但是所学的知识点没有系统化,很难在技术领域继续突破的可以加。

5.阿里Java高级大牛直播讲解知识点,分享知识,多年工作经验的梳理和总结,带着大家全面、科学地建立自己的技术体系和技术认知!

微服务实战之高可用性相关推荐

  1. SpringCloud Alibaba微服务实战(七) - 路由网关(Gateway)全局过滤

    说在前面 全局过滤器作用于所有的路由,不需要单独配置,我们可以用它来实现很多统一化处理的业务需求,比如权限认证,IP 访问限制,监控,限流等等. 创建路由网关(Gateway)启动服务cloud-ac ...

  2. SpringCloud Alibaba微服务实战(五) - Sentinel实现限流熔断

    什么是Sentinel? 请查看文章:SpringCloud Alibaba微服务实战(一) - 基础环境搭建 构建服务消费者cloud-sentinel进行服务调用 服务创建请查看文章:Spring ...

  3. SpringCloud Alibaba微服务实战(四) - Nacos Config 配置中心

    说在前面 Nacos 是阿里巴巴开源的一个更易于构建云原生应用的动态服务发现.配置管理和服务管理平台.Nacos Config就是一个类似于SpringCloud Config的配置中心. 一.启动N ...

  4. SpringCloud Alibaba微服务实战(三) - Nacos服务创建消费者(Feign)

    什么是Feign Feign 是一个声明式的伪 Http 客户端,它使得写 Http 客户端变得更简单.使用 Feign,只需要创建一个接口并注解.它具有可插拔的注解特性,可使用 Feign 注解和 ...

  5. Spring Cloud 微服务实战笔记

    Spring Cloud 微服务实战笔记 微服务知识 传统开发所有业务逻辑都在一个应用中, 开发,测试,部署随着需求增加会不断为单个项目增加不同业务模块:前端展现也不局限于html视图模板的形式,后端 ...

  6. 微服务实战(六):选择微服务部署策略

    http://dockone.io/article/1066 微服务实战(六):选择微服务部署策略 [编者的话]这篇博客是用微服务建应用的第六篇,第一篇介绍了微服务架构模板,并且讨论了使用微服务的优缺 ...

  7. 微服务接入oauth2_SpringCloud微服务实战系列(十九)Ouath2在真实场景中的应用之客户端接入(第一种写法)...

    SpringCloud微服务实战系列(十九)Ouath2在真实场景中的应用之客户端接入(第一种写法) 一.概述 在<SpringCloud微服务实战系列(十七)Ouath2在真实场景中的应用之资 ...

  8. controller调用controller的方法_SpringCloud Alibaba微服务实战三 - 服务调用

    导读:通过前面两篇文章我们准备好了微服务的基础环境并让accout-service 和 product-service对外提供了增删改查的能力,本篇我们的内容是让order-service作为消费者远 ...

  9. 微服务实战(五):落地微服务架构到直销系统(构建高性能大并发系统)

    在现代系统中,特别是互联网软件,通常会涉及到大量用户的并发访问,我们的系统一定要在架构上支持高性能.大并发的访问.一个高性能的系统通常由很多的方面组成,包括数据库高性能.Web服务器高性能.负载均衡. ...

  10. .net core 微服务_.NET 微服务实战之负载均衡(上)

    (给DotNet加星标,提升.Net技能) 转自:陈珙cnblogs.com/skychen1218/p/13327965.html 系列文章 .Net微服务实战之技术选型篇 .Net微服务实战之技术 ...

最新文章

  1. 【Maven】maven的安装配置和ecplise结合
  2. 1998-1999图灵奖
  3. Linux Shell常用技巧(目录)
  4. Android开发 Butterknife使用方法总结
  5. 从甲方到乙方,如何做好混沌工程的行业化落地
  6. ECCV 2020 | 史上最强二值化网络ReActNet,精度首超ResNet
  7. I/O复用函数的使用——select
  8. org.springframework.http.converter.HttpMessageNotWritableException:
  9. anaconda要和python安装在一个目录下吗_Python开发环境配置,Anaconda的安装!
  10. 设计灵感|App中的页面空状态应该如何表现?
  11. OpenCms显示默认作者
  12. 去哪儿网前端架构师司徒正美:如何挑选适合的前端框架?
  13. 零信任是一次绝地反击
  14. 推鹿是什么?推鹿介绍,推鹿是什么平台?
  15. 红蓝对抗--sliver 搭建
  16. typora使用smms图床
  17. python取反函数_编程语言取反函数
  18. mysql火焰图_如何读懂火焰图?
  19. java和python中函数式编程
  20. mmse评估量表_简易精神状态评价量表(MMSE)

热门文章

  1. 论文笔记:Integrated Object Detection and Tracking with Tracklet-Conditioned Detection
  2. RAMOS (内存操作系统)-无忧百科(不断完善中)
  3. 思科网络实验3.5.3 vlan配置故障排除
  4. 面向对象编程中的 诡异事件
  5. HBase2.0中的Benchmark工具 — PerformanceEvaluation
  6. 2021 年职业院校技能大赛“网络安全”项目 江西省比赛任务书
  7. 18.ARP报文格式详解
  8. 定时任务管理系统 gocron
  9. github windows系统监控_辅助Windows 自带的微软五笔字型输入法,解决长期存在的7大问题...
  10. 亚马逊Rating和Review的这些区别你知多少?