前言
老大突然给我这本书《Designing Data-Intensive Applications》,读一下,顺手记一下笔记
这里就把对我有帮助的一些点记下来,不一定包含所有章节
1.数据密集应用
现在很多应用是数据密集型的,他们需要
1.存储,读取数据(db)
2.记录昂贵操作的结果来提升读性能(cache)
3.支持索引,搜索(search index)
4.发送消息给其他进程来异步处理(stream processing)
5.周期性的处理一批数据(批处理)
目前有很多不同特性的数据系统来满足对数据的不同要求。我们需要根据自身的场景去找到最合适的那些数据密集应用。
2.数据系统的思考
2.1把数据系统当成一个整体
我们常常会把数据库,cache,queue(mq)这些当成不同的工具,因为他们有不同的access pattern,特性以及实现。
但是他们都会存储数据,为什么不把他们当成'数据系统'一起看呢
从下面两点,可以把他们当成'数据系统'一起来看
2.1.1数据存储,处理工具的整合。
最近一些数据存储,处理工具都进行了整合
比如redis也可以当成mq来用(原本只是cache)
kafka也有数据持久化的相关操作(原本只是mq)
2.1.2业务的需求
单一的db,cache,mq不再能满足业务的需求,业务往往需要多种数据系统协同工作,
如db(mysql等) + cache(redis,memcache等) + mq(kafka等) + searchIndex(es,solr等) 这些组合
比如一颗常见的应用包含的数据系统如下图所示
db + cache +mq + searchIndex
通过把多种工具的结合,提供服务API,隐藏具体实现,就可以将多个泛型的组件(如db,cache等)组装成一个满足自己需要的的数据系统。
2.2数据系统引发的问题
整合成统一一个数据系统,会引发一些问题
当内部出错时,如何保证数据的正确以及完整性
如何持续提供优质服务,即使部分系统降级,宕机
如何应对load increase
有很多因素决定了一个数据系统的设计,但是本书主要讲解下面三个方面
3.数据系统的三要素
- 可靠性:在面对软硬件以及人为错误的时候,能够正确持续的工作(达到预期)
- 拓展性:有合理的方法应对系统的增长(数据量,流量,复杂度)
- 可维护性:很多不同的人要维护当前的性能,并且在此基础上持续开发
3.1可靠性
定义:
- 可靠性是指能够持续的,正确的工作,即使面对特定的fault(比如地球爆炸不算)
- 能够容忍fault的系统叫做容错的
- fault是指偏移预期,fail是指系统停止服务
- 阻止fault的发生 优于 解决fault
本章描述的faults都是可以解决的,如下
3.1.1硬件fault
如磁盘坏了,机房断电等
解决方案:
1.硬件上加冗余:比如备用电源等等
2.软件上做到容错:比如一台机器重启,整个系统应该能监控并且做到短时间丢掉这个机器节点,保证整体服务的稳定
3.1.2软件错误
诸如各种bug
特定的输入如除以0
进程用光了CPU或者内存或者磁盘或者带宽
第三方服务变慢,无法响应
蝴蝶效应导致的failure等等
解决方案:
没有快速解决办法,只有一些小细节来help
合理假设边界
测试
隔离
允许重启恢复
等等
3.1.3人为错误
就是说程序员bug的几率比硬件错误的几率要大得多
解决方案
1.合理设计API和admin后台等,减少error出现的机会
2.独立的测试环境,脱离生产环境
3.各种测试
4.允许快速恢复:如回滚代码
5.建立明确清晰的监控
3.2可拓展性
现在能处理1w并发的的系统不一定能处理未来10w并发的场景
定义
可拓展性就是来描述一个系统应对持续增长的load的能力
3.2.1描述负载
通过一些负载参数来描述,如
web的qps
磁盘的读写比
聊天室的用户量
cache的命中率
3.2.2描述性能
增加负载参数并保持系统资源(CPU、内存、网络带宽等)不变时,系统的性能如何受到影响?
当增加负载时,如果希望保持性能不变,需要增加多少资源
需要有特定的指标参数来描述,常用的如
平均响应时间
中位数响应时间(p50)
高百分比响应时间(p95,p99等)
3.2.3如何应对负载
scale up:垂直拓展,机器提升配置
scale out:加机器数量
没有一个通用,适合所有场景的可拓展性的架构
一个架构的拓展性应该建立在对它各种操作(如读写)的频繁程度的假设上
3.3 可维护性
分为三点,这里不详细介绍了
- 可操作性
就是方便运维操作,需要监控,追踪,及时更新发包等 - 简单性
代码好理解,文档详细等 - 可进化型
代码设计要有鲁棒性,易拓展等等
4.小结
本章主要引出数据密集应用,提出思考把数据系统(cache,db,mq,searchIndex)等当成一个整体,引发系统设计相关的问题,解决问题需要考虑到可靠性,拓展性,可维护性,并且按照这三点展开来讲,对于一些定义以及指标,解决方案提供了详细的说明
refer
https://www.jianshu.com/p/0c029f4928d4 刚好发现也有人在读
网友评论