数字化时代的数据管理:多样化数据库选型指南
非常感谢Kevin和张健对本文提供的建议和指导。
1. 概述
在数字化时代,数据是企业最宝贵的资产之一。随着技术的进步和数据量的爆炸性增长,如何有效地存储、管理和分析这些数据成为每个企业面临的重大挑战。数据库作为数据管理的核心技术,其选型对于系统至关重要。传统的关系型数据库(RDBMS)以其严格的ACID事务、优秀的一致性和安全性在企业应用中占据了长久的统治地位。然而,随着互联网、大数据和云计算的兴起,非关系型数据库(NoSQL)因其灵活的数据模型、易于水平扩展的特性和优异的处理高并发请求的能力,在特定场景下得到广泛应用。此外,时间序列数据库(TSDB)、图数据库等针对特定类型的数据和查询提供了更加专业的解决方案。除此之外,新型数据库如向量数据库则为机器学习、人工智能和相似性搜索提供了更高效的整体解决方案。
本文将探讨9种数据库,涉及各种数据库风格。本文并非旨在将某种数据库新手培养成专家,因为那样的话,任何一种数据库都会需要大量的篇幅来详细描述。然而,通过阅读本文,你应该能够理解并掌握每种数据库的独特优势,并在面对不同的使用场景时做出最佳决策。
1.1 数据存储风格
数据库分为各种类型,例如,关系型、键-值型、多列型、面向文档型、图型、时序型和向量型,各种数据库有着其本身独特的风格。流行的数据库一般可以划分为这几大类型。本次对涉及的数据库精心挑选,以覆盖这些类型,包括一个关系数据库(MySQL),一个键-值存储的数据库(Redis),两个面向列的数据库(HBase和ClickHouse),两个面向文档的数据库(MongoDB和ElasticSearch),一个图数据库(Neo4j),一个时序数据库(Prometheus)以及一个向量数据库(Milvus)。
1.1.1 关系数据库
关系型数据库(RDBMS)仍然是目前应用最广泛的数据库类型之一。关系型数据库(RDBMS)以其强大的结构化查询语言(SQL)、事务性(支持ACID属性:原子性、一致性、隔离性、持久性)、以及严格的数据完整性约束而闻名。它们以行和列的形式组织数据,并存储在一系列互相关联的表中,这些表通过外键等机制实现数据之间的关系。这种模式非常适合于需要执行复杂查询和报告的场景,如财务系统、人力资源管理系统和库存系统。关系型数据库的模式(schema)在创建时需要定义,这意味着数据的结构在数据库中是预先确定的,这为数据的一致性和规范化提供了保障。
流行的关系型数据库系统包括Oracle、MySQL、PostgreSQL和Microsoft SQL Server,它们在不同的应用环境中被广泛部署,从小型企业到大型企业级应用。第二章将介绍MySQL。虽然关系型数据库在处理大规模分布式数据方面面临挑战,但它们的强类型和结构化特性使其在数据准确性和完整性至关重要的应用中继续保持其价值和重要性。随着技术的发展,现代关系型数据库也在不断地演化,以满足云计算、高可用性和自动化运维等新兴需求。
1.1.2 键-值数据库
键值型数据库,作为非关系型数据库(NoSQL)的一个重要类别,以其简洁高效的数据存储模式在现代应用开发中占有一席之地。这类数据库基于键值对的结构来存储数据,其中“键”是唯一的标识符,而“值”可以是简单的数据项或更复杂的数据结构。键值数据库的主要优势在于其高速读写性能和出色的可扩展性,这使得它们非常适合处理大量的并发请求,如在线购物平台的购物车、社交网络中的用户会话和高速缓存系统等场景。
键值数据库的操作简单直观,主要包括键的添加、查询、修改和删除,因此开发者可以快速实现数据的存取,无需复杂的查询语言。此外,由于数据是以键值对的形式直接存储,这种结构的灵活性允许应用在不需要预定义模式的情况下动态添加数据,极大地提高了开发效率和系统的灵活性。
流行的键值数据库包括Redis、Amazon DynamoDB和Memcached等,它们各自有着不同的性能特点和优化场景。第三章将介绍Redis,Redis以其极高的性能和支持多种数据结构而广泛应用于需要高速缓存的场景。尽管键值数据库在处理高并发、大规模数据分布式应用方面表现出色,但它们通常不适用于需要复杂查询和数据关联分析的应用场景。选择键值数据库作为解决方案时,需要综合考虑应用的具体需求和数据处理特性。
1.1.3 列式数据库
列式数据库,又称为列存储数据库,是一种为了高效读写大量数据而设计的数据库系统,它与传统的行式数据库相对,将数据按列而不是按行存储。这种存储方式特别适合于分析大规模数据集,因为它可以快速聚合同一列的数据,优化了磁盘I/O性能并减少了数据读取量。在列式数据库中,每一列的数据紧密排列存储,且通常会对这些数据进行压缩,这样既节省了存储空间,又加快了查询速度。
列式数据库的主要优势在于其对数据仓库和在线分析处理(OLAP)查询的支持。它们能够高效地执行复杂的查询,如计数、求和、平均值等聚合操作,这些操作通常只需要访问表中的少数几列。因此,列式数据库非常适合用于商业智能、大数据分析、科学计算等领域,这些领域通常涉及到对大量数据进行快速读取和分析。
流行的列式数据库包括Apache Cassandra、Apache HBase和ClickHouse等,它们在处理大数据和实时分析方面展现出巨大的潜力。在本文中将介绍HBase(第四章)和ClickHouse(第五章)两个当下比较流行的产品。虽然列式数据库在数据写入方面可能不如行式数据库高效,但通过批量操作、延迟写入和其他优化技术,它们能够实现对写入性能的改进。总的来说,列式数据库是那些需要高效进行数据分析和报告的应用的理想选择,尤其是当工作负载涉及到大量数据且主要是读取操作时。
1.1.4 文档数据库
文档数据库,是一种以文档为中心的非关系型数据库(NoSQL),它允许存储、查询和管理基于文档格式的数据。文档在这里指的是类似于JSON、XML或BSON这样的数据结构,这些结构能够嵌套、具有层次性,并且可以存储多种数据类型。这种灵活性使得文档数据库特别适合于处理多变的数据模式和非结构化或半结构化数据。
文档数据库的主要优势在于其灵活性和直观性。它们不需要预定义的数据模式,因此开发者可以轻松地添加或删除字段,而不影响现有的数据。此外,由于数据模型的直接性和自描述性,开发者可以更快速地理解和操作数据,从而加快开发速度。文档数据库通常还提供强大的查询语言和索引功能,使得对文档内的数据进行查询和分析变得高效且灵活。
流行的文档数据库如MongoDB、Couchbase和Amazon DynamoDB等,非常适合内容管理系统、电子商务应用和移动应用,这些应用中的数据经常发生变化且结构多样。在第六章将介绍MongoDB。在第七章介绍了当下流行的搜索引擎ElasticSearch,但ElasticSearch也倾向于被归类为文档数据库或NoSQL数据库。尽管文档数据库提供了高度的灵活性和扩展性,但在需要复杂事务处理和关系型数据强一致性的场合,它们可能不如传统的关系型数据库。在选择文档数据库时,开发者和架构师需要仔细考虑应用的具体需求,包括数据模式的稳定性、查询的复杂度以及系统的扩展需求。
1.1.5 图数据库
这是一种不太常用的数据库类型,图数据库善于处理高度互联的数据。图数据库是专门设计来处理图形结构数据的数据库,它们优化了节点、边以及节点之间关系的存储和查询。在图数据库中,数据模型本质上是一个图,即由点(节点)和线(边)组成的集合,能够直观地表示和存储数据项之间的多对多关系。这种结构特别适合社交网络、推荐系统、知识图谱、网络分析等场景,这些场景中的数据关系复杂且密集。
图数据库的一个关键优势是它们能够高效地执行深度连接查询和图遍历,这在关系型数据库中可能非常耗时和复杂。它们通过优化邻接数据的存取速度来实现这一点,使得即便是在大规模网络中也能快速发现复杂的模式和关系。此外,图数据库通常具有灵活的模式,可适应不断变化的数据模式,而不需要进行昂贵的模式迁移。
流行的图数据库实现包括Neo4j、OrientDB和Amazon Neptune等。在第八章讨论了流行的图数据库Neo4j。它们提供了丰富的API和查询语言,如Cypher和Gremlin,使得开发者能够轻松构建复杂的图查询和算法。虽然图数据库在处理高度关联的数据方面表现出色,但它们在大规模的数据分布式处理和存储方面可能不如某些专为此目的设计的数据库系统。在选择图数据库时,应仔细考虑实际的业务需求,特别是数据的关联性和查询的复杂性。
1.1.6 时序数据库
时序数据库是专门为处理时间相关数据而设计的数据库系统,它优化了时序数据的存储、查询和分析。时序数据是随时间连续记录或采样的数据点集合,典型的例子包括股票市场数据、物联网传感器数据、应用性能指标等。这类数据库通过对时间标签的优化索引,提供了对时间序列数据高效写入、查询和压缩存储的能力。
时序数据库的核心优势在于它们对数据的时间属性有着原生支持,可以快速处理大量按时间顺序排列的数据点。它们通常提供时间窗口查询、时间聚合以及时间序列的快速降采样和升采样功能,这些特性对于时间依赖性分析至关重要。此外,时序数据库能够高效地处理高吞吐量和大数据量的写入操作,这对于实时监控和事件驱动的应用尤为重要。
流行的时序数据库包括InfluxDB、Prometheus和TimescaleDB等,它们被广泛应用在金融分析、工业监控、资源监测和运维监控等多种场景。在第九章介绍了用于运维监控的时序数据库Prometheus。由于时序数据库的设计专注于时间维度,它们可能不如通用数据库在处理多维复杂查询方面灵活。因此,在选择时序数据库时应考虑应用是否对时间数据的处理有高效率的需求。总之,时序数据库是处理时间敏感数据的理想解决方案,能够为业务分析和决策提供强有力的时间维度支持。
1.1.7 向量数据库
向量数据库,作为一种专注于处理高维度数值向量的非关系型数据库(NoSQL),在近年来随着人工智能和机器学习的飞速发展而获得广泛关注,是推动AI应用发展的关键技术之一。这类数据库的核心在于它们能够存储和管理由多维度特征构成的数据点,即向量,这些向量通常代表图像、文本、声音或用户行为等非结构化数据的深度特征。向量数据库最大的优点在于其能够通过先进的索引技术和相似性搜索算法,高效地执行基于内容的检索和匹配操作,如快速找到与给定图像特征相似的图像或寻找语义内容相近的文本。
此类数据库设计用于优化大规模向量数据的存储和查询性能,支持各种距离和相似性度量标准,如欧氏距离、余弦相似度等,以满足不同应用场景的需求。向量数据库的应用领域广泛,包括但不限于推荐系统、图像和视频分析、自然语言处理和生物信息学等,它们在这些领域中为实现复杂的相似性搜索和数据分析提供了强大的支持。
流行的向量数据库包括Milvus、Faiss、Pinecone和Chroma等,它们在不同的场景下提供了丰富的功能和优化,满足了从基础研究到商业应用的广泛需求。最后介绍一下当下流行的用于大模型的向量数据库Milvus。尽管向量数据库面临着数据规模和查询效率的挑战,但随着技术的进步和优化,向量数据库正逐渐克服这些挑战,为各种先进的AI应用提供强大的数据支持,展现出广阔的发展前景。
1.2 DB-Engines数据库排行榜
以下是2024年6月份的DB-Engines数据库排名列表,这是一个专门收集和呈现数据库管理系统信息的数据库引擎排名,里面列举了超过 300 多种数据库产品,大部分的开源和商业数据库都在列,排名中的位置通常能反映出它的使用情况。

