本节书摘来自异步社区出版社《解读NoSQL》一书中的第2章,第2.2节,作者: 【美】Dan McCreary(丹•麦克雷) , Ann Kelly(安•凯利),更多章节内容可以访问云栖社区“异步社区”公众号查看。
2.2 将应用分层以简化设计
了解分层应用在整体架构上的作用对于客观地评估一个或者多个应用架构来说是很重要的。当功能分布到每一层时,你可能无法立即做到管中窥全豹。如果想客观公正地比较系统之间的差异,最好的方法是进行整体分析,看看所有架构层次的应用是如何满足系统需求的。
在架构中采用应用分层的思想可以构建弹性的、可重用的应用。采用应用分层的思想,当必须做出一些改动时,可以选择新增或者修改某一个特定的层次,而不是重写它。在接下来的例子中,通过比较关系型数据库系统和NoSQL系统,可以发现NoSQL应用的功能分布是不同的。
当应用设计者开始考虑存储持久化数据的软件系统时,他们有很多选择。其中一个就是决定是否需要将整个应用的功能通过应用层进行划分。确定每一个应用层将应用分拆为架构独立的组件,有助于软件设计者决定每一个组件需要承担的功能。这种分离的特性有助于设计者向其他人解释系统时将复杂问题简单化。
如图2-2所示,应用层通常被描绘为分层蛋糕的样子。图中,用户事件(如用户点击网页上的按钮)在用户接口层触发代码运行。用户接口层的输出或响应将被发送至中间层。中间层可能会通过发送信息返回至用户接口层的方式进行响应,也可能访问数据库层。数据库层会运行查询并将查询结果返回至中间层。接着中间层将会利用收到的信息产生报表并将报表发送至用户。无论是使用微软的Windows、苹果的OS X,或者是点击Web浏览器的HTML链接,这一过程是相同的。
图2-2 应用层通常用来简化系统设计。NoSQL运动主要关注在最小化整个系统的性能瓶颈,这意味着有时需要将某些关键组件移出所在的应用层并将其移动至另一个应用层
在设计应用时,很重要的一点是对将功能分层的利弊进行权衡。因为关系型数据库已经存在了很长一段时间,也非常成熟,数据库厂商通常会在数据库层上增加功能并和它们自己的软件一起发布,而不是复用已经开发或者交付的组件。而NoSQL系统的设计者知道他们的软件必须能与其他应用一起在复杂的环境中工作,重用和无缝的接口是必需的,所以他们倾向于构建小巧独立的功能,图2-3展示了RDBMS和NoSQL应用的差异。
图2-3 RDBMS和NoSQL系统的应用层次结构对比。左边的RDBMS为了保证安全性和事务完整性,把许多功能放置在数据库层,中间层用来将对象转换为表中的数据。右边的NoSQL系统并不使用对象-关系映射的概念;它们将一些数据库的功能移动到中间层,并利用了一些额外的服务
在图2-3中,我们比较了关系型数据库和NoSQL将应用的功能分布至中间层和数据库层的方法。正如你看到的,无论选取哪种方法,都需要系统架构顶端的用户接口层。在关系型数据库中,大多数应用的功能都能在数据库层找到。而在NoSQL应用中,大多数应用的功能都集中在中间层。此外,NoSQL系统还利用了更多的服务来管理二进制大对象数据(键值存储)、排序全文索引(Lucene索引),以及执行批处理作业(MapReduce)。
一个好的NoSQL应用设计在考虑将功能放置在数据库层还是中间层时,一定是仔细地分析了两种方案的优势和劣势。NoSQL解决方案允许你仔细考虑所有选项,并且如果需求包括了高扩展性组件,可以选择保持数据库层的简单性。在传统的关系型数据库系统中,数据库层的复杂性影响了应用的整体扩展性。
记住,如你只专注于某一个单独的层次,你将不会得到一个客观的比较。当在RDBMS与NoSQL系统之间进行权衡分析时,同样需要考虑数据的重分区对各个层次功能的影响程度。这个过程比较复杂并且需要熟悉RDBMS和NoSQL的架构。下面列举一些优势和劣势供做权衡分析时参考。
RDBMS的优势如下。
数据库级别的事务ACID特性让开发变得容易。
使用视图的基于行列细粒度的安全性阻止了未授权用户查看和修改。
大多数SQL代码都可以移植到其他SQL数据库,包括一些开源产品。
预先定义的数据类型和约束条件在数据库加载数据之前将验证数据的有效性,从而提升数据的质量。
用户已经对SQL和实体-关系的设计思想非常熟悉。
RDBMS的劣势如下。
对象-关系映射层很复杂。
实体-关系模型必须在测试之前建立,这会拖慢开发速度。
RDBMS对于连接操作不能动态扩展。
可以将数据分片至多个服务器,但是需要进行应用级别的开发并且效率低下。
全文搜索需要第三方工具。
将高度灵活的数据保存到结构化的表中非常困难。
NoSQL的优势如下。
在ER模型完成之前就可以用拖曳工具加载测试数据。
模块化的架构使组件之间可以交换。
可通过在集群中增加新处理节点来进行线性扩展。
通过自动分片可降低开销成本。
整合的搜索函数提供了高质量的排名搜索结果。
不需要对象-关系映射层。
存储变化性强的数据非常简单。
NoSQL的劣势如下。
在数据库级别,ACID事务只能在一个文档内完成,其他事务必须在应用层完成。
文档存储在元素级别不提供细粒度的安全性。
NoSQL系统对于很多员工来说是全新的,需要额外的培训。
文档存储有自己独有的非标准查询语言,这妨碍了可移植性。
文档存储不能与现有的报表和OLAP工具一起工作。
理解应用层中存在的功能的作用对理解应用如何执行是很重要的。另一个需要考虑的重要因素是存储,如RAM、SSD和磁盘会如何影响你的系统。
数据库集群技术
NoSQL业界经常提到由处理节点组成的数据库集群。一般来说,一个集群都是由一些放置在机架上的商用计算机硬件组成,如图2-4所示。
图2-4 一些应用于分布式数据库集群中的术语。集群是由一系列被称作节点的处理单元构成,分机架组织在一起。节点都是商用处理计算机,每一台都有自己的CPU、RAM和磁盘 每一个独立的计算机称为一个节点。
本书的初衷,除非我们讨论的是定制的硬件,否则我们都将节点定义为包含一个被称为CPU的逻辑处理器的处理单元。每个节点都有自己的本地RAM和磁盘。CPU某种程度上来说是由各种各样的芯片组成,每一个CPU都包含了多个内核处理器。磁盘系统也由多个独立的驱动器组成。
节点分机架组织在一起,一个机架内的节点具有很高的连接带宽。数据中心内的多个机架组合在一起形成一个数据库集群。一个数据中心可能包含多个数据库集群。正因为如此,我们注意到一些NoSQL事务必须在两个不同地理位置的节点存储相关的数据才会被认为成功。