• 设计数据密集型应用笔记1:可靠 可扩展可维护的应用


    原书地址:Designing Data-Intensive Applications, 1st Edition
    之前群里有人推荐,再在safaribooksonline上有60多个好评就先看了一章,阅读体验良好,这边记录一下笔记.
    似乎之前看到过图灵社区在招这本书的译者,不过那时候可能都读了很多了.
    主要是笔记的性质,记录一下概要和重要概念,有兴趣的可以购买阅读或者订阅safaribooksonline,此外作者在github放出了这本书所有章节的引用,看了些第一章的引用都是很不错的资料,或许可以不看这本书直接看提供的资料也可以(笑


    现今的很多应用都是数据密集型的应用,CPU很少是应用的限制因素,而数据量,数据复杂度和数据产生的速度是更大的问题.

    身为开发不仅仅知识和开发应用程序,还需要设计数据系统。

    应用的设计需要考虑以下几个方面:

    • 可靠性: 系统在面对问题(软硬件 人为问题)时依旧可以正常工作
    • 可扩展性: 可以应对系统的增长(数据量 传输量和复杂度)
    • 可维护性

    可靠性

    错误(fault)和失败(failure)不等价

    错误常常定义为一个组件偏离了他的规范(例如非预期的不正常运行)

    失败是指系统作为一个整体停止了其服务

    硬件错误

    例如硬盘的平均失败时间(MTFF mean time to failure)

    应对方式:

    • 增加冗余存储 RAID
    • 电源保障 UPS
    • 热替换CPU
    • 服务备份

    软件错误

    一般认为硬件错误是随机的.
    如果是因为硬件问题,一台机器的硬盘坏了不一定暗示了其他机器的会坏,错误之间常常弱相关.

    而软件bug则会因为特定条件被触发,带来的问题可能会更严重,也更难排查.

    人为错误

    最主要的错误来源.

    应对方式:

    • 做设计时尽量减少产生错误的机会,例如更友好的管理界面。
    • 将容易产生失误的地方和造成错误的地方解耦,沙箱环境。
    • 测试,从单测到系统集成测试到人力测试。
    • 快速且容易的恢复机制。
    • 设置详细且清晰的监控,例如性能指标和错误率。
    • 优秀的管理和训练。

    可扩展性

    如何应对不断上升的负载.

    描述负载

    首先要能简明地描述当前系统负载,不然无法讨论负载增长的问题.

    可以使用一些数字来描述:负载参数(load parameter)

    选择的参数取决于系统架构:

    • 对于web服务来说可以是QPS
    • 对于数据库来说是读写比
    • 对于聊天室来说是并发活跃连接数
    • 对于缓存是命中率

    描述性能

    描述好负载之后就可以研究在负载增加的时候系统的表现如何.
    可以从两方面考虑:

    • 系统资源(CPU 内存 网络带宽)不变的情况下系统受到的影响。
    • 需要增加多少资源来保持性能不受到影响。

    性能指代:对于处理系统例如hadoop来说是吞吐量,对在线系统来说是响应时间.

    响应时间-百分比 几个9
    要考虑可能最慢的请求是因为数据过多,而大量数据的用户则是核心用户.
    百分比常常用于SLO(service level objectives)和SLA(service level agreements)

    处理负载的方式:

    scaling up 和 scaling out
    垂直扩展会变得昂贵
    需要考虑一个合适的方式,一些情况下几台高性能机器会比一堆低性能虚拟机更加简单和便宜.

    一些系统是elastic,弹性收缩的,在负载增加时自动增加计算资源.

    无状态服务的水平扩展会很容易,但如果要处理状态的话就会带来额外的复杂度。
    现在一些通用的做法是在达到极限或者要满足HA之前数据库是单个节点。
    但分布式数据系统是未来的趋势。

    要根据实际的问题来设计,没有银弹.
    如何设计取决于负载参数,例如读写比,对于读多比不同的应用设计可能会是截然不同的.

    可维护性

    易操作

    设计简洁

    易迭代

  • 相关阅读:
    jQuery on注册事件
    前端表格(Table)多条数据可以增加行删除行json封装后Post数据到后台处理
    导出Excel数据
    C#在一个实体类上新加字段并把另外一个实体类的字段值赋给它
    函数(五)-内置函数
    函数(四)-命名空间与作用域
    函数(三)-return与函数的调用
    函数(二)- 参数
    函数(一)-基本格式
    字符串格式化
  • 原文地址:https://www.cnblogs.com/fairjm/p/ddia-note-chapter1.html
Copyright © 2020-2023  润新知