DB-Engines排名的数据依据 5 个不同的因素:
2. MySQL
MySQL是一种广泛使用的开源关系型数据库管理系统(RDBMS),它基于SQL(结构化查询语言)进行操作,允许用户创建、维护和查询数据库。作为Web应用的后端数据库,MySQL因其稳定性、可靠性和简易性而受到开发者的青睐。

2.1 优点
2.2 缺点
2.3 最佳实践
2.4 应用场景
3. Redis
Redis(Remote Dictionary Server)是一个开源的高性能键值存储系统,通常被用作缓存。它支持多种类型的数据结构,如字符串(strings)、列表(lists)、集合(sets)、有序集合(sorted sets)、哈希表(hashes)、位图(bitmaps)、超日志(hyperloglogs)以及地理空间(geospatial)索引半径查询。Redis主要用于需要高速读写操作的场景,数据存储在内存中,但也可以持久化到磁盘,以保证数据安全。

3.1 优点
3.2 缺点
3.3 最佳实践
3.4 应用场景
4. HBase
HBase是一个开源的、非关系型的、分布式的列存储数据库,设计用于利用廉价的硬件提供高吞吐量的随机读写访问。它是Google的Bigtable论文的开源实现,能够在大规模分布式环境中高效存储和管理海量数据。

4.1 优点
4.2 缺点
4.3 最佳实践
4.4 应用场景
5. ClickHouse
ClickHouse是一个用于联机分析处理(OLAP)的开源列式数据库管理系统(DBMS)。它是为实时生成的数据分析而设计的,能够以极高的速度执行实时查询和报告任务。由于其列式存储架构,ClickHouse特别适合处理大规模数据集,能够高效地执行数据压缩和快速的数据检索操作。

