数据库会演变成分布式计算平台吗? - Nikita


“数据库”一词是否会在 5 到 10 年内慢慢演变成“分布式计算平台”?
随着无服务器市场的扩大,更多的数据库解决方案开始考虑模块化架构,其中系统的各个组件都是分开的。这允许为每个无服务器租户分配此类组件的一个实例,从而在用户之间提供清晰的分离。这种分解数据库并模块化的解决方案也是使其各个部分可被非数据库应用程序重用。

数据库 = 分布式系统的框架?

分布式数据库具有以下组件是很常见的:

  • 分布式存储:该组件有一个键值存储接口:Get(key)和Set(key, value),其中key和value是一些二进制字符串。这个组件对数据一无所知——它可以是表中的行、JSON 文档或其他东西。通常,该组件提供“耐用性”保证,这意味着在某些故障情况下数据不会丢失。这种情况的一个常见示例是“不到一半的服务器停机”。
  • 集群节点之间的通信: 该组件实现了某种通信协议,以便从一个节点向另一个节点发送和接收消息。
  • 计算模型该组件对用户的查询执行结果:例如,使用 SQL 请求的一组行。

在经典数据库(例如 PostreSQL)中,所有这些组件都在一个应用程序中实现。此类应用程序自行管理所有内容:控制存储、与集群中的其他节点通信以及计算 SQL 查询的结果。

在 MapReduce 系统(如 Hadoop)和其他一些数据库(如 Google BigQuery)中,各种数据库组件在物理上是分开的。一些集群节点专门用于存储。其他节点仅用于计算 SQL 查询的结果。如果 SQL 查询需要一些数据,它会通过网络从存储节点传输到计算节点。

分布式系统的特点
现在让我们想象我们想要创建一个新的分布式系统 - 一个监控各种指标的服务(如Prometheus)。根据对该系统的具体要求,我们可能需要以下内容:

  • 具有“持久性”保证的分布式存储我们需要将用户的指标存储在某个地方,并且我们不想因为数据中心停机而丢失有价值的数据。
  • 集群节点之间的通信监控系统可以部署在多个数据中心,以减少延迟并提高容错能力。我们系统的各种实例需要相互协调。
  • 计算模型首先,我们的系统必须接受存储新指标的请求。其次,它应该响应读取时间序列数据并生成监控图报告的请求。

编写这些组件中的每一个都是一项艰巨的任务。我们不仅需要编写代码和测试,还需要在生产中强化系统。后者通常会导致发现意外错误和设计效率低下。

现在让我们回到数据库。它们拥有我们构建分布式系统所需的所有组件。这些组件已经被数千种不同的工作负载实施、测试和强化。更重要的是,这些组件中的每一个都可以与数据库本身分离并单独使用。

这基本上意味着数据库可以用作构建新分布式系统的框架。

案例1:YDB
YDB是一个在Yandex开发的分布式数据库。它提供了横向可扩展性和强大的一致性保证。

在引擎盖下,YDB使用actor模型,Actor是一个并发的单位,它能够:

  • 接收来自其他Actor的消息
  • 向其他Actor发送消息
  • 启动新的Actor

Actor始终是单线程的,只能改变其内部状态。Actor没有共享状态的概念,这意味着所有的同步都是通过消息传递完成的。一方面,代码中不再有mutexes。另一方面,你不能再只是写到内存中让其他Actor看到它。

YDB对actor有一个特殊的名字--tablet。它是YDB的构建模块。SQL查询的执行,事务的协调,tablet的创建--这些任务都是由一个或多个tablet执行的。用这个帖子的术语来说,tablet是计算模型。

作为Actor,tablet需要发送和接收信息。在YDB中,有一个特殊的系统就是为此而创建的--它被称为互连。每个tablet都有一个ID,tablet可以用这个ID作为他们的地址互相发送消息。互联是一个用于集群节点之间通信的系统。

最后,tablet需要在某个地方存储它们的状态。例如,代表SQL表分片的tablet需要存储分配给它们的表行的范围。YDB有一个分布式存储,它可以存储任意的二进制blob,并有 "持久性 "保证。

拥有所有这些组件使得YDB不仅是一个数据库,也是一个通用的分布式计算平台。分布式系统的开发者可以通过创建一种新的平板电脑来编写自己的应用逻辑,并为自己的目的重用系统的其他部分。

免责声明:YDB被宣传为一个数据库解决方案。没有公布关于使用它作为分布式系统平台的公开文件。

案例2:Tarantool
Tarantool是一个用 Lua 编写的分布式系统应用服务器。在 Tarantool 中启动的 Lua 应用程序可以通过 API 访问以下组件:

  • 分布式事务数据库。该数据库支持 2 种操作模式 - 内存中和提交到磁盘。第二种模式使这个组件在本文中被称为分布式存储。
  • 通信协议称为 SWIM。它允许在集群节点之间发送和接收消息。

由于应用服务器本身制作了计算模型,因此我们拥有将 Tarantool 称为通用分布式计算平台所需的所有组件。

这听起来并不令人印象深刻。看起来 Tarantool 最初是为了成为这样一个平台而创建的,所以它符合所有标准也就不足为奇了。问题是,Tarantool 最初是作为一个数据库创建的,然后迅速发展成为一个成熟的计算平台。仅用了 2-3 年的时间这一事实非常出色,但它也显示了数据库解决方案如何演变为构建分布式系统的“框架”。