首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >关于大数据和数据库的一篇学习笔记

关于大数据和数据库的一篇学习笔记

作者头像
哒呵呵
发布于 2020-07-27 15:20:45
发布于 2020-07-27 15:20:45
8310
举报
文章被收录于专栏:鸿的学习笔记鸿的学习笔记

这篇文章来自于我非常崇敬的一个学者 Martin Kleppmann(下文用马丁指代) 的一篇访谈,包含了很多有趣的观点,比如为什么要写Designing Data-Intensive Applications(缩写为DDIA)这一本书,关于计算机行业专有名词乱用的点评,对分布式系统里广为流传的 CAP 定理的批评以及讨论了事件溯源(Event Sourcing)这种架构的适用场景和缺点,最后还附带了对计算机行业里去中心化趋势的看法。

Martin Kleppmann 是英国剑桥大学的分布式系统研究员,也是Designing Data-Intensive Applications一书的作者,Designing Data-Intensive Applications是目前数据领域的技术书籍里写的最好的一本书(我认为不带之一),这本书行文流畅,见解深刻,感兴趣的可以找到英文原版或者是中文翻译版读一读。

本文在翻译过程中们,删除了无意义的谈话,聚焦于核心观点。原文参见:https://martin.kleppmann.com/2019/06/27/hydra-interview.html

为什么要写 Designing Data-Intensive Applications 这一本书

得益于计算机行业的蓬勃发展,各种各样的软件、产品,无论是开源或者是闭源,总归是多了起来。相比于二十世纪的程序员,现在的程序员不再为了某个问题而需要“造轮子”(发明新的工具),GitHub 等网站上充斥着各种各样的工具,甚至于同一种场景会有五六种工具可以选择,以数据系统而言,数据库有非关系型数据库和关系型数据库,非关系型数据库中还有 Hbase、Cassandra等等,关系型数据库有 Oracle、MySQL等等,除了数据库外,数据系统里还有各式各样的流处理工具(Flink、Spark Steaming等等)、批处理工具(Spark、 MapReduce),让人眼花缭乱。程序员幸福于不需要花时间开发工具而苦恼于工具众多,不知道选什么才是最适合自己面临的业务场景。

然而现在的很多计算机书籍都没有回答好这个问题,比如,当读者在阅读有关 Cassandra 的书籍时,这本书会告诉你 Cassandra 是如何优秀,但是不会说 Cassandra 有哪些不适合的场景。DDIA 这本书就是告诉大家在构建一个大型的系统应该考虑哪些方面,然后如何确定哪种类型的技术可以帮你解决特定的问题,哪种技术不适合你需要解决的问题。

这就是 DDIA 这本书的意义。不过话说回来,计算机行业里没有万能的银弹,也就是说没有任何一种技术可以完美的解决所有的问题,选型就特别重要了。

反对计算机行业里的虚假宣传

这是我们行业存在的一个问题:当人们在谈论某种工具时,就会大肆宣传这种工具,这是可以理解的,因为这些工具是由公司发明的,显然这些公司希望能够推广这些产品,然后就会派人参加各种会议,说它的产品是多么的有些。有时候这种宣传会伪装成技术分享,但实际上依然是一种销售活动。作为行业内的人,我们需要正确地了解某些产品的优缺点,部分内容需要一种通用专有名词去描述,没有通用的专有名词的话,就无法放在同一维度下进行比较。当然,除了通用的专有名词外,还需要一些方法去推理并获知某些技术的优缺点。

所以对于程序员而言,了解某一种软件就必须认真仔细地去阅读官方文档,最好能够去部署并使用这个软件,因为对于官方文档而言,这个软件的开发者往往不会告诉你这个软件的真正缺点以及不适用场景,这个时候就需要个人分辨了。

CAP定理的问题

我认为在很多情况下,在计算机行业里,一项技术只能做某一件事而不能做另一件事,不是所谓的错误,而是某一种的权衡。但是 CAP 就是一个错误,而不是某种权衡。

CAP 定理从根本上讲是不够好的,而且也没有用。每当人们使用 CAP 定理证明它的架构设计或者是某种决策合理时,我认为他们理解错了 CAP 定理。CAP 作为一个定理的问题在于它只是说明了一件显而易见的事实,而且只讨论了一个被定义的非常狭隘的一致性模型,学术名叫线性化,以及一个被定义的非常狭隘的可用性模型:你希望每一个副本对于读取和写入而言都是完全可用的,即使这些副本无法与其它副本通信。这些定义是非常合理的,但是非常狭隘,许多应用程序根本就不能简单的划分到非常严格的一致性和可用性情况。这个时候,CAP 定理并不会告诉你更多的有用的信息,仅仅只是空洞的描述而已。

