关于数据系统的思考
我们日常开发的服务、编写的软件程序大都是数据密集型,什么是数据密集型呢?简单来说,数据密集型是以I/O操作为主,主要是端间通信、数据传递,与数据密集型对应的是计算密集型,其特点是偏运算、CPU是其瓶颈;因此,数据密集型应用的挑战主要是数据量、数据复杂性以及数据变更速度。
数据处理涉及的组件有很多,比如:专注持久化的数据库、专注快速访问的缓存、专注查找的搜索索引、专注数据处理的流处理、批处理等,如果每个组件都有自己明确的应用场景、相互间也有显著差异,但在实际开发中,很难一个组件工具就能满足所有的数据处理和存储要求,所以对于一个应用服务来说,他的系统设计重点关注三方面:
- 可靠性(可用性)
- 系统在困境(硬件故障、软件故障、人为错误)中仍可正常工作(正确完成功能,并能达到期望的性能水准)
- 可扩展性
- 有合理的办法应对系统的增长(数据量、流量、复杂性)
- 可维护性
- 许多不同的人(工程师、运维)在不同的生命周期,都能高效地在系统上工作(使系统保持现有行为,并适应新的应用场景)
可靠性
产生错误的原因被称之为故障,能预料并应对故障的系统特性是容错,容错是可靠性的保障;产生故障的原因主要有三种:
- 硬件故障
- 硬件资源引发的故障,这在日常运行中也很常见,比如:硬盘故障
- 减少硬件故障的最直接方法是增加单个硬件的冗余度,然后是配以软件容错机制,完善管理和应对
- 软件故障
- 软件BUG引发的故障,该类问题通常潜伏很长时间,直到被异常情况触发为止
- 减少软件故障的方法主要是彻底的测试、异常监控、报警重启
- 人为错误
- 人为操作引发的故障,运维配置错误就是导致服务中断的首要原因
- 减少人为错误的主要方法是简化系统设计、增加测试、监控、培训机制
可扩展性
可扩展性反映了系统应对负载增长的能力,这块就涉及负载、性能、资源等内容,对于一个系统,首先是明确负载关注点(也就是常说的核心指标),然后是性能和资源的定义,最后是应对负载的探讨。
- 定义负载
- 负载刻画了系统的核心关注指标,是影响服务稳定的具体点,比如:请求QPS、数据访问QPS、活跃用户量等
- 性能指标
- 性能指标反映了当前系统运行的健康情况,比如:吞吐量、响应时间等,一般会使用百分位、中位数查看
- 负载应对
- 因地制宜,具体情况具体分析,常说的扩容,可以是水平扩展也可以是垂直扩展
可维护性
可维护性反映了在历经长期迭代后,系统的可维护、可持续问题,比如:技术债偿还、新场景支持、新功能添加等,这里的可维护是存量、增量都要考察,所以设计上要做到:
- 可操作性
- 未来系统复杂了,肯定不能依赖人工操作,要有自动化的系统完成运维管理
- 简单性
- 在系统设计、功能实现上,坚持简单原则、精简原则,尽量做通用化、抽象化处理,避免系统变的庞大、繁琐
- 可演化性(兼容性)
- 在系统设计上,要考虑未来场景的变化,在系统设计上可以做到向后兼容