写点什么

探讨 NuoDB 数据库的架构—2

2013 年 12 月 20 日

在本文的第 1 部分,我们介绍了 NuoDB,并对它的几个主要特性进行了讲解:三层架构、对等的节点以及原子这个基本的数据单元。此外还讲述了版本控制、用以处理数据更新冲突的并发系统以及如何实现一致性。

运行中的事务

你现在已经熟悉了整体模型、内部的结构以及版本控制,接下来让我们看几个简单的例子,以帮助你更好地理解它们在实际中是怎样运用的。为了简单起见,假设有一个简单的数据库,包含两个事务引擎(TE)和一个存储管理器(SM),从这个简单配置着手研究,应该能够很简单地推导出更复杂的配置。

首先考虑一下原子是怎样被导入到这两个 TE 缓存中的。假设有一个原子存在归档中,但并不存在任何缓存中,当某个客户端连接到第一个 TE 并且启动一个需要这个原子的事务时,TE 就会在它的目录(Catalog)结构中进行查找,当它发现缓存中没有该数据时,就会到 SM 中去获取对象。这时,目录结构就会反映出原子已经处于第一个 TE 的缓存中了,并且该 TE 将被认为是相关数据的 Chairman(主持人)。

此时如果在第二个 TE 上启动一个事务,并且该事务需要同一个原子中的数据时,目录将会告诉事务可以在 SM 与第一个事务这两处找到该原子。虽然第二个 TE 可以自由地选择从哪里获取这个原子,但在实际过程中它总是会从第一个 TE 请求该原子,因为从内存中的拷贝获取原子速度更快。此时目录会相应地进行更新,显示原子已经存在于两个缓存中了。

接下来,让我们看看当原子中的数据产生变化时会发生些什么。举个例子,假设原子中的数据里的某一行被更新,为了接受这个更新,运行该事务的 TE 需要发送两条消息:一是对所有包含该数据拷贝的对等进程(在本例中就是指另一个 TE 以及 SM)发送一条等待更新的消息,二是对 Chairman 发送一条申请批准该更新的权限的消息。如果该更新发生于第一个 TE,那么第二条消息的发送会被短路(跳过),因为该 TE 本身就是 Chairman。两条消息都是异步执行的,这确保了事务能够继续执行。如果没有发生任何冲突情况,Chairman 最终会接受该更新,并发出响应。

如果两个事务同时尝试更新同一份数据,就会发生冲突。哪个事务能够首先将请求传递给 Chairman 就能够“获胜”,另一个事务最终会收到一条更新被拒绝的响应。此时这个失败的事务必须被回滚,随后再次尝试。

之前我曾经提过,NuoDB 对提交协议的支持很灵活,现在就会讲到它的应用了。为了将某个客户端的提交执行成功的信息发送回去,TE 必须始终确保 ACID 中的原子性、一致性和隔离性,但在持久性方面则拥有一定的灵活性。

在上面的示例中,更新消息将会异步地发送给所有拥有该对象拷贝的对等进程,包括 SM 在内。当消息在可靠的频道中传递时,除非我们等待确认消息的到来,否则是没有办法知道该 SM 的生存时间是否足够使该数据保持持久性的。作为数据库配置的一部分,你可以选择某个 TE 在报告提交成功前是否需要等待确认消息。由于你可以选择性地在运行时打开日志功能,实际上你所需要从 SM 返回的内容也就有了多个版本。

因此提交即可以表示消息已发送至所有的对等进程,也可以表示 SM 对本次改变的响应已进行日志记录或者已经被写入持久化的归档中,提交还可以表示至少有某些最小数量的 SM 发送了响应。这种方式给了你充分的灵活性,你可以决定在发生提交失败时你的持久化保证有多可靠,也可以决定你的分布式数据库运行有多快。

管理层

我之前曾提到过,NuoDB 有一个管理层,正是它支持了按需伸缩功能以及那些我们已见识过的迁移模型。每个主机系统都运行着一个本地的管理代理,代理构成了一个与数据库无关的对等网络。我们将这个互联主机的集合称为一个领域(Domain)。

