第一章
数据密集性应用程序需要
- 1.存储数据
- 2.用缓存加快读写速度
- 3.建立搜索索引
- 4.流处理
- 5.批处理
可靠性
系统在困境(adversity)(硬件故障、软件故障、⼈为错误)中仍可正常⼯作(正确完成功能,并能达到期望的性能⽔准)。
- 应对硬件故障
- 增加单个硬件的冗余度
- 应对软件故障
- 仔细考虑系统中的假设和交互
- 彻底的测试
- 进程隔离
- 允许进程崩溃并重启
- 测量、监控并分析⽣产环境中的系统⾏为。如果系统能够提供⼀些保证(例如在⼀个消息队列中,进⼊与发出的消息数量相等),那么系统就可以在运⾏时不断⾃检,并在出现差异(discrepancy)时报警
- 应对人为错误
- 以最小化犯错机会的方式设计系统
- 将⼈们最容易犯错的地⽅与可能导致失效的地⽅解耦(decouple)
- 在各个层次进⾏彻底的测试
- 允许从⼈为错误中简单快速地恢复,以最⼤限度地减少失效情况带来的影响。
- 配置详细和明确的监控,⽐如性能指标和错误率。
- 良好的管理实践与充分的培训
可靠性不仅仅是针对核电站和空中交通管制软件⽽⾔,我们也期望更多平凡的应⽤能可靠地运⾏。商务应⽤中的错误会导致⽣产⼒损失(也许数据报告不完整还会有法律⻛险),⽽电商⽹站的中断则可能会导致收⼊和声誉的巨⼤损失。
可扩展性
有合理的办法应对系统的增⻓(数据量、流量、复杂性)
- 描述负载
- 描述性能
- 纵向扩容 转向更强大的机器
- 横向扩容 分布到更多的机器
- 弹性系统
可维护性
许多不同的⼈(⼯程师、运维)在不同的⽣命周期,都能在⾼效地在系统上⼯作(使系统保持现有⾏为,并适应新的应⽤场景)
- 可操作性
- 通过良好的监控,提供对系统内部状态和运⾏时⾏为的可⻅性(visibility)
- 为⾃动化提供良好⽀持,将系统与标准化⼯具相集成
- 避免依赖单台机器(在整个系统继续不间断运⾏的情况下允许机器停机维护)
- 提供良好的⽂档和易于理解的操作模型
- 提供良好的默认⾏为,但需要时也允许管理员⾃由覆盖默认值
- 有条件时进⾏⾃我修复,但需要时也允许管理员⼿动控制系统状态
- ⾏为可预测,最⼤限度减少意外
- 简单性:管理复杂度
- 可演化性:拥抱变化
关键词
- 可靠性
- 可扩展性
- 可维护性
- 数据密集型
- 计算密集型
- 缓存
- 搜索索引
- 流处理
- 降级
- 故障
- 容错
- 负载参数
- 扇出
- 吞吐量
- 响应时间
- 延迟