Infinispan's GridFileSystem--基于内存的网格文件系统,互联网营销
Infinispan是JBoss Cache缓存框架的后续项目,它是一个开源的数据网格平台,用于访问分布式状态的群集节点。GridFileSystem(网格文件系统)是一个全新的实验性的API,这些API使Infinispan后端的网格数据像文件系统一样展示出来。这一系列API继承了JDK的File,InputStream和OutputStream类,创建了相应的:GridFile,GridInputStream和GridOutputStream类。还有一个帮助类GridFilesystem,也被包含在这个框架里面。这些API在Infinispan 4.1.0版本中就可以使用了(从4.1.0.ALPHA2 版起)。
GridFilesystem包含两个Infinispan缓存器:一个用于元数据缓存(通常是完全复制),另外一个是用于实际数据的缓存(通常是分布式)。前一个复制缓存器使每个节点在本地都有元数据信息,像列出文件列表之类的任务就不必使用RPC远程过程调用了。后一个是分布式缓存器,当存储空间的容量用光的时候,就需要一种可扩展的机制来存储这些数据。所有的文件都被分块,每个块都存储为一个缓存项。
在这篇文章里面我们关注的特性是Infinispan的分布式模式。该模式增加了“分布式”特性,这是一种基于哈希一致性的技术。JBossCache框架只支持“复制”模式(就是在群集里面的每一个节点都向其它节点复制所有的数据)。
完全复制技术可以很好的用于小型群集,或者是在每个节点的存储数据量都相对较小的情况。在群集中,当每个节点都向其它节点复制数据的时候,每个节点的平均数据存储容量都与这个群集的大小以及数据的容量有关。这种复制的优点在于它通常只在本地节点读取数据,因为每个节点都拥有这些数据;另外,当群集中有新节点加入或者需要移除现存节点的时候,它也不需要重新进行负载均衡。
另一方面,当你需要快速访问大型数据集合,并且又无法忍受从磁盘(譬如:数据库)中检索数据时,内存网格文件系统将是一种更好的解决方案。
在之前的文章中,我们讨论了ReplCache,它使用了基于哈希一致性的分布式技术实现了一个网格数据容器。从某种程度上说,ReplCache就是Infinispan分布模式的原型。
在Infinispan中,不管有没有冗余备份,数据都可以存储在网格中。举个例子,只有将Infinispan的配置项设置为distributed cache mode(分布缓存模式),numOwners(所有者数量)设置为1,数据D才会被存储到网格中。在这种情况下,基于哈希一致性算法,Infinispan只会选择一台服务器节点来存储数据D。如果我们设置numOwners为2,那么Infinispan就会选择两台服务器来存储数据D,以此类推。
Infinispan的优势在于它提供了聚合的网格内存。例如,假设我们有5台主机,每台主机都有1GB的内存,然后我们将参数numOwners设置为1,那么我们就总共有5GB内存容量-这显然降低了开支费用。即便使用冗余备份-比如,设置numOwners为2-我们的配置也有2.5GB的内存容量。
然而有一个问题:如果我们有很多1K大小的数据项,却只有少量的200MB大小的数据项,这将造成了数据分布不均衡。一些服务器因为存储那些200MB的数据项,差不多把内存堆消耗殆尽,而另外的服务器的内存有可能还没有使用。
还有一个问题是,如果当前数据项的大小超过了所给的单个服务器的可用内存堆:譬如,当我们试图存储2GB的数据项时,操作就会失败,因为数据项大于服务器节点的1GB内存堆,调用Infinispan的方法Cache.put(K,V),就会引起OutOfMemoryException(内存溢出)错误。
要解决这些问题,我们要将一个数据项分成chunks(区块)并将它们分散存储到群集的节点中。我们将一个区块的大小设置为8K:如果我们把2GB的数据项分为8K大小的区块,终将在网格中得到250,000个8K的区块。在网格中存储250,000个相等的区块,当然比存储少量的200MB的数据项要更加均衡。
当然,我们不会加重应用程序员的负担,他们既不用在写入的时候把数据项切分成区块,也不用在读取的时候把区块合并恢复为数据项。但是,这种方法仍需要将整个完整的数据项保存在内存中,这是不可行的。
为了克服这点,我们使用了流:一个流(输入流或输出流)只处理单个项的数据子集。例如,与其将2GB的数据项写入网格,不如对输入文件迭代读取(譬如每次读取50K),再将其每次读取的少量数据写入到网格中。这样,不管什么时候,只需要占用50K内存容量就够了。
现在应用程序员可以编写代码(伪代码)将2GB的数据项存入网格中,如下面的列表1所示:
列表 1:存储数据项到网格中
相关文章