如果从大学学习数据库管理系统算起,跟数据库结缘已经超过 20 年了。回顾过去的职业生涯,走上数据库这条不归路也是一个小小的偶然:第一份工作在分小组的时候被分到了 Oracle,就此开始了与数据库的不解之缘。
关于数据库已经有太多太多的内容,这里不敢讲什么学术理论,只是想把自己对数据库的理解做一个梳理,希望能够帮助那些对数据库感兴趣的朋友们更好地理解数据库这个既古老又充满生机的玩意儿。
什么是数据库
数据库就是英文的「database」翻译来的,data + base,顾名思义就是数据的根源,数据的基础。那么为什么要有数据库呢?数据库首先是个计算机软件,在所谓数据库诞生之前,常用方法可能是程序员自己写一个小程序来完成数据处理分析这样的工作。
随着计算机的普及,越来越多的场景开始使用计算机,产生了越来越多的数据,也催生了越来越多的数据分析需求。为了降低数据分析的门槛,让更多人能够更方便高效地管理分析数据,工程师们就打造了一种专门的软件来帮助人们对数据进行合理的存储以提高存取效率,提供易用的接口和丰富的分析算法以方便使用,集成有效的管理工具以提高数据安全性等等,这就是数据库,也被称为数据库管理系统(DBMS,Database management system)。
数据库是一整套数据管理体系,包括数据存储的模型、数据组织的架构、数据分析的算法、数据管理的工具以及数据访问的接口等等。
举个例子,粮仓。如果你有一亩三分地,产的粮食刚刚够一家人吃,吃不完的自己找个缸就放下了,这个缸也只需要方便自己家人使用就行了。随着你种的地越来越多,比如一万亩地,生产的粮食根本吃不完,那就必须修建一个专门用来存放粮食的仓库,同时还要方便不同的商家来拉粮食,为了保证粮食存放的安全和效率,就必须对粮仓进行特殊的设计和处理,比如恒温恒湿、自动喷淋、传送系统等等。数据库也是类似的道理。
数据库起源于阿波罗登月计划,因为当时需要大量的数据分析人员对大量的数据进行分析,就不得不开发一款能够方便更多人使用的数据管理分析软件。这确实是人类当时的灯塔,不得不给 NASA 的工程师们点个赞。
数据库的核心功能是什么
数据库根据应用场景的不同而分为不同的类别,比如最经典的分类 OLTP(在线事务处理)和 OLAP(联机分析处理)。举个例子,你每天要使用信用卡支付来坐地铁、买午餐、买饮料、上淘宝购物等等,这每一笔交易都需要后台数据库准确地记录下来,这个数据库就是 OLTP 类型。
你也会通过系统去查询你上个月的消费情况,系统会根据你上个月的交易数据做个汇总发给你,并告诉你吃饭花了多少、交通花了多少、娱乐花了多少等等,支持这个场景的就是 OLAP 类型。
OLTP 主要处理短小的事务,要求事务吞吐量很高,因为每个人每天可能要支付十几次,但每次需要处理的数据量比较小;而 OLAP,每个人可能每个月只用一次,但是每次要处理的数据量相对比较大,而且计算比较复杂。
近年来,伴随着人工智能、物联网、边缘计算等数字化场景的兴起,数据库的功能也产生了更多的分类,如 HTAP(同时能够处理 OLTP 和 OLAP 的场景)、流式数据处理、时序数据处理、非结构化数据处理、跨平台数据处理、多模态数据处理等等。如何理解这些分类呢?
类似于不同功能的汽车,有货车、有客车、有 MPV、有 SUV、有皮卡、有燃油车、有新能源车等等。车的核心功能是一致的,只是为了适应不同的场景和需求,不同的车会有不同的架构设计和调参,如此而已。
那么,数据库应该有哪些核心功能呢?
首先,数据库、数据库,必须要把数据保存下来。要把数据按照合理的格式,安全保存在可持久化的存储介质里面,要保证数据的正确性、完整性和安全性。这是所有数据系统最核心的功能。换句话说,把数据交给数据库,数据库要保证数据不丢、不错。这个是最最起码的要求。正如粮仓,不能粮食存进去都发霉了,被耗子吃了。
其次,数据库要尽可能提高数据存取效率。要用更有效率的方式存储数据,让数据存储得更快,更易于使用者理解,更方便上层业务的使用。查询数据时效率更高,更快给出结果。就像有人来送粮食入库,要快速地称重、烘干、质检、打包、入库,不能让人家等一礼拜。有人要买小麦,有人要买玉米,必须按照要求快速找到相应的存放地点把粮食交给粮商。
再次,数据库要提供丰富的数据分析算法,尽可能把跟数据密切相关的计算在数据库中完成,减少数据传输的开销,减轻上层业务逻辑的计算压力。就像粮库要提供完善的粮食处理措施,比如称重、烘干、打包、品质分级等,方便粮食交易。
最后,数据库要提供易于使用的接口,降低数据分析人员的使用门槛,能够支持各种数据分析工具,让使用数据更加方便。就像粮库要有方便的停车场、清晰的指示牌、专业友好的工作人员等。
数据库的核心组件有哪些
为了实现这些核心功能,通常数据库会包括以下核心组件:
a. 存储管理
数据用什么样的方式来组织、存储,是 key-value 还是关系型,是按行存还是按列存,支不支持压缩,支不支持删除和修改,支持什么样的数据类型和存储接口,POSIX 还是对象存储。是否要支持计算存储分离,是否要支持分布式存储,是否支持事物处理,是否支持多副本,采用什么算法来加速数据的检索(索引)等等。存储管理是数据库的核心组件,解决了存储管理问题,数据库的问题就解决了一半了。
b. 查询优化器
要提高数据查询的效率,数据库必须找到一条最优化的执行路径,比如,查询时是否需要使用索引,如果有多个索引,应该选择哪一个,如果数据分布在不同的存储单元(表、集合等)里,应该按照什么顺序来访问效率最高等等。优化器面对的问题可能是一个极其复杂的路径规划问题,它需要在很短的时间里计算出最优路径,需要大量核心优化算法,属于数据库中复杂程度最高的部分。
举个例子,你要带着全家人,包括老人、小孩一起从上海去海南旅行,要制作一个性价比最好、家人满意度最高的计划,那么在计划时需要考虑哪些因素呢?首先,怎么去,是开车去,还是火车去,还是飞机去。开车,路上要花多久,中间需要休息几次,你和太太有没有时间,老人孩子是不是受得了,汽油费用,过路费用;飞机,怎么去机场,行李有多少,带不带得下,机票有没有打折,下了飞机怎么办等等。住什么酒店,去什么景点,老人喜欢去人多的人文景观,太太喜欢安静的地方和方便购物的地方,小孩喜欢有游乐场的地方,要不要酒店 + 景点一起订,会不会有优惠,要不要租车,租什么车......说到这里,是不是可以体会一个查询优化器需要考虑的问题有多少?
当然,这部分工作可以有相对简单的实现(基于规则),比如太太说了,时间确定、飞机来回、五星酒店、带私人沙滩,这样计划就会简单很多。然而,这份工作也可能复杂到难以想象(基于机器学习、基于实际开销等等),比如太太说你全权负责,具体时间不确定,大概在 8月 - 9月,要少花钱多办事,多做调研,找一个最优方案。那么做这个计划就会非常复杂,需要的支持决策信息就会非常多。这样做出来的决策大概率相对会优化,比基于规则实现的计划能适应更多场景。
c. 执行模块
优化器做好了执行计划后,接下来就会有执行的模块按照执行计划对数据进行相关的计算,包括数据的存取、常规的加减乘除、排序、平均值、哈希,也会包括一些机器学习的算法,数据的压缩/解压缩,最后将计算完成的结果返回给客户端。
d. 内部管理和调度
数据库要正常地工作,还会需要一些内部协调管理的模块,比如内存和存储同步,存储空间整理,元数据管理,集群状态检测,容错和故障恢复等。
e. 管理工具和接口
为了提高易用性,数据库都需要提供一套管理工具,比如备份/恢复、状态检测、运行时监控、资源隔离、权限管理、安全审计、自定义接口、各种数据访问接口等。
数据库的发展和展望
数据库的发展是伴随着计算机体系架构的发展而不断演进的,从主机,到个人电脑 + 网络(x86),到现在的云服务,数据库也经历了一系列的演化历程。
a. 主机时代
最初的计算机和数据库只是在航空航天、军事领域使用,只需要支持专业的数据分析人员进行数据分析。到了上世纪 70 年代末,伴随着计算机进入更多商业场景,大量数据分析的需求产生了,数据库则需要面对更为普遍的用户需求。在 IBM 最早发布的关系型数据库的论文中,最强调的一点就是希望能够让数据库的用户不用再去操心数据应该如何存储和组织,而能够高效率使用这些数据进行分析。
为了方便用户的使用,SQL(结构化查询语言)被定义了出来,按照这样的语法,数据库用户只需要关注数据该如何分析,不需要关注底层的数据分布和存储等。
为了要支持大量用户的并发数据操作,数据库事务特性被定义了出来,保证在并发的数据操作下,用户能够看到符合业务逻辑的数据内容。
为了保证数据库的高效率和安全性,数据库重做日志(事务日志)被设计出来,包括当前数据库中经常出现的一系列概念,比如回滚日志(undo log)、提交日志(commit log)、检查点(checkpoint)等等。
主机时代的硬件成本极其昂贵,不论是存储、内存还是CPU资源,相对来说都很稀缺。那么,数据库在设计和使用上就会采用各种算法和架构来降低对内存的使用,减少数据的冗余,提高数据的检索效率。因此,各种数据索引类型,功能强大的查询优化器,数据缓存算法等在数据库中得到了极大的发展。同时在使用数据库时,也要对数据进行各种复杂的模型设计(三范式模型、星型模型、雪花型模型等等)以降低数据的冗余程度,当然,这样也会增加数据库应用的开发难度。
b. x86 时代
伴随着 x86 服务器的广泛使用和网络技术的发展,把 N 台 x86 服务器通过网络组建成一个集群,利用这个集群的计算、存储能力来取代昂贵的主机也就更加具有性价比。在这种趋势下,也就设计出了各种能够使用集群能力的分布式数据库系统,这些系统的核心思想就是把数据分散在不同的节点上,利用多个节点的计算和存储资源提高对数据的存储和分析能力。在分布式的处理架构下,数据一致性协议、多副本机制、高可用机制、数据分片机制、扩容/缩容机制等等也都成为了分布式数据库必须要设计和解决的问题。
在 x86 时代,由于硬件成本的大幅下降,用户更多关注数据分析的灵活性和交付的效率。因此,使用数据库时更多会关注如何加快数据分析的过程、如何让数据更易于人类理解,而不需要为了降低数据的冗余而进行复杂的模型构建。
c. 云时代
随着技术的进一步发展,通过把传统硬件虚拟化/容器化等技术,提高硬件资源的使用效率,降低生产运维成本的云服务被越来越多企业采用。为了更好地适应云服务的技术体系,数据库也设计出了相关的云特性,比如存储计算分离、弹性伸缩、微服务化、跨域数据同步等等。
云时代,用户更加关注数据分析的效率和投入产出比,更加关注产品是否能够提供便利的一体化数据处理服务,让业务开发者能够更加专注于业务本身,而数据库服务也在朝着标准化云服务的方向不断演进。
d. 展望
不同的数据库架构和部署方式不是一个简单的迭代和取代的关系,而是在很长一段时间里会同时存在并且逐步迭代的过程。时至今日,依然有不少金融机构会选择使用在主机上的数据库产品,只是新的业务和场景非常有限。而基于 x86 服务器的数据处理产品,还是当前企业数据库的主流选择。与此同时,云数据库的市场份额也在逐步增长和扩大。采用何种数据库产品要根据自身的业务需求来决定,合适的就是最好的。当然从技术演进的方向上看,云技术(包括公有云和私有云)会是大势所趋,因为云能够提供更高的效率。
数据库作为信息产业的三大基础技术(还有芯片和操作系统)之一,在相当长的时间里,不论从资本还是技术方面都非常火热,国内近几年来也出现了相当多优秀的数据库产品和企业。在人类迈向数字化文明的进程中,必定会产生越来越多的数据,也需要从数据中挖掘出更多的价值,而数据库作为承载数据的核心,也必将持续发挥重要作用。有幸一直在从事这个领域的工作,期待与广大同仁一道为人类数字化技术的进步贡献力量。
原文链接:https://www.toutiao.com/a7033297717493334560/