「读书」数据密集型应用 Day 1

158 阅读3分钟

第一章

数据密集性应用程序需要

  • 1.存储数据
  • 2.用缓存加快读写速度
  • 3.建立搜索索引
  • 4.流处理
  • 5.批处理

可靠性

系统在困境(adversity)(硬件故障、软件故障、⼈为错误)中仍可正常⼯作(正确完成功能,并能达到期望的性能⽔准)。

  • 应对硬件故障
    • 增加单个硬件的冗余度
  • 应对软件故障
    • 仔细考虑系统中的假设和交互
    • 彻底的测试
    • 进程隔离
    • 允许进程崩溃并重启
    • 测量、监控并分析⽣产环境中的系统⾏为。如果系统能够提供⼀些保证(例如在⼀个消息队列中,进⼊与发出的消息数量相等),那么系统就可以在运⾏时不断⾃检,并在出现差异(discrepancy)时报警
  • 应对人为错误
    • 以最小化犯错机会的方式设计系统
    • 将⼈们最容易犯错的地⽅与可能导致失效的地⽅解耦(decouple)
    • 在各个层次进⾏彻底的测试
    • 允许从⼈为错误中简单快速地恢复,以最⼤限度地减少失效情况带来的影响。
    • 配置详细和明确的监控,⽐如性能指标和错误率。
    • 良好的管理实践与充分的培训

可靠性不仅仅是针对核电站和空中交通管制软件⽽⾔,我们也期望更多平凡的应⽤能可靠地运⾏。商务应⽤中的错误会导致⽣产⼒损失(也许数据报告不完整还会有法律⻛险),⽽电商⽹站的中断则可能会导致收⼊和声誉的巨⼤损失。

可扩展性

有合理的办法应对系统的增⻓(数据量、流量、复杂性)

  • 描述负载
  • 描述性能
  • 纵向扩容 转向更强大的机器
  • 横向扩容 分布到更多的机器
  • 弹性系统

可维护性

许多不同的⼈(⼯程师、运维)在不同的⽣命周期,都能在⾼效地在系统上⼯作(使系统保持现有⾏为,并适应新的应⽤场景)

  • 可操作性
    • 通过良好的监控,提供对系统内部状态和运⾏时⾏为的可⻅性(visibility)
    • 为⾃动化提供良好⽀持,将系统与标准化⼯具相集成
    • 避免依赖单台机器(在整个系统继续不间断运⾏的情况下允许机器停机维护)
    • 提供良好的⽂档和易于理解的操作模型
    • 提供良好的默认⾏为,但需要时也允许管理员⾃由覆盖默认值
    • 有条件时进⾏⾃我修复,但需要时也允许管理员⼿动控制系统状态
    • ⾏为可预测,最⼤限度减少意外
  • 简单性:管理复杂度
  • 可演化性:拥抱变化

关键词

  • 可靠性
  • 可扩展性
  • 可维护性
  • 数据密集型
  • 计算密集型
  • 缓存
  • 搜索索引
  • 流处理
  • 降级
  • 故障
  • 容错
  • 负载参数
  • 扇出
  • 吞吐量
  • 响应时间
  • 延迟