领域包含一个单一的本地管理视图,这使得监控、管理及自动化等数据库活动变得简单。每个代理都负责它的本地主机,有些代理还会以中介(Broker)的角色运行,中介将整个领域展示为一个全局视图。所有中介都具有相同的知识与能力,因此如果你有多个中介在运行,你就可以访问管理与自动化接口。通过中介,你可以启动、停止或迁移数据库,改变你的配置,监控以及捕获 TE 和 SM 的日志记录,并运行一切按预计运行。

由于数据库就是一个运行中的进程集合而已,要在一台单独的主机上运行多个数据库也很方便。换句话说,管理层能够支持多租户(multi-tenant)系统的部署,每个租户运行着自己的数据库,它们在进行级别上进行了隔离,由自己的安全通道进行保护,并将数据存于自己的归档内。那么我们在一个单一的系统里可以创建多少个数据库呢?关于这一点在我们的博客中的“支持密集部署”文章中谈论了更多内容。

SQL 客户端在连接到数据库时,正是利用中介而得以找到 TE 的。这就使中介的功能像一个简单的负载均衡器一样,它了解领域中发生的一切,并能够智能地决定让客户端连接到哪里。

总结 NuoDB 的功能

了解了这些特性之后,让我们再回头看看我说所的云伸缩,我认为有一些用例是尤其适合 NuoDB 进行处理的。首先,它不仅支持自动化、按需水平伸缩,并且在拥有这些能力的同时还提供了高可用性(HA)。这种高可用性并非来自预先搭建的额外的故障转移功能,而是因为 NuoDB 能够监控系统错误,并且非常迅速地将新资源上线所带来的。这种反应迅速的高可用性意味着你不需要为了避免错误而带来多余的开销,并且在面临错误情况时依然能够保持良好的可用性。

其次,NuoDB 能够为跨越数据中心、并且分布在不同区域的数据库提供一个单一的逻辑数据库视图。这一点显然有助于高可用性,不仅如此,如果你的应用程序的用户来自不同地方,而且你希望让他们尽量连接到最接近他们的应用与数据,这一特性也非常关键。NuoDB 支持按地理位置分布,因为连接系统的客户端会乐于使用本地化的数据,因此尽管已经有了简单负载均衡、按需缓存以及区域间的异步分发功能,单一数据库这一特性仍然能够将大多数协调信息保持在一个本地区域内。

再次,因为 MVVC 为 NuoDB 提供了一个高效的快照隔离模型,它能够很好地支持对同一份数据的操作性与分析性的访问。换句话说,对频繁更新的数据进行运行时间较长的只读查询也不会产生冲突。这一特性有助于简化部署操作,否则部署时将不得不运行多个数据库,并且要不断地试图同步数据集。

最后,NuoDB 是全自动的。无论是按需水平伸缩,还是多租户的运行效率,我们都将数据库当做服务看待,它需要由简单的 SLA(服务级别协议)和策略进行驱动。这正是 NuoDB 的开发方向。

NuoDB 的下一步是什么?

我在本文中想表达的是,NuoDB 展现了一种全新的架构,在设计的最初就支持水平伸缩、敏捷式部署与自动化。可以很方便地加入新的主机并扩展系统能力,并且在出现大量的数据加载或者系统错误时能够自动地扩展,还能够跨多个数据中心扩展数据库。回到这篇文章开始的地方,我认为这些能力足以保证 NuoDB 是一个优秀的云伸缩数据库。

我们当前的工作是使自动化功能进一步简化。你可以通过简单的 SLA 详细地定义你对某个数据库的需求。无论你是否正打算在笔记本上进行开发,管理你公司的内部数据库或是在互联网上启用一个服务,这一特性让 NuoDB 使用起来就像一个服务一样简单。

