这一章在做什么
这一章不讲具体的技术,讲看问题的方法:数据系统里几乎每个大决定都是取舍,没有哪个方案处处更好。作者拿四组对比来练手:业务系统和分析系统要不要分开;用云服务还是自己部署;一台机器够不够,要不要上分布式;公司想要的和数据背后那些人的权利怎么平衡。一路上立下全书要用的词:OLTP、数据仓库、记录系统和派生数据、云原生。读每一组都问:这一边省了什么,代价付在哪。
读之前:先预测
这是全书的第一章,不讲具体机制,先交代后面十三章都要用的眼光和词汇。第 2 章接着把「到底要什么」说清楚:性能、可靠、可扩展、好维护。这一章立下的业务与分析之分,到第 4 章变成两类截然不同的存储引擎;记录系统和派生数据,是第 11 到 13 章的主线;分布式的麻烦留到第 9 章细讲;法律和伦理在第 14 章展开。
同一份数据,有人要它一条条地快速改,有人要它一次扫几千万行;有的团队想什么都自己掌控,有的想全交出去。没有一个方案处处更好,那么面对一个架构决定,该怎么看清它省下了什么、代价付在哪、由谁来付?
- 分析师为什么不直接去查业务数据库?至少找出三条理由。§1.2
- 什么样的数据丢了也不要紧?一份数据算正本还是派生,取决于用的数据库,还是别的什么?§1.3
- 云服务最大的缺点是什么?什么条件下自己部署反而更便宜?§2.1
- 「多加几台机器」在什么情况下反而更慢、更难排查?§3.1
这一章的骨架
这一章是四组「A 对 B」,彼此独立,每一组都是先讲一边的好处,再讲它的代价。容易乱的是前两组:§1 里数据仓库、数据湖、HTAP、记录系统一个接一个出场;§2 在讲完云的利弊之后,插进一大段存算分离和运维的变化。先认准每组的两端,再把这些名词挂上去。
边读边填:每行一个问题,读到答案就写一两句。只存在你这台设备的浏览器里,别人看不到。
| 要找的 | 带着这个问题读,找到了就写下来 |
|---|---|
| 两种访问模式 | 事务处理和分析,读和写各是什么样子?数据各从哪里来?§1.1 |
| 单独的仓库 | 分析师不直接查业务库,书里给了哪几条理由?§1.2 |
| 湖和仓库 | 数据湖和数据仓库差在哪?谁更需要湖?§1.2 |
| 正本还是派生 | 怎么判断一份数据属于哪一类?由什么决定?§1.3 |
| 云的账 | 什么条件下自建更便宜?什么样的负载最适合上云?§2.1 |
| 本地盘 | 云原生系统为什么不把本地盘当长期存储?虚拟磁盘又有什么问题?§2.2 |
| 微服务的动机 | 它主要解决的是什么问题?团队很少的公司该不该用?§3.2 |
读完了?对照我找到的
- 两种访问模式:事务处理按键取少量记录、按用户操作逐条增删改;分析扫大量记录算汇总,数据靠批量导入或事件流进来。
- 单独的仓库:数据散在多个系统里拼不起来;适合事务的模式不适合分析;分析查询贵,拖慢线上用户;业务库可能在不让直接访问的网络里。
- 湖和仓库:仓库多是关系模型、用 SQL;湖只存文件,不规定格式和模式,也更便宜。做特征工程、处理文本和图片的数据科学家更需要湖。
- 正本还是派生:派生的数据丢了能从源头重建;算哪一类不看用的是什么数据库,看你在应用里怎么用它。
- 云的账:团队会运维、负载平稳可预测时,自己买机器往往更便宜;负载起伏大(分析查询就是)时云更划算。
- 本地盘:实例坏了或换规格,本地盘就访问不到了;虚拟磁盘每次 I/O 都是一次网络调用,模拟块设备本身也有开销。
- 微服务的动机:主要解决人的问题,让各团队不用彼此协调就能各自推进;团队少的小公司用它,多半是不必要的开销。
分节地图
全章约 1 万词,建议分三次读,每次对应一到两组对比。第一次最长、新名词最多;第二次讲云,书里的例子多是具体的产品名,读起来快;第三次把分布式和法律与社会放在一起,后者篇幅不长。
- 第一次坐下§0–§1.3 · 约 4100 词 · 业务系统和分析系统,数据从哪来、到哪去
- Data is central to much application…约 1000 词开篇什么叫数据密集型应用,这本书帮你做哪类决定,本章四组对比的清单。方框里解释前端和后端。
- Operational Versus Analytical Systems约 500 词业务系统和分析系统和数据打交道的几类人,以及全书都会用到的「业务/分析」二分。
- Characterizing Transaction Processing and Analytics约 700 词事务处理和分析各是什么样「事务」一词的来历,点查和扫描汇总两种访问模式,嵌进产品里的实时分析。
- Data Warehousing约 1500 词数据仓库为什么把分析搬到单独的库:ETL、HTAP、数据湖,以及数据怎么流回业务系统。本章最长的一节。
- Systems of Record and Derived Data约 500 词记录系统和派生数据哪份数据是正本,哪些丢了能重建。全书后半部分的伏笔。
- 第二次坐下§2–§2.3 · 约 2900 词 · 云还是自建,云改变了什么
- Cloud Versus Self-Hosting约 300 词上云还是自己部署买还是自己做:从完全自研到完全外包,中间有好几档。
- Pros and Cons of Cloud Services约 800 词云服务的利与弊什么时候云更省钱,什么时候自建更划算;「失去控制」具体指哪几种情况。
- Cloud Native System Architecture约 1100 词云原生的系统架构在底层云服务上搭高层服务;存储和计算为什么拆开;多租户的好处和难处。
- Operations in the Cloud Era约 600 词云时代的运维运维的目标没变,干的活变了。抓住「容量规划变成了什么」。
- 第三次坐下§3–§5 · 约 3300 词 · 单机还是分布式,再加上法律和社会
- Distributed Versus Single-Node Systems约 500 词分布式还是单机走向多台机器的九条理由。读的时候分一分:哪些躲不掉,哪些是可选的。
- Problems with Distributed Systems约 400 词分布式系统的麻烦请求会超时,排查难,跨服务的一致性落到应用头上;单机为什么常常够用。
- Microservices and Serverless约 700 词微服务和无服务器拆成服务的好处、代价和它真正解决的问题;无服务器把按量计费带到了代码执行上。
- Cloud Computing Versus Supercomputing约 400 词云计算和超级计算超算在故障处理、信任和网络上,和云走了不同的路。
- Data Systems, Law, and Society约 900 词数据系统、法律与社会隐私法规怎么伸进系统设计;存数据的成本为什么不只是账单。
- Summary约 400 词小结全章回顾。先自己回忆一遍四组对比,再读它。
先用中文过一遍
两种用数据的方式:一条条地改,一大片地算
拿一个外卖平台来想。用户下单、骑手接单,后端按订单号取出一条记录,改一个状态,再写一行新的;每秒成千上万次,每次只碰几行,要快。周一早上,运营想知道「上个月每个城市的午餐营业额」:一条查询扫过几千万行订单,只用其中两三列,最后得到几十个汇总数字。前一种叫在线事务处理(OLTP),后一种叫分析,书里也提到它的另一个叫法:在线分析处理(OLAP)。
两种查询都能用 SQL 写,早年也确实跑在同一个库里。后来分开,是因为挤在一起互相伤害:分析的大扫描会拖慢线上用户;一家大企业的业务系统可能有几十上百个,数据各在各的库里,一条查询拼不起来。于是有了数据仓库:把各个业务库的数据抽出来(定期导出,或者持续同步改动),整理成方便分析的样子,导入一个单独的库,这个过程叫 ETL。业务系统里的查询是写死在代码里的那几种,分析师则想到什么查什么,这也是两边的一个区别。
正本和派生:数据从哪来,丢了能不能重建
一份数据第一次写进来的地方,叫记录系统(system of record),也叫事实来源:每个事实在这里只记一次,别处和它对不上,以它为准。从它加工出来的东西,缓存、搜索索引、数据仓库里的表、用这些数据训练的模型,都是派生数据。派生数据严格说是冗余的,丢了可以从正本再算一遍。
冗余并不等于浪费。同一批订单,搜索要按菜名找,看板要按城市汇总,推荐要按用户口味,各要一种摆法,只靠正本哪一种都快不起来。麻烦在于正本一改,派生的那些都得跟着改,而很多数据库默认你只用它一个,不帮你把改动传出去(第 11 章回到这个问题)。还有一点容易想错:一个库是不是正本,不看它是什么数据库,只看它在你的系统里扮演什么角色。
数据仓库之外还有数据湖:数据科学家要把数据变成训练模型用的特征,要处理评论文本和图片,关系表和 SQL 不顺手。数据湖只放文件,不规定格式和模式,数据保持业务系统产出时的「生」样子,谁用谁加工。分析出来的结果有时还会流回业务系统,比如训练好的推荐模型部署到线上,这叫反向 ETL。
存储和计算拆开
传统的做法里,一台机器既管存(磁盘)又管算(CPU 和内存)。写进磁盘就当它不会丢,怕坏盘,就用 RAID 在同一台机器上多存几份。到了云上,这个假设站不住了:虚拟机坏了,或者为了应付负载换成更大的规格(搬到另一台物理机上),原来的本地盘就够不着了。所以云原生系统通常把本地盘当临时缓存。
云厂商也提供能从一台虚拟机卸下、挂到另一台上的虚拟磁盘,传统数据库因此能直接搬上云。但它其实是另一群机器在模仿一块盘,每次读写都是一次网络调用,网络稍一抖动就感觉得到。云原生的数据库换了个思路:把很多值打包成大块,写进对象存储(S3 这类),零碎的小值交给单独的服务;计算节点按需起停,不再和数据绑在一起。代价是数据要经网络搬到计算的地方,这把话题引向了 §3。
什么时候才该上多台机器
用多台机器的理由,书里列了九条。有几条躲不掉:用户各拿各的设备,系统天然就是分布式的;有的国家要求本地人的数据存在本地。另外几条是可选的:数据大到一台机器装不下、要容错、要离用户近、要按负载伸缩。可选的那几条要掂量代价:每次跨网络的调用都可能失败,超时以后你不知道对方到底收没收到,贸然重试未必安全;调用另一台机器比调用本进程里的函数慢得多;出了问题要先查清是哪一环慢;每个服务有自己的库时,跨服务的数据一致性就成了应用自己的事。
微服务是同一个取舍在组织层面的版本:系统按服务拆开,每个服务一个团队、一个接口,可以各自上线;代价是每个服务都要有自己的部署、监控、告警,接口改起来也牵一发动全身。无服务器(serverless)再进一步,连机器的起停都交给云厂商,按代码实际运行的时间计费。
书里还拿超级计算机(高性能计算)和云对照。超算多用来跑天气、气候、分子模拟这类大批量的科学计算,一个节点坏了,常见的做法是把整个任务停下,修好再从上一个检查点接着算;云上的服务要一直在线,不能这样停。两边对信任、网络的假设也不一样。
这一章点名的系统
| 英文 | 中文 | 一句话 |
|---|---|---|
| OLTP | 在线事务处理 | 按键取少量记录、按用户操作逐条增删改的访问模式(§1.1)。 |
| OLAP / analytics | 联机分析处理 / 分析 | 扫过大量记录、算汇总统计的访问模式(§1.1)。 |
| point query | 点查 | 按键取出一条或几条记录(§1.1)。 |
| data warehouse | 数据仓库 | 存放各业务系统数据的只读副本、专供分析的单独数据库(§1.2)。 |
| ETL / ELT | 抽取、转换、加载 | 把业务库的数据抽出、整理、导入仓库;ELT 是先导入再转换(§1.2)。 |
| HTAP | 混合事务与分析处理 | 想在一个系统里同时做事务和分析,内部常是两套引擎(§1.2)。 |
| data lake | 数据湖 | 只存文件、不规定格式和模式的集中存储(§1.2)。 |
| system of record | 记录系统(事实来源) | 数据第一次写入、出了分歧以它为准的地方(§1.3)。 |
| derived data | 派生数据 | 从别处的数据加工出来的,丢了能重建:缓存、索引、模型(§1.3)。 |
| cloud native | 云原生 | 从一开始就为利用云服务而设计的架构(§2.2)。 |
| disaggregated | 存算分离 | 存储和计算由不同的机器或服务负责(§2.2)。 |
| node | 节点 | 分布式系统里参与其中的每一个进程(§3)。 |
| microservices | 微服务 | 每个服务一个明确用途、一个负责的团队,经网络 API 互相调用(§3.2)。 |
| serverless (FaaS) | 无服务器(函数即服务) | 云厂商按请求自动分配资源,按代码运行时间计费(§3.2)。 |
| data minimization | 数据最小化 | 不值得存的数据就不存,用完了就删(§4)。 |
词与短语
词条按在书里出现的顺序排,按节分组;读一节之前先把这一节的过一遍,读的时候就不用停。斜体小字是原句里连续的几个词,在电子书里搜它就能找到那一句。标着「每个字都认识」的,是字面意思会把你带偏的。行话(compaction、quorum 这类)不在这里,在上面的术语表里。
§0 Data is central to much application…
§1 Operational Versus Analytical Systems
§1.1 Characterizing Transaction Processing and Analytics
§1.2 Data Warehousing
§1.3 Systems of Record and Derived Data
§2 Cloud Versus Self-Hosting
§2.1 Pros and Cons of Cloud Services
§2.2 Cloud Native System Architecture
§2.3 Operations in the Cloud Era
§3 Distributed Versus Single-Node Systems
§3.1 Problems with Distributed Systems
§3.2 Microservices and Serverless
§3.3 Cloud Computing Versus Supercomputing
§4 Data Systems, Law, and Society
§5 Summary
下面是读完再看的:你的预测对不对、几道换成你来选的判断题、值得细读的句子和理解检查。先看了,读书时就只是在找答案。
读完:回到你的预测
书里的答案是第三项(§3.1):有时一台机器上的简单单线程程序,能明显跑赢一个一百多核的集群。同一节给了原因:调用另一台机器比调用本进程里的函数慢得多;数据量大时,把数据从存储搬到另一台机器去算本身就是开销,有时不如把计算搬到数据所在的机器上。书在这里引的是 McSherry 等人 2015 年的论文《Scalability! But at What COST?》。作者还说 CPU、内存和磁盘这些年变得更大更快,所以很多负载一台机器就够。想一想:如果数据涨到一台机器的磁盘放不下,或者任务必须几分钟内跑完,答案会变吗?
书里的答案是第二项(§2.1):团队已经会搭建和运维需要的系统、负载又可预测(要的机器数不大起大落)时,自己买机器跑往往更便宜。云真正占便宜的是负载起伏大的时候:按峰值买的机器大部分时间闲着,而云上可以把用不着的资源还回去。第四项也不对:用云仍然需要运维团队,只是不用再管底层的系统管理(§2.3)。想一想:如果这家公司要新上一套团队里没人会运维的系统,答案会变吗?
判断题:换成你来选
场景都是本站编的。先选,再看解释;解释里写了对应的节号,拿不准就回原书看那一节。
场景:一家连锁健身房,会员和课程预约在 PostgreSQL 里,付款走一家第三方支付的 SaaS,门店的刷卡进门记录在另一套系统的 MongoDB 里。运营每周要看「各门店的到店率和续费率」,现在是分析师直接连生产库跑大查询,晚高峰时会员 App 明显变慢。
书里列的理由这里几乎全中:数据分在三个系统里(数据孤岛),一条查询拼不起来;分析查询贵,拖慢线上用户;付款数据还在 SaaS 那边,只能经它的 API 拿。数据仓库正是为此而设:各处数据的只读副本,分析师怎么查都不影响线上。凌晨跑只解决了一半,三处数据还是拼不到一起;多建索引会拖慢写,也治不了孤岛;书里说 HTAP 不替代数据仓库,企业通常是很多个业务库配一个仓库。
场景:一个网盘服务。文件的元数据(文件名、所在目录、所有者)存在 PostgreSQL 里,按文件名搜索走 Elasticsearch,热门目录的文件列表在 Redis 里缓存。一次误操作把 Elasticsearch 的索引全删了。
搜索索引是派生数据:从正本加工出来,丢了能从源头重建。PostgreSQL 是记录系统,没受影响,不用恢复它。Redis 只缓存了一部分目录,它本身也是派生的,不完整,当不了源头。让 Elasticsearch 也当正本,系统里就有两个「以它为准」的地方,对不上时说不清谁对。
场景:一家物流公司的分析团队每月初要跑一次全量对账,数据几十 TB,希望几小时内跑完,这几天要用几百个核;其余时间只有零星的小查询。现在是按月初的峰值买了一批服务器自己跑。
书里说云的优势在负载起伏大的时候:按峰值买的机器大部分时间闲着,不划算;分析负载的起伏往往特别大,大查询要很多资源并行,跑完就闲置。书里说自建更便宜的前提是负载可预测,指的是要的机器数不大起大落;这里虽然有规律,却正是大起大落。减半是拿时间换钱,业务能等时也算一个办法,但这里要求几小时内出结果。单机常常比想象的能干,可它照样要按峰值买、平时闲着,闲置的问题还在。
场景:一家五个人的创业公司在做宠物医院的预约应用,后端是一个单体服务加一个 PostgreSQL。新来的技术负责人提议拆成 12 个微服务,每个服务一个库,理由是「以后好扩展」。
书里说微服务主要是用技术手段解决人的问题:让很多团队不必彼此协调就能各自推进。这对大公司有价值,对团队少的小公司多半是不必要的开销。共用一个库更糟:整个库的结构等于成了每个服务 API 的一部分,谁都不敢改,一个服务的慢查询还会拖累别的服务。无服务器省掉的是管机器,服务怎么拆、接口怎么演化的问题一个不少,还多了执行时长的上限和首次调用慢的问题。
场景:一个跑步记录 App 每 30 秒记一次用户的精确位置,全部永久保存,理由是「以后做推荐也许用得上」。法务提出:要能响应用户的删除请求。
这是书里讲的数据最小化:把泄露、被要求交出、违规罚款这些风险都算进去,有些数据根本不值得存。GDPR 也要求个人数据只为明确的目的收集,保存不超过需要的时间。在只追加的日志里加标记,旧数据还在原处,派生出去的副本也还在,这正是书里提的删除难题;加密能减轻泄露的后果,管不了被强制交出和合规的风险;挪进数据湖只是换个地方存,湖里的副本一样要删。
和本站其他书对照
值得停下来的句子
no one approach is fundamentally better than others; everything has pros and cons.— §0。本站译:没有哪一种做法从根本上比别的更好,一切都有利有弊。
这句话是全书的立场,也是这一章的写法:四组对比,没有一组给出「选 A」的结论,只给出判断时要问的问题。读后面的章节时,它提醒你别去找「最好的数据库」:LSM 树和 B 树、各种复制方式,书里都按这个口径讲,选哪个取决于你的负载和你的团队。
Microservices are primarily a technical solution to a people problem: allowing different teams to make progress independently without having to coordinate with each other.— §3.2。本站译:微服务首先是用技术手段解决人的问题:让不同的团队各自推进,不必彼此协调。
谈微服务时,人们常争的是性能、扩展性和技术栈;作者把它的主要价值放在组织上。这样一来判断就清楚了:团队少的公司拿不到这份好处,却要付全部的代价,包括部署、监控、接口演化和跨服务的一致性。这句话也点出全章的一条暗线:架构决定往往是人和组织的决定,不只是技术的。
检查一下理解
1.(§1.1)「事务」这个词最初指什么?这一章用它指什么?
最初对应一笔商业交易:卖货、向供应商下单、发工资。数据库用到不涉及钱的地方以后,词留了下来,指组成一个逻辑单元的一组读写。这一章用得更宽,只指低延迟的读和写。
2.(§1.1)为什么业务系统一般不让用户自己写 SQL,分析数据库却放手让人写?
用户自己写的查询可能读到或改到无权访问的数据,也可能很贵、拖慢别人,所以业务系统只跑写在代码里的固定查询。分析库的使用者就是来探索的,查询本来就是临时想出来的。
3.(§1.2)既然有 HTAP,为什么还要数据仓库?
很多 HTAP 系统内部还是一个事务系统加一个分析系统,只是共用一个接口。而且企业通常有很多个业务库、一个仓库,分析要把几个系统的数据放在一起查。HTAP 适合同一个应用既要扫大量行、又要低延迟读改单条记录的场合,比如反欺诈。
4.(§1.3)同一个 PostgreSQL,什么时候是记录系统,什么时候存的是派生数据?
看你在应用里怎么用它。新数据先写进它、出了分歧以它为准,它就是记录系统;它的内容是从别处加工来的、丢了能重建,它就是派生的。数据库本身没有这个属性。
5.(§2.1)用云服务时「没有控制权」,具体指哪些情况?
出了问题你既改不了、也看不见:功能、故障恢复、性能排查都得靠厂商。想走也不容易,很多云服务没有标准接口,换一家代价很高;数据的安全也只能托付给对方。
6.(§2.2)为什么云原生的数据库不直接在虚拟磁盘上跑传统的存储方式?
虚拟磁盘是另一组机器模拟出来的块设备,模拟本身有开销;每次 I/O 都是一次网络调用,网络一抖应用就受影响。云原生系统改为直接建在对象存储这类为特定负载优化的存储服务上。
7.(§2.3)用了云,运维的哪些活少了,哪些还在?
按台管机器的活少了:容量规划、装新机器、打系统补丁。还在的有:选合适的服务、把服务接起来、在服务之间迁移、盯着花费和配额,以及应用的安全、监控和排查故障。容量规划变成了财务规划。
8.(§3.3)超级计算机碰到节点故障,通常怎么处理?为什么云服务不这样做?
停掉整个集群的任务,修好坏的节点,从上一个检查点重新算。云服务要持续给用户提供服务,整个停下来是不能接受的。
用一句话说这一章(写给一个没读过的朋友):
精彩回顾
一句话:数据系统里没有标准答案:分不分开、上不上云、要不要多台机器、存不存这份数据,每个选择都要说清省了什么、付在哪。
数据散在几十个系统里拼不起来,大查询拖慢线上用户,网络可能也不让进。所以要一个单独的数据仓库,靠 ETL 喂数据。
§1.2数据湖只放文件,不管格式和模式,把业务系统产出的原样留着,谁用谁加工。书里提到它的一个外号:寿司原则。
§1.2能重建的是派生数据:缓存、索引、仓库里的表、训练出的模型。是不是正本,不看用什么数据库,看你怎么用它。
§1.3会运维、负载平稳,自建往往更便宜;负载忽高忽低,云才占便宜。最大的代价是失去控制:服务挂了只能等。
§2.1云上的虚拟机随时可能被换掉,本地盘跟着就没了。云原生系统把数据放进对象存储,存储和计算拆开。
§2.2跨网络的调用会失败、会超时,比函数调用慢得多。书里说一个单线程程序有时能赢过一百多核的集群。
§3.1让很多团队不用协调就各自上线。团队少的小公司用它,多半只是多出一堆部署和监控的开销。
§3.2存数据的成本不只是账单,还有泄露、被强制交出、违规罚款。数据最小化和「先存着再说」正好相反。
§4