本书将是一趙关于数据系统原理、实践与应用的旅程,并讲述了设计数据密集型应用的方法。我们将探索不同工具之间的共性与特性,以及各自的实现原理。
1:可靠、可扩展、可维护的数据系统
应用同步数据到全文搜索引擎和缓存:
可靠性(Reliability)
系统在困境(adversity)(硬件故障、软件故障、人为错误)中仍可正常工作(正确完成功能,并能达到期望的性能水准)。
如果所有这些在一起意味着“正确工作“,那么可以把可靠性粗略理解为即使岀现冋题,也能继续正确工作
硬件故障:冗余、硬盘 cpu 机房、双电源、云平台、
软件故障:
错误输入:充分测试
资源共享竞争:进程隔离
服务变慢:允许进程崩溃重启
级联故障:测量、监控系统,并且不停的自检
人为故障:
精心设计的抽象、更容易理解
沙箱隔离
彻底的测试
快速恢复
监控
可扩展性(Scalability)
有合理的办法应对系统的增长(数据量、流量、复杂性)
推特:推文推送的应对系统增长的扩展考虑:
应对负载的方法:
负载:垂直扩展:增加更强的机器,水平负载,将负载分摊到小机器上
弹性:增加计算资源(自动或者手动)
可维护性(Maintainability)
许多不同的人(工程师、运维)在不同的生命周期,都能在高效地在系统上工作(使系统保持现有行为,并适应新的应用场景)。
三个设计原则:
可操作性
便便于运维团队保持系统平稳运⾏行行。
良好的监控
自动化运维支持
避免单机依赖
良好的文档
管理权限放大
自我修复+人工干预
简单性
从系统中消除尽可能多的复杂度(complexity),使新⼯工程师也能轻松理理解系统。(注意这和⽤用户接 ⼝口的简单性不不⼀一样。)
消除复杂最简单的手段是--抽象。屏蔽细节
可演化性:
使⼯工程师在未来能轻松地对系统进⾏行行更更改,当需求变化时为新应⽤用场景做适配。也称为可扩展性
(extensibility),可修改性(modifiability)或可塑性(plasticity)。
数据模型与查询语言
关系型数据库:1970提出,已经流行几十年
Nosql相比关系型数据库的优点:
更好的扩展性,非常大的吞吐和数据集
开源、免费
一些特殊的查询操作
具有动态&表现力
模型分类:
关系模型:演进成关系型数据库,sql,
文档模型:擅长处理1对多的关系,无法表示多对多的关系,多用nosql进行持久化。
层次模型:擅长处理1对多的关系,数据结构式:树,嵌套结构,类似json
网络模型(CODASYL 模型、图):是层次模型的推广,数据结构是:图,可以表示多对多、多对1的关系。每条记录只记录一个父节点。缺点:需要知道查询路径。
查询语言:
SQL:申明式。
IMS/CODASYL :命令式,命令式语⾔言告诉计算机以特定顺序执⾏行行某些操作可以想象⼀一下,逐⾏行行地遍历代码,评估条件,更更新变量量,并决定是否再循环⼀一遍。
web上声明式查询
以点击元素,改变背景颜色为例,css就是申明式、js就是命令式
MapReduce查询
既不是纯粹的声明式查询也不是命令查询
图数据模型
--todo