我们正在扩展按地理位置分布的数据库的功能,它在你遇到错误时提供了更多灵活性,并且进一步保证了数据可用性。我们也在继续加强服务端编程模型,存储层并行的能力,并且改善了 SQL 与管理客户端的 API。我希望你能够去尝试一下,然后告诉我你的想法。

关于作者

Seth Proctor是 NuoDB 公司的 CTO,在可伸缩系统的研究、设计和实现上有超过十五年的经验。这些经验来自于网络、语言、操作系统、安全、数据库和分布式环境等领域,然后凝结成了 NuoDB 产品。在 NuoDB 之前,Seth 就职于 Nokia,负责内部私有云的架构。再往前,Seth 在 Sun 公司的研究实验室工作,和产品组、大学进行合作。

Seth 拥有八项跨多个技术领域的先进专利。还有五项专利正在等待批准,这五项专利都是 NuoDB 去中心化数据库部署中提升数据库效率和最终用户灵活度相关的。你可以从 www.nuodb.com 联系到他。

查看英文原文: Exploring the Architecture of the NuoDB Database, Part 2

2013 年 12 月 20 日 03:121481
用户头像

发布了 428 篇内容, 共 148.4 次阅读, 收获喜欢 20 次。

关注

评论

发布
暂无评论
发现更多内容

UML实践-食堂就餐卡系统

shangyu

极客大学架构师训练营

新基建时代区块链应用场景进化

CECBC区块链专委会

新基建 区块链技术 去中心化 产业落地

图解 Vue1.0 响应式系统

前端黑板报

源码分析 Vue Reactive

【玩转写作平台】如何让专业编辑青睐你的文章?被推荐置顶?

InfoQ写作平台官方

写作平台 InfoQ 玩转写作平台

架构师-第二周

师哥

奈学教育《百万架构师》课程大纲(1)

古月木易

极客大学架构师训练营

记录一下,我的记录之道

非著名程序员

学习 程序员 提升认知 工作效率

细说几种内聚

落英亭郎

高内聚 面向对象设计 面向对象思想

请描述什么是依赖倒置原则,为什么有时候依赖倒置原则又被称为好莱坞原则?

一叶知秋

第二周作业

Diven

如何看待年仅 28 岁的程序员实现财务自由,宣布从字节跳动退休?

非著名程序员

程序员 自由职业 程序人生 财富

高承实:区块链将对哪些场景赋能,如何赋能?

CECBC区块链专委会

区块链技术 产业 赋能

架构师训练营第二周课程感想1

tuuezzy

Java 架构师

软件设计原则作业

行下一首歌

极客大学架构师训练营

使用wavm运行wasi wasm程序

Foliage

XSKY发布S3 Console,助力企业轻松玩转非结构化数据可视化管理

XSKY融合存储

数仓大法好!跨境电商 Shopee 的实时数仓之路

Apache Flink

大数据 flink 流计算 实时计算 大数据处理

奈学教育《大数据架构师》课程大纲(1)

奈学教育

大数据

奈学教育《大数据架构师》课程大纲(1)

古月木易

大数据

【摘】Git-从零单排 04期

卡尔

游戏夜读 | 中国的游戏制作人

game1night

面向对象设计课程小结

行下一首歌

极客大学架构师训练营

第二周学习总结

师哥

二叉查找树的解读和实现

ytao

Java 数据结构

使用 Python 制作酷炫多彩的 Jenkins 插件词云图

donghui2020

jenkins wordcloud

依赖倒置总结

石印掌纹

Cache类接口隔离设计

石印掌纹

【面向对象】—依赖倒置、接口隔离

不二架构

极客大学架构师训练营 依赖倒置 接口隔离原则

奈学教育《百万架构师》课程大纲(1)

奈学教育

架构师

Spring源码-MVC启动

云淡风轻

spring

架构师训练营 - 第 3 课总结 -20200620- 软件设计

👑👑merlan

架构设计 软件设计 SOLID

InfoQ 极客传媒开发者生态共创计划线上发布会

InfoQ 极客传媒开发者生态共创计划线上发布会

探讨NuoDB数据库的架构—2-InfoQ