在 CAP 定理的严格定义下,有许多技术既不一致又不可用,实际上只是P!不是CP,不是CA,不是AP,只是P而已。从来就没有人这么说过,因为这看起来非常糟糕,但老实说,这有可能是一个非常合理的设计决策。实际上,我认为 CAP 定理没有任何帮助的原因在于:CAP 定理有很大的一部分只是很空洞的讨论。

事件溯源的适用场景

在读这个章节前可以先读下马丁写的Online Event Processing

首先事件溯源(Event Sourcing)是一种用于数据建模的机制:如果开发者的数据库有很多不同的表,并且开始无法管理好它,这些表又被很多事务更新。那么事件溯源这种方式就可以让开发者更加容易数据建模,因为事件可以非常直接的表示业务级别,用户正在操作什么,并且这种操作带来的后果是什么,也许是更新各种表。实际上开发者可以借由事件溯源将事件(动作)本身与其对下游的影响分隔开来。

这就是为什么可以使用 Kafka 之类的系统去构建一个高可用系统。从某种意义上来说,如果你在使用 Kafka 不一定在使用事件溯源方式,也有可能在使用事件这个概念。相反,你无需为了使用事件溯源而专门的使用 Kafka,你也可以使用特定的数据库。

当你想使用 Kafka 可能只是想方便地使用他的可扩展性:比如当你收到了很多数据,在单节点数据库上是很难处理的,就必须采用分区,并使用像 Kafka 这种事件日志方式去把工作分担到各个机器上。当你想集成多个不同类型的数据库时,例如不仅要更新关系型数据,也要更新 Elasticsearch 这样的全文搜索索引或者是像 Redis 这样的缓存系统,并且你希望一个事件在各个不同的系统上产生的效果是一样的,那么 Kafka 这种工具就很有用。

至于何时使用事件溯源,有一个很简单的原则:那就是使用最简单的方式去实现业务。例如当你的业务仅仅只是对数据库执行增删改查的操作,那么仅仅使用关系型数据库就好了。但是当你发现自己单纯地使用数据库这种方式时已经无法解决业务问题时,比如数据模型过于复杂,那么使用事件溯源的方式就很好了。

至于可扩展性的考虑,如果数据量足够少,那么就可以使用 PostgreSQL。但是如果数据量太大,那么就可以考虑 Kafka 这样的方式了。一切以实用作为标准。

事件溯源遇到的问题

当有很多消费者同时消费 Kafka 里的事件,比如当一个新的文档出现时,基于 Elasticsearch 的搜索系统需要让这文档可搜索,还需要将这文档放入到基于Memcached的键值缓存系统缓存数据,并且还需要更新关系型数据库里的数据。这个文档可以是任何事情,而且这些消费者系统都需要同时工作。这个时候就很需要事件溯源这种方式了。

这确实是一个挑战,实际上这需要跨不同类型的存储系统的“因果一致性”。当一个系统包含某个数据时,那么另一个系统也需要能看到这些数据,可惜的是,将不同存储系统之间的因果关系整合在一起是非常困难的,这不是事件溯源这种方式的错,而是无论使用哪一种方式或方法,都会遇到这个问题。

因为两种不同系统即使是同时写入,因为网络延迟的原因,导致到达系统的时间会略有不同,并且实际写入系统的时间也会略有不同。从而影响两个系统的使用者的观察状态。目前已经有一些人在研究解决这些问题。

一个很好的解决办法是,建立搜索引擎、缓存系统和数据库统一的一致性快照。如果仅仅只使用数据库的话,这种方式叫做快照隔离。快照隔离很重要的点在于任何人读取数据库,都只会看到独属于它的一份数据库数据库的副本,任何时候查看数据,都只是看到数据库某个时刻的快照状态。即使这个时候,数据被某一个事务更改了,实际上你依然会看到较旧的数据,因为这个较旧的数据也构成了一致性快照的一部分。

此时你想为 Elasticsearch 和 Memcached 这两个系统去建立一致性的快照是不可能的,因为像 Memcached,Redis 和 Elasticsearch 这种系统时没有有效的机制去建立可以和不同存储系统向匹配的快照,每个系统都只会考虑自己的情况,只能看到最新的数据,而不能看到较旧的数据。这就导致了不一致的情况。

