- 论坛徽章:
- 0
|
本帖最后由 dremi 于 2012-05-10 23:26 编辑
最近研究了一下分布式内存数据网格,资料比较少,大部分可以借鉴的都是分布式数据库,内存数据库,分布式缓存。
内存数据网格(in-memory data grid)
网格式分布式存储。
所有数据存于内存(RAM)。
存储服务器数量可随时增减。
数据模型是非关系模型,而是基于对象模型。
在网格内的某一台存储服务器的启动和关闭不会影响到网格内的其他服务器。
当前内存数据网格的开源有:
hazelcast, 一个java开源分布式内存网格框架,支持节点动态,数据通过key-value方式存储。支持备份,某个节点故障,数据不丢失。
infinispan
Infinispan 是个开源的数据网格平台。它公开了一个简单的数据结构(一个Cache)来存储对象。虽然可以在本地模式下运行Infinspan,但其真正的价值在于分布 式,在这种模式下,Infinispan可以将集群缓存起来并公开大容量的堆内存。这可比简单的复制强大的多,因为它会为每个结点分配固定数量的副本——服 务器故障的一种恢复手段——同时还提升了可伸缩性,这是由于存储每个结点所需的工作量是与集群大小息息相关的。Infinispan提供了一种简单的机制来利用大容量的堆内存。如果对每个结点维护一个拷贝,假如集群当中有100个结点,每个结点分配2GB的堆内存, 那么网格中的任何实例都能使用多达100GB的空间,这可都是内存,显然速度会非常快。同时Infinispan还兼容于JTA,这样它就能很好地处理事务 了。我们还有一个超级强大的异步API,它可以保证同步的网络调用以及异步调用的并行性及可伸缩性。比方说:Future f = cache.putAsync(k, v) 可以阻塞线程,再调用f.get()可以让网络调用继续进行或是忽略掉f。更为重要的是,线程还可以做别的事情,这一点非常有用。然后再回来通过调用 f.get()来检查该网络调用是否能继续进行。可以将其看作是NIO与传统的阻塞性IO之间的关系。
非开源的软件有:
Coherence , Oracle的一个内存数据网格平台。
GigaSpaces XAP ,一个内存数据网格。
现在分析中有一个疑问:上面存储方式都采用key-value方式进行存储,在整个集群节点上,通过hash算法,尽量把数据均匀分布在不同的节点上,保证数据分布均匀。
但每个节点固定共享的内存是有限的,例如2G,对于某种key,如果value值很大 例如1G,这样数据可能很快就把某个节点的内存占用了,而其他节点可能还是相对空闲的,并且数据
可能还分布不均匀。是否需要对该value值进行拆分。例如把1G数据拆分成1G/2M=512块。
对于这种场景,有没有人对于上面开源或者下面非开源软件是怎么解决的。
这几天看了memcache好像一个记录最大支持1M,即key-value中value最大支持1M, redis最大支持2G。
在这里请教大侠们?
|
|