我正在评估Terracotta以帮助我扩展目前受RAM限制的应用程序。它是一个协作过滤器,每个用户存储大约2千字节的数据。我想使用亚马逊的EC2,这意味着我只限制了14GB的RAM,这使我的每服务器有效上限约为700万用户。我需要能够超越这个范围。

根据我的阅读情况,我认为Terracotta的群集堆大于每台服务器上的可用RAM。拥有30GB或更高的有效群集堆是否可行,其中每个服务器仅支持14GB?

每用户数据(其中大部分是浮点数组)变化非常频繁,可能每分钟数十万次。这些更改中的每一个都不必在它们发生时同步到集群中的其他节点。是否可以定期同步某些对象字段?

有帮助吗?

解决方案

我会说答案是肯定的。 Terracotta允许您使用大于单个JVM大小的集群堆,尽管这不是最常见的用例。

您仍然需要记住a)工作集大小和b)数据流量。对于a),有一些数据必须在内存中以在任何给定时间执行工作,并且如果该工作集大小>堆大小,性能会明显受到影响。对于b),必须将在群集堆中添加/更新的每个数据发送到服务器。当您在pojo图中更改细粒度字段时,兵马俑是最好的。使用大型阵列并没有充分利用兵马俑的能力(这并不是说人们有时不会那样使用它)。

如果你要创造大量垃圾,那么Terracotta内存管理器和分布式垃圾收集器必须能够跟上它。如果不尝试数据量是否超过那里的可用带宽,就很难说。

如果您运行多个服务器并且数据由服务器分区或具有一定数量的引用位置,您的应用程序将受益匪浅。在这种情况下,您只需要堆中一个服务器分区的数据,其余的不需要在内存中出现故障。如果其他服务器出现故障,如果有必要进行故障转移/可用性,它当然会出现故障。这意味着,在分区数据的情况下,您不会向所有节点广播,只向服务器发送事务。

从数字的角度来看,可以索引30GB的数据,因此不会接近任何硬限制。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top