我在日常开发的过程中经常会遇到性能问题,为了避免遇到性能问题的时候束手无策,我总结了以下几点规律:
- 数据优先,你做一个新的系统在上线之前一定要把性能监控系统做好;
- 掌握一些性能优化工具和方法,这就需要在工作中不断的积累;
- 计算机基础知识很重要,比如说网络知识、操作系统知识等等,掌握了基础知识才能让你在优化过程中抓住性能问题的关键,也能在性能优化过程中游刃有余。
此外,在下面的内容中,我会记录一些重点内容以供参考,希望在之后的工作中能够将理论与实践结合,帮助我们更好地开展工作的同时,也进一步地提升自己的价值。
系统怎样做到高可用
如何衡量高可用?
- MTBF:Mean Time Between Failure,平均故障间隔
- MTTR:Mean Time To Repair,平均故障恢复时间
Availability = MTBF / (MTBF + MTTR)
高可用系统设计的思路
一个成熟系统的可用性需要从系统设计和系统运维两方面来做保障,两者共同作用,缺一不可
系统设计:
- failover(故障转移)
如:redis sentinel
算法:Paxos,Raft
- 调用超时控制
通过收集系统间的调用日志,比如统计 99% 的响应时间是怎样的,然后依据这个时间来指定超时时间;如果没有系统间调用日志,则需要按照经验来设置超时时间。
超时控制实际上是不让请求一直保持,而是在经过一段时间后让请求失败,释放资源给接下来的请求使用。
这对于用户来说是 有损 的,但是却是有必要的,因为它牺牲了少量的请求来保证了整体系统的可用性。
- 降级
降级是为了保证核心服务的稳定性而牺牲非核心服务的做法。
- 限流
对并发请求进行限速来保护系统。
系统运维:
- 灰度发布
- 故障演练
侧重点
- 开发
开发注重的是如何处理故障,关键词 冗余 与 取舍
冗余是指有备用节点、集群来顶替故障业务;
取舍是指丢卒保车,保障主服务的安全。
- 运维
更关注变更管理和故障演练
如何让系统更易于拓展
通过增加机器的方式来线性提高系统的处理能力,从而承担更高的流量和并发。
提升系统扩展性是很复杂的。
为何不预先考虑好使用多少台机器?
峰值流量不可控。
一般来说,我们会在业务平稳期预留 30%~50% 的冗余来应对可能带来的峰值流量。
但是一个突发事件可能导致流量 2~3 倍甚至更高。
我们需要站在整体架构的角度而不仅仅是业务服务器的角度来考虑系统的扩展性。
所以,数据库、缓存、依赖的第三方、负载均衡、交换机等等都是系统扩展时需要考虑的因素。
高可扩展性的思路
拆分:将庞杂系统拆分成独立的、有单一指责的模块。即 将复杂的问题简单化。
- 存储层的拆分
比如:数据库按照业务唯独和数据唯独进行拆分
- 业务层的拆分
比如,按照 业务纬度 、 重要性纬度、 请求来源纬度 来进行拆分
.png?table=block&id=ee52124a-fc34-4a33-9890-79c6b4683f1f&cache=v2)