5.1 优点
5.2 缺点
5.3 最佳实践
5.4 应用场景
6. MongoDB
MongoDB是一种流行的开源NoSQL数据库,专为简化开发和扩展而设计。作为一个面向文档的数据库,MongoDB允许开发者以动态的模式(称为BSON)存储数据,这意味着与传统的关系型数据库相比,你可以存储更复杂的数据类型更为灵活。MongoDB设计用于处理大量的数据和高并发的读写操作,适用于各种规模的企业和多种应用场景。

6.1 优点
6.2 缺点
6.3 最佳实践
6.4 应用场景
7. ElasticSearch
ElasticSearch(ES)是一个基于Apache Lucene的强大开源搜索和分析引擎。虽然它提供了类似于关系型数据库的一些功能,比如数据存储、索引、查询等,但它并不是传统意义上的关系型数据库管理系统(RDBMS)。ES更倾向于被归类为一个NoSQL数据库或文档数据库,因为它支持非结构化数据的存储和查询,并且具有高度可扩展性和灵活性。它能够快速地、在近乎实时的情况下存储、搜索和分析大量数据。ElasticSearch是高度可扩展的,支持分布式架构,可以轻松处理PB级别的数据。通过其RESTful API,用户可以轻松地执行和组合多种类型的搜索 —— 全文搜索、结构化搜索 —— 以及进行复杂的分析。

