Amazon ElastiCache
用户指南 (API Version 2015-02-02)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。请点击 Amazon AWS 入门,可查看中国地区的具体差异

配置 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 文档 http://dustin.sallings.org/java-memcached-client/apidocs/net/spy/memcached/KetamaConnectionFactory.html

使用 PHP 实现一致性哈希

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

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

Copy
$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