【问题标题】:How can an app on EC2 autodiscover ElastiCache instances?EC2 上的应用程序如何自动发现 ElastiCache 实例?
【发布时间】:2011-11-18 10:04:42
【问题描述】:

假设我有一个 Web 应用程序在一些负载平衡的 EC2 服务器上运行,它从 SimpleDB 存储和检索元数据,其中更大的数据块存储在 S3 上(由于 SimpleDB 的整个 1 KB 限制)。由于 S3 的延迟非常高,而且我不想在那里发出大量请求,因此我需要一个缓存层来存储信息……输入 ElastiCache。

好的,所以我使用端点 X 配置了一个 ElastiCache 服务器,因此我将 X 硬编码到我在 EC2 上的应用程序中,它运行良好,直到我获得了几十万新用户,突然之间,我的缓存服务器严重不足,无法满足需求。幸运的是,我可以启动一些新的更大的缓存服务器......但后来我意识到我有端点 X、Y 和 Z,而我的应用程序只知道尝试 X,所以我仍然有问题。

所以现在我只是想弄清楚这个难题的各个部分,我还没有进入编码部分,但这不会是个问题吗?我已经阅读了 ElastiCache 的文档,它提到它是一个缓存集群,但是集群中的每个服务器似乎都有自己的端点。有没有办法让在 EC2 上运行的应用程序了解所有正在运行的缓存服务器,以及更详细地了解哪个缓存服务器包含特定键的数据?是否可以要求集群作为一个整体来存储或检索一条信息?

【问题讨论】:

  • 我怀疑这个问题的答案是否很重要,但无论其价值如何,我的 EC2 应用程序很可能会在 PHP 中完成。
  • 我在forums.aws.amazon.com/thread.jspa?threadID=74852 注意到了一个与这些相同的功能请求,所以不幸的是,看起来有一个包含缓存端点的配置文件是你现在所能做的。

标签: amazon-ec2 memcached amazon-web-services cloud amazon-elasticache


【解决方案1】:

今天 Aws 宣布了缓存发现。你的问题解决了。 http://aws.typepad.com/aws/2012/11/amazon-elasticache-now-with-auto-discovery.html.

【讨论】:

  • 很好,这是他们的发明。
【解决方案2】:

如果您的应用是从版本控制部署的(我希望是这样),您只需编辑配置文件并重新部署应用即可。我认为这种方法没有什么大问题,但也许我错过了明显的问题。

告诉我。

【讨论】:

  • 我希望有一种弹性缓存机制可以将缓存集群呈现给应用程序,就好像它是单个服务器一样。不必担心要针对特定​​键命中哪个端点,不必担心在启动或关闭缓存节点时缓存配置等。似乎这样的事情还不存在。
  • 它没有。通常,AWS 的 ElastiCache 为您提供节点。如何使用这些节点(例如,您是否将所有节点都用作大型商店,或者您是否镜像等)取决于您。这就是 memcache 的工作原理。您可能可以将您的发现包装到定期 API 调用中,但我不建议这样做。我们为这些更改重新部署。
  • 我不会为此添加扩展魔法。例如。仅仅添加一个节点通常不是一个好主意,或者您的应用程序可能可以处理的事情。例如。当我将另一个节点添加到我们的 ElasticCache 集群时,我需要重新平衡缓存集群。通常,将其添加到配置中会更容易,调整 ext/memcache 的设置(我们使用 PHP),然后通过清空缓存并让它重新填充从头开始。
【解决方案3】:

Amazon 的 Elasticache Autodiscovery 绝对是可怕的。基本不可能安装,这很疯狂,因为它应该很简单。

我在 PHP 中编写了一个简单的函数,根据您运行的节点数生成一个 elasticache 节点 URL。是的,如果您更改节点数(或者可能将此值放入 env var),则必须更新您的代码。

它将相同的键映射到相同的节点:

function get_elasticache_node_url( $key, $config_url, $num_nodes ) {
  $node = hexdec( substr( md5($key), 0, 15) ) % $num_nodes + 1;
  $nodestr = str_pad($node, 4, "0", STR_PAD_LEFT);
  return str_replace('.cfg.','.'.$nodestr.'.',$config_url);
}

$num_nodes = 10;
$config_url = 'cluster-name.xyzxyz.cfg.use1.cache.amazonaws.com';

echo get_elasticache_node_url("key1", $config_url, $num_nodes );
echo get_elasticache_node_url("key2", $config_url, $num_nodes );

输出:

cluster-name.xyzxyz.0001.use1.cache.amazonaws.com
cluster-name.xyzxyz.0004.use1.cache.amazonaws.com

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 2023-04-05
    • 2015-02-24
    • 2012-11-07
    • 1970-01-01
    • 2013-01-14
    • 1970-01-01
    相关资源
    最近更新 更多