为了账号安全,请及时绑定邮箱和手机立即绑定

《Designing Data-Intensive Applications》第1章 读书笔记:可靠,可拓展,可维护的应用

标签:
大数据

前言

老大突然给我这本书《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等) 这些组合
比如一颗常见的应用包含的数据系统如下图所示


webp

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)等当成一个整体,引发系统设计相关的问题,解决问题需要考虑到可靠性,拓展性,可维护性,并且按照这三点展开来讲,对于一些定义以及指标,解决方案提供了详细的说明



作者:赤子心_d709
链接:https://www.jianshu.com/p/e51cba959d4e


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

举报

0/150
提交
取消