7.1 优点
7.2 缺点
7.3 最佳实践
7.4 应用场景
8. Neo4j
Neo4j是当前最流行的图数据库之一,它用图形结构存储数据,这种结构包含节点(Node)、关系(Relationship)、属性(Property)。Neo4j特别适合处理复杂的关系和深度连接查询,提供了强大的图形查询语言Cypher,使得查询和处理图数据变得非常直观和高效。

8.1 优点
8.2 缺点
8.3 最佳实践
8.4 应用场景
9. Prometheus
Prometheus是一个开源的监控和警报工具,专为可靠性和快速诊断而设计。它通过定时抓取被监控服务的指标数据,存储这些数据为时间序列,然后通过其查询语言PromQL进行查询、分析和警报。Prometheus广泛应用于云原生环境,尤其是与Kubernetes的集成,使其成为监控容器和微服务架构的首选解决方案。

9.1 优点
9.2 缺点
9.3 最佳实践
9.4 应用场景
10. Milvus
Milvus是一个开源的向量数据库,旨在为机器学习、人工智能和相似性搜索提供高效、可扩展的解决方案。它支持多种索引算法,可以处理亿级别的数据集和实时的数据插入,是企业和研究机构处理大规模向量数据的理想选择。

10.1 优点
10.2 缺点
10.3 最佳实践
10.4 应用场景
11. Polyglot Persistence
在实际环境中,多种数据库经常一起使用。使用单一的关系数据库虽仍然很常见,但当前流行的做法是同时使用几种数据库,利用它们各自的长处,创建一个生态系统,比其各部分的功能总和更强大、更全面、更健壮,《七周七数据库》的作者称这种做法叫做多持久并存(Polyglot Persistence)。使用多持久并存,可以在同一系统中利用多种数据库的优势,以实现更高效的数据存储和管理。
11.1 常见多持久并存场景
互联网业务的主要场景是通过MySQL进行数据存储,并且为了应对高并发场景,缓存也是必不可少的。因此,最常用的解决方案就是结合MySQL和Redis。