对于这种情况,比较束手无力,因为要建立一致性快照这种事情需要对存储系统的底层代码进行改造,并且这种改造代价不能太大,因为有可能几秒钟就需要这样的一次快照。现在还没有一个存储系统满足这种条件,因此这是一个非常有趣的主题。

由事件溯源谈全局的快照隔离

全局的快照隔离实际上就是共享的多版本并发控制(https://en.wikipedia.org/wiki/Multiversion_concurrency_control)。

就像分布式事务系统一样。XA 分布式事务可以为解决这种问题提供一些帮助,但是就目前的情况而言,XA 并不适合,因为 XA 是一种基于锁的并发控制方式,这意味着当你在读取数据时,就必须对其进行锁定,让其他人无法在锁定的时候对数据进行修改。这导致了这类基于锁的并发控制方式的性能很差,所以在实践中还没有任何系统实际的使用它。换句话说,如果没有这种锁定的话,那么 XA 分布式事务也不会提供必要的隔离行为。所以我们需要的是一种新的可以提供跨不同系统的快照隔离机制,但是现在还没有看到实现这一目标的东西。

例如在微服务的宣传中,构建微服务的方式应该是每个微服务都有着自己的存储系统,自己的数据,而且另一个微服务不能直接访问另一服务的数据,因为这会破坏服务的封装。所以,每个服务仅仅只会管理自己的数据。

例如,您有一个用于管理用户的微服务,并且有一个保存着用户信息的数据库,其他所有想了解有关用户的信息的人都必须通过这个用户的微服务。从封装的角度来看,这很不错:因为你对其他服务隐藏数据库架构的详细信息。

但是,从不同服务之间的一致性的角度来看,现在遇到了一个大问题:我们可能在两个相互依赖的不同服务中拥有相同数据,并且在时间上,可能会轻易地以一项服务稍稍领先于另一项服务而告终,然后可能会导致有人读取不同的服务,从而导致结果不一致。而且我认为目前没有任何人构建微服务可以解决这个问题。

去中心化、边缘计算、存储

目前我们过于依赖服务器和集中化了。想一下,最初的因特网本来就是一个非常灵活的网络,可以通过数种不同的路径发送数据包,然后依然可以到达目的地。而且当一枚核弹袭击了某一个特定的美国城市时,其它的网络依然可以绕过系统的故障部分正常运行。这就是所谓的冷战设计。

现在我们将所有的东西都存储在云上了,比如基本上所有的东西都要经过 AWS 的一个数据中心。我们放弃了去中心化的想法,而是将所有的内容都存储在服务器上,也就是集中化了。所以我现在希望回到去中心化的路上,从某种意义上来说,将控制数据的权力从服务器交还给用户。

我想补充的一件事是很多人都在谈论去中心化,实际上谈论的是加密货币,因为他们还试图通过一种去中心化的方式将控制权从中央机构(如银行)转移到网络中。但这并不是我真正感兴趣的去中心化:因为我发现这些加密货币实际上仍然非常集中,在某种意义上,如果您要进行比特币交易,则必须使用比特币网络。因此一切东西都集中在这个特定网络上。虽然它的构建方式是分散的,没有单个控制节点,但是整个网络极其集中,因为必须通过该网络进行任何交易,无法通过其他方式。所以我觉得它仍然是一种集中化形式。

在使用加密货币的情况下,这种集中化可能是不可避免的,因为必须要用一个网络就达成的交易和未达成的交易达成共识。而这正是比特币网络所做的。但是有许多应用程序不需要像区块链这样的东西,因为更为灵活的数据模型。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-07-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 鸿的笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
豆瓣 9.7!这本技术书籍直接封神了
国内的豆瓣评分 9.7(满分 10.00),接近 90% 的人为这本书打了五星好评。
Guide哥
2021/12/21
1.1K0
豆瓣 9.7!这本技术书籍直接封神了
请不要再宣称数据库是 CP 或者 AP
在 Jeff Hodges 精彩的博客文章给年轻人关于分布式系统的笔记中,他建议我们用 CAP 定理来评论系统。很多人都听取了这个建议,描述他们的系统为"CP" (有一致性但在网络分区的时候不可用),“AP”(可用但是在网络分区的时候不一致) 或者有时候 "CA" (说明"我还没有读过 Coda 的五年前的文章")。
kirito-moe
2019/05/30
7990
5、事件驱动数据管理
本书主要介绍如何使用微服务构建应用程序,这是本书的第五章。第一章介绍了微服务架构模式,讨论了使用微服务的优点与缺点。第二和第三章描述了微服务架构内通信方式的对比。第四章探讨了与服务发现相关的内容。在本章中,我们稍微做了点调整,研究微服务架构中出现的分布式数据管理问题。
Java架构师历程
2018/09/26
1.2K0
5、事件驱动数据管理
豆瓣平均 9.x,分布式领域的 5 本神书!
你好,我是 Guide。上个周末简单整理了几本觉得还不错的分布式技术书籍,这里简单分享一下,希望对你系统学习分布式领域相关的知识能够有所帮助。
Guide哥
2022/11/07
3.3K0
豆瓣平均 9.x,分布式领域的 5 本神书!
分布式系统学习资料汇总
因此只需要在“时空”两个维度对分布式系统进行把握,就能提纲挈领,愈学愈明。“时”表示分布式系统的演进脉络,可以通过阅读不同时期、学术界工业界的一些论文来把握。“空”表示分布式系统中所研究的基本问题的拆解,可以通过阅读一些书籍建立分布式系统的知识体系。本文将我在学习分布式系统知识过程搜集到的一些资料,按类别简单汇总,以飨诸君。资料排名没有先后,请按需采用。
木鸟杂记
2021/09/26
7820
一周技术学习笔记(第62期)-CQRS是”有点不同“的读写分离
图自https://time.geekbang.org/dailylesson/detail/100056986
王新栋
2022/06/15
4550
一周技术学习笔记(第62期)-CQRS是”有点不同“的读写分离
如何系统性地学习分布式系统?
作者 | 伴鱼技术团队 本文的缘起是回答知乎圆桌会议「分布式系统之美」的问题「如何系统性地学习分布式系统?」,后面稍微整理了一下,形成了这一篇文章(知乎 ID:kylin)。 前
深度学习与Python
2020/10/23
3820
关于分布式系统数据一致性的那些事(二)
接上一篇文章(关于分布式系统数据一致性的那些事),继续更新一些关于分布式系统数据一致性方面的知识。
Bruce Li
2020/06/15
6160
设计数据密集型应用-Data-Intensive Application
读一本好书《设计数据密集型应用》- Designing Data-Intensive Application
王炸
2019/07/02
1.5K0
设计数据密集型应用-Data-Intensive Application
数据系统的未来------《Designing Data-Intensive Applications》读书笔记17
对于任何给定的数据问题,总会有多种解决方案。所有这些解决方案都会有不同的优缺点和权衡。因此,最合适的软件工具选择也要视情况而定。每一个软件,甚至一个所谓的“通用”数据库,都是为特定的使用模式而设计的。所以,在复杂的应用程序中,数据工具通常会串联起来共同工作。不存在有一个软件适合于使用数据的所有不同环境,因此不可避免地要将几个不同的软件串联在一起,以便更好帮助应用程序工作。
HappenLee
2018/09/05
1.1K0
数据系统的未来------《Designing Data-Intensive Applications》读书笔记17
虾皮一面:MySQL 事务的默认隔离级别是什么?可以解决幻读问题么?
你好,我是 Guide。分享一道群友面试虾皮遇到的 MySQL 事务相关的面试真题。
Guide哥
2022/05/25
8690
虾皮一面:MySQL 事务的默认隔离级别是什么?可以解决幻读问题么?
微服务分布式事务Saga模式简介
该文是基于《微服务模式》作者Chris Richardson的QCONSF 2017会议上的PPT文章(这里)和其 Eventuate Tram Saga框架之上,对Saga模式进行的原理性解说,其中包含banq个人经验总结和见解,请从批判性视角看待。Chris Richardson的另外一本书籍《POJO in Action》曾经是帮助Spring成功挑战了EJB2。 在微服务环境下为什么不能使用ACID事务?因为每个微服务都拥有自己的私有数据库,比如订单服务有自己的订单数据库,而客户服务有自己的客户数据
物流IT圈
2019/07/16
2.2K0
微服务分布式事务Saga模式简介
微服务架构详谈
微服务现在辣么火,业界流行的对比的却都是所谓的Monolithic单体应用,而大量的系统在十几年前都是已经是分布式系统了,那么微服务作为新的理念和原来的分布式系统,或者说SOA(面向服务架构)是什么区别呢?
慕容千语
2019/06/06
7880
微服务架构详谈
多研究些架构,少谈些框架——一名阿里架构师的笔记
微服务架构和SOA区别 微服务现在辣么火,业界流行的对比的却都是所谓的Monolithic单体应用,而大量的系统在十几年前都是已经是分布式系统了,那么微服务作为新的理念和原来的分布式系统,或者说SOA(面向服务架构)是什么区别呢? 我们先看相同点: 需要Registry,实现动态的服务注册发现机制; 需要考虑分布式下面的事务一致性,CAP原则下,两段式提交不能保证性能,事务补偿机制需要考虑; 同步调用还是异步消息传递,如何保证消息可靠性?SOA由ESB来集成所有的消息; 都需要统一的Gateway来汇聚、编
Java架构
2018/05/04
8320
多研究些架构,少谈些框架——一名阿里架构师的笔记
大牛书单 | 大数据存储方向好书分享
导语:读书是一生的功课,技术人通过读书实现自我提升,学习优秀知识沉淀。TEG书知道本期特邀腾讯云数仓数据湖产品负责人堵俊平、腾讯云数据库负责人林晓斌、腾讯TEG云架构平台部数据块中心高级工程师王银虎,腾讯TEG计费平台部账户中心专家工程师潘安群为大家带来大数据方向好书推荐。来看看技术大牛在读什么,收藏优质内容,愿本期书单助您更专业。 堵俊平,腾讯云数仓数据湖产品负责人, T4专家工程师,腾讯开源联盟(TOSA)现任主席,Apache开源基金会Member, Apache Hadoop项目Commi
腾讯技术工程官方号
2019/06/03
2K0
大牛书单 | 大数据存储方向好书分享
一周技术学习笔记(第70期)-理解数据库的这两个问题,面试官会对你另眼相看
从我们学习关系型数据库的时候就知道了数据库有四种隔离级别。那么为什么要做隔离级别这样的设置呢。
王新栋
2022/12/01
3070
事件驱动的微服务数据管理
微服务和分布式数据管理的问题 单体应用程序通常具有单个关系数据库。 使用关系数据库的一个主要优点是您的应用程序可以使用ACID事务,这些事务提供了一些重要的保证: 原子性 - 原子性变化 一致性 - 数据库的状态总是一致的 隔离 ----即使并发执行事务,它似乎是连续执行的 持久性 - 一旦交易已经提交,它不会被撤销 因此,您的应用程序可以简单地开始事务,更改(插入,更新和删除)多个行,并提交事务。 使用关系数据库的另一大优点是它提供SQL,它是一种丰
用户1263954
2018/01/30
2K0
事件驱动的微服务数据管理
DBLog:一种基于水印的变更数据捕获框架(论文翻译)
应用程序通常会使用多个异构数据库,每个数据库都用于服务于特定的需求,例如存储数据的规范形式或提供高级搜索功能。因此,对于应用程序而言,将多个数据库保持同步是非常重要的。我们发现了一系列尝试解决此问题的不同方式,例如双写和分布式事务。然而,这些方法在可行性、稳健性和维护性方面存在局限性。最近出现的一种替代方法是利用变更数据捕获(CDC)框架,从数据库的事务日志中捕获变更的行,并以低延迟将它们传递到下游系统。为了解决数据同步的问题,还需要复制数据库的完整状态,而事务日志通常不包含完整的变更历史记录。同时,某些应用场景要求事务日志事件的高可用性,以使数据库尽可能地保持同步。
tyrantlucifer
2023/10/03
1K0
DBLog:一种基于水印的变更数据捕获框架(论文翻译)
它说你的代码有 Bug「GitHub 热点速览 v.21.44」
本周热点上的榜单大多数提升工作效率的实用工具,像是一个 API 管理所有通知消息(包括推送、邮件…)的 notifire,再是高速解析 JSON 文件的 simdjson,高性能对多个目标进行跟踪的 ByteTrack,一键启动多个虚拟机的 PD Runner…当中最神奇的还是要属于 IntelLab 开源的 Control Flag 能无差别(不区分编程语言)地检测代码中是否存在异常,从而帮你调试代码。
HelloGitHub
2021/11/02
6740
多研究些架构,少谈些框架
微服务现在辣么火,业界流行的对比的却都是所谓的Monolithic单体应用,而大量的系统在十几年前都是已经是分布式系统了,那么微服务作为新的理念和原来的分布式系统,或者说SOA(面向服务架构)是什么区别呢?
物流IT圈
2019/09/24
6530
多研究些架构,少谈些框架
推荐阅读
相关推荐
豆瓣 9.7!这本技术书籍直接封神了
更多 >
交个朋友
加入腾讯云官网粉丝站
双11活动抢先看 更有社群专属礼券掉落
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档