Amazon web services 与AWS兼容的复制缓存解决方案

Amazon web services 与AWS兼容的复制缓存解决方案,amazon-web-services,caching,hazelcast,ignite,geode,Amazon Web Services,Caching,Hazelcast,Ignite,Geode,我的用例如下所示: 我们有大约500台服务器运行在自动缩放EC2集群中,这些服务器每秒需要访问相同的配置数据数百万次(以键/值方式排列) 配置数据不是很大(1或2 GBs),变化不大(高峰时间每分钟几十次更新/删除/插入) 延迟对我们来说至关重要,因此需要在运行应用程序的每个实例上复制数据并将其保存在内存中 最终的一致性很好。但是,我们需要确保每次更新都会在某个点传播。(知道服务器可以随时关闭) 跨服务器的更新传播应该可靠且易于设置(我们的服务器不能有静态IP,或者我们不想走AWS上“伪造”多播

我的用例如下所示:

我们有大约500台服务器运行在自动缩放EC2集群中,这些服务器每秒需要访问相同的配置数据数百万次(以键/值方式排列)

配置数据不是很大(1或2 GBs),变化不大(高峰时间每分钟几十次更新/删除/插入)

延迟对我们来说至关重要,因此需要在运行应用程序的每个实例上复制数据并将其保存在内存中

最终的一致性很好。但是,我们需要确保每次更新都会在某个点传播。(知道服务器可以随时关闭) 跨服务器的更新传播应该可靠且易于设置(我们的服务器不能有静态IP,或者我们不想走AWS上“伪造”多播的路线等等)

以下是我们过去探索过的解决方案:

  • 使用常规java映射并使用我们定制的系统在集群中传播更新。(显然,它的伸缩性没有那么好)
  • 使用EhCache及其复制功能。但是在EC2上设置它是非常痛苦的,而且不可靠
以下是我们正在考虑尝试的解决方案:

  • ApacheIgnite()使用复制策略
  • Hazelcast的复制地图功能。()
  • 每个应用程序节点上都有Apache Geode。()
我想知道这些解决方案是否适用于我们的用例。最后,我可能要面对的问题是什么

以下是我到目前为止的发现:

  • Hazelcast的复制映射在某种程度上是最新的,仍然有点不可靠(如果缩小比例,异步更新可能会丢失)
  • Geode似乎是最近才变得“稳定”起来的(尽管它应该是从2000年代初开始开发的)
  • Ignite看起来很适合,但如果我们继续定期添加/删除节点,我不太确定他们基于S3发现的系统将如何工作

谢谢

Geode应该适用于您的用例。您应该能够在每个节点上使用Geode复制区域。您可以选择执行同步或异步复制。如果出现故障,复制区域将从系统中的现有成员处获取数据的初始副本,同时确保不会丢失正在进行的操作

在配置方面,您必须启动几个/几个成员发现过程(Geode定位器),并将每个成员指向这些定位器。(我们建议您启动一个定位器/AZ,并使用3个AZ来防止网络分区)

Geode/GemFire已经稳定了一段时间;在很长一段时间内,为印度和中国铁路的预订系统以及其他用户提供低延迟、高可扩展性需求


披露:我是Geode的提交人。

Geode应该适用于您的用例。您应该能够在每个节点上使用Geode复制区域。您可以选择执行同步或异步复制。如果出现故障,复制区域将从系统中的现有成员处获取数据的初始副本,同时确保不会丢失正在进行的操作

在配置方面,您必须启动几个/几个成员发现过程(Geode定位器),并将每个成员指向这些定位器。(我们建议您启动一个定位器/AZ,并使用3个AZ来防止网络分区)

Geode/GemFire已经稳定了一段时间;在很长一段时间内,为印度和中国铁路的预订系统以及其他用户提供低延迟、高可扩展性需求


披露:我是Geode的提交人。

Ignite为S3存储上的发现提供本机AWS集成:。它解决了主要问题——当实例重新启动时,您不需要更改配置。简而言之,任何成功连接拓扑的节点都会将其坐标写入一个bucket(并在失败或离开时将其删除)。当您启动一个新节点时,它将读取此存储桶并连接到列出的一个地址。

Ignite为S3存储上的发现提供本机AWS集成:。它解决了主要问题——当实例重新启动时,您不需要更改配置。简而言之,任何成功连接拓扑的节点都会将其坐标写入一个bucket(并在失败或离开时将其删除)。当您启动一个新节点时,它将读取此存储桶并连接到列出的地址之一。

Hazelcast的复制映射将不适用于您的用例。请注意,它是一个跨所有it节点(而不是客户端节点/服务器)复制的映射。此外,正如您所说,它还不完全可靠。
以下是Hazelcast解决方案:

  • 创建一个Hazelcast群集,其中包含一组节点,具体取决于数据的大小
  • 创建分布式映射(
    IMap
    ),并根据键/值对的大小/数量调整计数和逐出配置。数据跨所有节点进行分区
  • 根据数据的重要性以及从实际源(DB/文件)提取数据所需的时间设置备份计数。默认情况下,分布式映射有1个备份
  • 在客户端,设置NearCache并将其附加到分布式映射。此近缓存将在本地/客户端本身中保存密钥/值对。因此get操作将以毫秒结束
  • >考虑近缓存解决方案:

    • 第一个get操作会比较慢,因为它必须通过网络从集群获取数据
    • 缓存失效不是完全可靠的,因为与集群同步时会有延迟,并且可能会停止读取过时数据。同样,所有缓存解决方案都是如此
    • 客户端负责设置Nearcache项的超时和失效。这样,未来就会变得更加美好