适用于日常主要场景:
11.2 海量数据多持久并存场景
数据量级在10亿以上,并且每天新增的数据量仍在千万级别以上持续增长。由于数据量非常大,需要考虑存储成本和扩展性,并且在生产系统中,需要能够支持海量数据的秒级查询。
11.2.1 HBase + ElasticSearch
针对查询场景简单且查询QPS不高,可考虑直接使用HBase。比如仅根据RowKey取Value场景直接读取即可。对于列较少且有固定查询模式的场景,若是直接引入ES/Solr,有”杀鸡用牛刀”之感,其实可以维护二级索引或者采用phoenix(支持SQL)。
虽然HBase之上有很多开源组件,可以搞二级索引、phoenix可以支持SQL,但是当业务越来越复杂,数据量越来越大的时候,使用HBase构建复杂的查询就很吃力了,甚至很多指标无法完成,毕竟HBase本身就不是为复杂查询而生的,太折腾它也不好,所以这种情况下ES就起了关键性因素,使用HBase存储海量数据,使用ES解决复杂查询,发挥各自中间件的最大优势。面对海量数据的低成本存储+高效检索的需求,业界通常使用HBase + ElasticSearch的组合方案。
此时可能有人会想,直接将所有字段都放入ES,岂不是都不用引入HBase了?所有字段都放入ES,在不考虑硬件成本,内存无限大的情况下,其实也可以,但是在现实场景下,必须考虑成本,就意味着内存是有限的。在内存资源有限的情况下,如何最大发挥ES的性能,其实算是使用ES的一种优化方案(ES很强大,需要深入掌握ES,可以根据不同场景进行优化设计),下面我们来看一下。
比如说现在有一行数据,orderNo、accountNo、receivedTime …等有400个字段,但是现在搜索,只需要根据accountNo、 receivedTime…等100个字段来搜索,如果往ES里写入一行数据的所有字段,就会导致75%的数据是不用来搜索的,但结果是占据了ES机器上的 filesystem cache 的空间,单行数据的数据量越大,就会导致 filesystem cahce 能缓存的数据就越少,缓存的数据越少查询性能就会越差,所以仅仅只是写入ES中要用来检索的字段就可以了。从ES中根据条件查询获取到每页的docId,然后根据docId到HBase里去查询每个docId对应的完整的数据(ES中的docId对应HBase里的RowKey),再返回给客户端。从ES检索可能花费50ms,然后再根据ES返回的docId去HBase里查询,查10条数据,可能耗费30ms,每次查询就是80ms,若是几T的数据全都存ES,可能每次查询都是1000~5000毫秒。总结一下就是“各司其职”,HBase就用来存储,ES就用来做索引。
另外,在数据量小的情况下,单ES架构的性能是优于HBase + ES架构的,但是数据量小,建议直接用MySQL。

11.2.2 HBase + Redis + ElasticSearch
HBase底层架构的设计决定了HBase对高并发查询场景支撑不足,为了扛住高并发场景,也需要引入缓存,解决方案就是HBase + Redis。若此时查询复杂度也高,则再引入ES,解决方案就变成了HBase + Redis + ES。

11.3 物流交易订单中心多持久并存实践
在订单中心的建设初期,系统的设计往往以简单有效为原则。当日均单量不足10万时,系统的处理需求相对较低,因此一个基于MySQL的关系数据库配合Redis作为缓存的架构通常可以满足需求。MySQL提供了可靠的事务支持和一致性保证,而Redis则可以提升读取性能,缓解数据库的压力。
随着业务的快速增长和日均单量的剧增至1000万以上,原有架构开始面临性能瓶颈和成本问题。此时,架构需要进行升级以应对以下挑战:
海量数据存储:原有的MySQL可能无法高效地处理海量数据。此时,引入HBase分布式数据库,它擅长处理大规模数据集,提供了线性扩展的能力,并且HBase硬件成本相对MySQL极低。
复杂查询优化:随着查询复杂度的提升,MySQL可能无法满足快速响应的需求。ElasticSearch (ES) 作为一个搜索引擎,可以提供快速的全文搜索和复杂查询功能。
成本控制:海量数据带来硬件成本的突增,为了控制成本,高成本的MySQL从事务处理核心转移到大数据抽数场景,降低MySQL配置和启用MySQL压缩存储。待数据入湖后,销毁MySQL,可节省70万元/年。
削峰写入:为了平滑高峰期的数据写入压力,继续使用Redis作为缓存,并引入消息队列以实现异步处理订单提升系统吞吐量,同时流量削峰减轻直接请求ES、HBase、数据库的压力。
随着业务的发展,订单中心的架构从一个单一数据库和缓存的简单模型,逐步演变为一个包含专门搜索引擎、分布式存储和缓存削峰的复杂系统。每一次架构的调整都是为了解决具体的痛点,提高系统的可扩展性、稳定性和成本效率。

