架构师训练营第 2 期 第 11 周总结
高可用
要能快速暴露问题。
目标明确,到底要什么样的高可用,具体的高可用目标会有相对应的解决方法。
成本与收益的平衡。
可用性指标
业界用多少个 9 衡量网站可用性,大部分网站目标是维持在 99.99%
可用性指标通常用年度作为时间单位
网站年度可用性指标 = (1-网站不可用时间/年度总时间)* 100%
故障时间 = 故障修复时间点 - 故障发现时间点
高可用故障考核体系
故障分管理(权重),比如每个小组分发一定的积分,作为容许出现故障的场景,出现故障进行相应的扣除。
事故级故障(100): 网站不可用
A 类故障(20):访问不流畅,核心功能不可用
B 类故障(5):非核心功能不可用,或核心功能上的不可用影响到了少数用户
C 类故障(1): 以上故障以外的故障
引起故障的原因:硬件故障、软件 BUG,系统发布,并发压力,网络攻击、外部灾害
解耦
高内聚、低耦合的组件设计原则
面向对象基本设计原则
面向对象的设计模式
领域驱动设计建模
隔离
隔离首先依赖于解耦,按业务层面上划分,在物理层面上(部署在不同的服务器)实现隔离
具体有
业务与子系统隔离:部分子系统的崩溃不能去影响到其他不相关的功能。
微服务与中台架构:子系统更细粒度的拆分,且能做集群,能容灾备份,即使挂了部分微服务,不影响服务的整体可用,不影响到用户。
生成者与消费者隔离:生产者与消费者部署在不同的服务器上,使用分布式消息队列(隔离开),如果一方出现故障不会影响到另一方。
虚拟机与容器隔离:不同的业务可部署在不同的虚拟机里,如果某个虚拟机内的进程抛出了会停止运行的 BUG(比如 OOM),则不会影响其他虚拟机上的业务,容器同理。
异步
多线程编程:单一线程的故障不影响其他线程,也是把故障隔离开
反应式编程:依赖异步消息传递机制,组件解耦,故障单独处理。
异步通信网络编程:避免网络阻塞降低网络可用性
事件驱动异步架构:利用了消息队列达成生成者与消费者隔离的效果。
备份
集群设计:多台服务器,用来应对部分服务器宕机的场景
数据库复制:应付数据库压力过大,以及数据库服务器宕机等场景,
失效转移:当系统监控到某台服务器宕机,要把前往该服务器的请求,转移到其他服务器上。
比如数据库主主失效转移,负载均衡失效转移。
幂等
因网络波动、调用、失效转移等会出现操作命令重发的场景,要小心考虑是否需要进行幂等性处理。
事务补偿
1、在单台服务器以及单台数据库服务器的操作时,如出现问题,通过传统事务回滚到事务前的状态
2、在分布式环境下,可能业务操作在不同的服务器,不同的数据库连接,甚至不同的数据库,分布式事务有时候过于繁重,此时需要依赖业务逻辑上的逆操作,来补偿。
重试
当出现长时间未收到请求时,上级调用者可能需要重新调用。同时,上级的超时时间要大于下级操作时间之和。
熔断
服务(上某个方法)出现故障到一定程度,如单位时间内出错达到 50%,宣告该服务不可用,熔断器打开,调用该方法上的熔断方法去执行。过段时间尝试发送请求,判断是否维持熔断器开关打开状态。
限流
系统访问量超过系统承受能力,需要对请求进行限制,即需要抛弃部分用户请求,影响部分用户的使用。限流的方法:计数器算法(固定窗口、滑动窗口)、令牌桶算法,漏桶算法。
自适应限流,自动采集 QPS,控制流量限制指标,保持性能的最合适的场景,并且有利于代码的测试与维护。
降级
非核心的功能可能有承担较大的压力,当整体系统压力上来时,可以把这些功能占用的资源让给其他功能。
异地多活
因自然灾害或生产事故等不可抗力导致的不可用,异地备份系统维持系统整体可用。难度时保持数据的同步时,成本与性能的取舍。
更新集群服务步骤
自动化测试
Selenium 可完成 WEB 测试与浏览器兼容测试
自动化部署
开发者提交代码,被检测到,运行单元测试,通过后编译组装一个可部署的文件,重新部署/创建开发环境,进行集成测试,重新部署/创建生产环境。
预发布验证
通过自动化验证,回归验证,还是担心会出现问题,比较开发环境与线上不同。那么可以准备一个预发布环境,配置是真实的环境,但入口只开放给公司内部。
代码版本控制
主干开发,分支发布: 代码修改都在主干上进行,需要发布,拉取分支,分支出现 bug,修改分支,成功后合回主干。
分支开发,主干发布:主干上拉取分支,分支开发测试完上线,再合回主干。容易出现代码冲突,所以分支要经常从主干上拉取代码
自动化发布
提交发布请求,QA、安全、DBA 确认,代码合并,预发布验证,正式发布
灰度发布
不一次性发布完所有的服务器,分批次发布,先观察几天,如有故障,回滚的量可控,不至于整体回滚。
网站运行监控
实时监控指标完善,并有快速报警机制,最好有故障邮件、短信等通知值班人员。
用户行为日志收集:可以用来个性化营销,方法有服务端日志收集,客户端浏览器日志收集。
自动控制:如上面提及过的熔断与限流等方法
评论