注意:本文翻译自howtojboss.com,原文作者为Shane K Johnson。
(本文翻译自howtojboss.com,原文作者为Shane K Johnson.)
为什么需要使用数据网格呢?本文旨在回到这个问题。
首先,它是进化的产物。
本地缓存 > 集群缓存 > 分布式缓存(数据网格)
使用分布式缓存的原因中包括了为什么使用缓存集群,而使用缓存集群的原因中包括了为什么使用本地缓存。(译注:这句话听起来有些奇怪。)
性能
访问本地缓存中的一个对象比直接访问远端数据存储引擎(例如数据库)要快很多。
直接访问一个已经存在的对象比从数据创建一个对象要快。
- 数据可能已经被存储在某(几)个地方了
- 数据可能需要通过多条查询来被获取
- 数据可能很复杂
另外,数据网格支持一些性能调优特性可能不被集群缓存所支持。例如,应用程序可以根据数据之间关联关系的紧密程度来确保相互关联的对象被保存在相同的缓存节点上。
更进一步,JBoss Data Grid还有一些自己所特有的性能调优方法,例如,它可以被配置成使用异步通讯并且提供了一个异步API。
一致性
本地缓存只有在应用程序被部署到单一的应用服务器上的时候才有意义,如果它被部署到了多台应用服务器上的话,那么本地缓存一点意义都没有,问题出在过期数据。集群缓存通过复制和让缓存数据失效来解决这个问题的。
除了支持JTA事务之外,数据网格还支持XA(分布式)和两阶段提交事务。
最后,JBoss Data Grid还支持额外支持某些其他数据网格产品可能不支持的保证数据一致性的特性,例如它支持事务处理恢复和基于版本号的更新或删除。
可伸缩性
集群缓存和数据网格的区别就在于可伸缩性。数据网格是可伸缩的。缓存数据是通过动态的分区被分发的。结果是,增加一个缓存节点即提高了吞吐量也提高了容量。
JBoss Data Grid通过使用一致性哈希算法,最小化了降低增加或删除一个节点所带来的节点(译注:推荐阅读这篇文章,或者这篇,是中文的),当增加或删除一个节点的时候,只有一部分数据被重新移动以达到平衡。因此,增加或删除一个节点只会对数据网格中的一部分节点产生影响,而其他算法就可能会影响到数据网格中的所有节点。
独立性
另一个集群缓存和数据网格之间的不同点即是否支持独立访问了。
如果把一个数据网格集成进应用程序里面的话,那么它就和应用程序耦合在一起了,也就是说,当扩展这个内置的数据网格的时候,同时也需要扩展应用程序,结果,扩展网格的同时,也增加了与之关联的应用程序(和应用服务器)的管理成本。
如下面的例子,一个Web应用被部署到多个应用服务器,并且它使用了内置的数据网格系统,当这个数据网格缓存了足够多的内容的时候,它就需要被扩容了。
这意味着什么呢?
需要安装并配置一个新的应用服务器,然后把应用也部署到这个新的应用服务器中。
这意味着?
IT人员需要多管理一个应用服务器,增加了管理成本。
- 如果应用被重新部署,内置的数据网格结点就被重新部署.*
- 如果数据网格升级,应用升序也得跟着升级(并且重新部署)
* 一个数据网格结点被重新部署的话,那么整个数据网格的拓扑结构会变化两次:一次是当结点被移出的时候,另一次是结点被部署的时候。并且,一旦数据网格拓扑结构发生变化,网格内的数据会在结点之间被移动以达到平衡的(尽管只是一部分数据)。所以,重新部署一个应用程序会对其他节点上运行着的数据网格产生影响,并且是两次。
如果数据网格需要被调整的运行更快而应用不需要呢?
部署应用到额外的应用服务器,尽管瓶颈并不在应用这里的话,这样合理吗?考虑了资源利用率了吗?仅仅为了增加数据网格的吞吐量就增加应用服务器,尽管会出现应用服务器空载,这样又合理吗?
解决方案就是使用独立的数据网格。
如下面的例子。同样的,一个Web应用被部署到多个应用服务器,但是,这里,它使用一个独立的数据网格系统。这时候,数据网格达到了它所支持的最大容量,需要被扩容。
这又意味着?
安装并配置一个新的数据网格节点就这么简单。
这样的架构允许数据网格能够独立于应用服务器而被独立扩展。也让数据网格的服务器能够被指派与应用服务器不同的资源。例如,一个数据网格节点服务器可能需要更多的内存但更少的CPU,相比于应用服务器的服务器。
这样的架构也让数据网格的基础架构能够独立于应用服务器的被惯例和调整。
数据网格能够独立于应用而被升级,应用的重新部署也不会对数据网格本身产生任何影响。
基础架构
对比基础架构中作为顶级系统的独立数据网格和内置于其他系统中的二级数据网格服务。
举个例子,一个企业有一个应用程序部门属于应用服务器集群中,并且这个应用程序内置了一个数据网格系统。接着,这个企业...
- 增加了一个基于ESB的服务,这个服务内部也内置了一个数据网格系统。
- 增加了一个门户,属于Portal平台,它也内置了数据网格。
- 增加了业务流程服务运行在规则管理系统之上,同样,它也内置了数据网格。
能看出问题吗?
现在,这个企业拥有多个独立的(内置)数据网格需要管理,这也就增加了管理成本。如果它们缓存的相同数据(例如客户信息),那么,就如同使用本地缓存的应用被部署到多台应用服务器一样,面临着数据过期的风险。如果数据被一个数据网格更新了,那么,在其他数据网格中的相同数据也就没有意义了,并且,如果都存储相同的数据的话,那么数据网格的效率也是个问题,这样,只有它们容量总和的一部分是有效被利用的,就如同缓存集群一样,存在重复数据。
解决方案就是使用在基础架构中作为顶级系统的独立数据网格服务。
当然,使用内置的数据网格服务也有其自身的优点,可能会也可能不会超过使用独立缓存服务所带来的好处。
最后,简要总结,使用数据网格的好处是它的可扩展性和独立性,并且,作为顶级基础设施组件,它能够同时提供本地缓存和集群缓存所能够提供的性能和一致性。