从上图可以看出,订单中心早期的架构对应是11.1章节的场景,经过演进,架构升级到11.2.2章节的场景,架构的演进是一个持续的过程,不是一蹴而就的。
关于当前订单中心多持久并存架构的更多细节,建议查阅《交易日均千万订单的存储架构设计与实践》,该文章详细介绍了相关的设计与实践经验。
12. 结束语
在数字化时代,数据已经成为企业的核心资产,如何有效地存储、管理和分析这些数据是每个企业面临的巨大挑战。本文详细探讨了九种不同类型的数据库,包括关系型数据库(RDBMS)、键-值存储数据库、面向列的数据库、面向文档的数据库、图数据库、时间序列数据库(TSDB)和向量数据库。通过对这些数据库的特点和应用场景的深入分析,希望为大家在选择数据库时提供有价值的参考。
关系型数据库(如MySQL)以其严格的事务性和一致性,长期以来在企业应用中占据主导地位。然而,随着互联网和大数据的兴起,非关系型数据库(NoSQL)因其灵活的数据模型和良好的扩展性,逐渐在特定场景下获得了广泛应用。键-值存储数据库(如Redis)以其高性能和简单的数据模型,适用于缓存和会话管理等场景;面向列的数据库(如HBase和ClickHouse)则在处理大规模数据分析和实时查询方面表现出色;面向文档的数据库(如MongoDB和ElasticSearch)提供了灵活的数据存储和查询能力,适合处理半结构化数据;图数据库(如Neo4j)在处理复杂关系和图形数据时具有独特优势;时间序列数据库(如Prometheus)则专为处理时间序列数据设计,广泛应用于监控和性能分析;而向量数据库则为AI和机器学习应用提供了高效的数据索引和检索能力。
数据库选型不仅需要考虑技术需求,还需综合考虑团队的技能栈、成本预算、社区支持和生态系统。每种数据库都有其独特的优势和适用场景,理解这些特点并根据具体业务需求做出明智的选择,是每个数据库专家和技术决策者的重要任务。
在本文的结尾,希望大家能够通过对各种数据库的了解,掌握它们的独特优势和适用场景,从而在面对不同的使用场景时做出最佳决策。无论是选择传统的关系型数据库,还是探索新型的NoSQL数据库和专用数据库,都应基于具体的业务需求和技术环境,充分发挥每种数据库的优势,为企业的数据管理和分析提供强有力的支持。
未来,随着技术的不断进步和数据量的持续增长,数据库技术也将不断演进。鼓励大家持续关注数据库领域的新发展,不断学习和实践,以应对不断变化的技术环境和业务需求。通过合理的数据库选型和优化,企业可以更好地利用数据驱动业务创新和增长,迎接数字化时代的挑战和机遇。
13. 相关文档和推荐读物
官方文档是学习任何技术的最佳起点,建议阅读官方文档。
以下是一些优秀书籍:
《高性能MySQL》- Baron Schwartz, Peter Zaitsev, Vadim Tkachenko
《Redis in Action》- Josiah L. Carlson
《HBase in Action》- Nick Dimiduk, Amandeep Khurana
《ClickHouse原理解析与应用实践》- 朱凯
《MongoDB权威指南》- Kristina Chodorow
《Elasticsearch权威指南》- Clinton Gormley, Zachary Tong
《Graph Databases》- Ian Robinson, Jim Webber, and Emil Eifrem
《Prometheus: Up & Running》- Brian Brazil
《Vector Databases Unleashed: Navigating the Future of Data Analytics》 - Raj C Vaidyamath
