【问题标题】:Can I use Terracotta to scale a RAM-intensive application?我可以使用 Terracotta 来扩展 RAM 密集型应用程序吗?
【发布时间】:2010-09-12 03:50:28
【问题描述】:

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

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

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

【问题讨论】:

  • 分片 redis 集群可能是一种更简单的方法,在这种情况下是否可行?

标签: java scalability amazon-ec2 terracotta


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 快速跟进:我听说如果你使用带有 Terracotta 的 HashMap,那么值可以被分发,但是键会被镜像到任何地方。这是真的?不同的地图集合会有不同的表现吗?
  • 正确。 HashMap、ConcurrentHashMap 等将在所有节点上维护一个完整的密钥集。如果我们不这样做,就很难知道缺少密钥是由于非本地密钥还是缺少密钥。一种常见的替代方法是构建 Maps of Maps 以允许分页出更多数据。
  • 我应该指出,这是一个及时的实现细节。亚历克斯是对的,这样做更容易,但使键集虚拟化并非不可能,它只是工作;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-16
  • 1970-01-01
  • 2017-01-25
  • 1970-01-01
  • 1970-01-01
  • 2014-07-01
  • 1970-01-01
相关资源
最近更新 更多