配置 ElastiCache 客户端以实现高效负载均衡 - Amazon ElastiCache
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

配置 ElastiCache 客户端以实现高效负载均衡

注意

此部分适用于自行设计的多节点 Memcached 集群。

为了有效使用多个 ElastiCache Memcached 节点,您需要能够跨节点分布缓存键。对具有 n 个节点的集群进行负载均衡的一个简单方法是,计算该对象的密钥的哈希并通过 n - hash(key) mod n 修改结果。所得的值(0 到 n–1)是您放置对象的节点的编号。

只要节点数 (n) 恒定,这种方法就简便可行。但是,每当您向集群添加节点或从集群删除节点时,需要移动的键数都是 (n - 1)/n(其中,n 是新的节点数)。因此,这种方法会造成移动大量键,并转变为很大的初始缓存未命中数,尤其是当节点数变大时。从 1 个节点扩展为 2 个节点会导致 (2-1)/2 (50%) 的键移动,这是最好的情况。从 9 个节点扩展为 10 个节点会导致 (10–1)/10 (90%) 的键移动。如果因为峰值流量而纵向扩展,您不会希望缓存未命中数变得很大。缓存未命中数很大会造成数据库命中,而数据库已经因峰值流量而过载。

这种两难困境的解决方法是使用一致性哈希。一致性哈希使用这样的算法:每当向集群添加节点或从集群删除节点时,必须移动的键的数目大致为 1/n(其中,n 是新的节点数)。从 1 个节点扩展为 2 个节点会造成移动 1/2 (50%) 的键,这是最差的情况。从 9 个节点扩展为 10 个节点会造成移动 1/10 (10%) 的键。

作为用户,您可以控制对多节点集群使用哪种哈希算法。建议您将客户端配置为使用一致性哈希。幸运的是,有很多用最常见语言编写的 Memcached 客户端库可以实现一致性哈希。请参阅您要使用的库的文档,了解其是否支持一致性哈希以及如何实现一致性哈希。

如果使用的是 Java、PHP 或 .NET,建议您使用 Amazon ElastiCache 客户端库之一。

使用 Java 实现一致性哈希

ElastiCache Memcached Java 客户端基于开源 Spymemcached Java 客户端,内置有一致性哈希功能。该库包含一个实现一致性哈希的 KetamaConnectionFactory 类。默认情况下,spymemcached 中禁用一致性哈希。

有关更多信息,请参阅 KetamaConnectionFactory 中的 KetamaConnectionFactory 文档。

使用 PHP 实现一致性哈希

ElastiCache Memcached PHP 客户端是一个围绕内置 Memcached PHP 库的包装程序。默认情况下,Memcached PHP 库禁用一致性哈希。

使用以下代码可以启用一致性哈希。

$m = new Memcached(); $m->setOption(Memcached::OPT_DISTRIBUTION, Memcached::DISTRIBUTION_CONSISTENT);

除了上述代码之外,我们还建议您在 php.ini 文件中启用 memcached.sess_consistent_hash

有关更多信息,请参阅 Memcached PHP 的运行时配置文档,网址为 http://php.net/manual/en/memcached.configuration.php。请特别注意 memcached.sess_consistent_hash 参数。

使用 .NET 实现一致性哈希

ElastiCache Memcached .NET 客户端是一个围绕 Enyim Memcached 的包装程序。默认情况下,Enyim Memcached 客户端已启用一致性哈希。

有关更多信息,请参阅 memcached/locator 文档 https://github.com/enyim/EnyimMemcached/wiki/MemcachedClient-Configuration#user-content-memcachedlocator