

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

# 配置您的 ElastiCache 客户端以实现高效的负载平衡 (Memcached)
<a name="BestPractices.LoadBalancing"></a>

**注意**  
本节适用于基于节点的多节点 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 实现一致性哈希
<a name="BestPractices.LoadBalancing.Java"></a>

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

有关更多信息，请参阅中的 KetamaConnectionFactory 文档[KetamaConnectionFactory](https://github.com/RTBHOUSE/spymemcached/blob/master/src/main/java/net/spy/memcached/KetamaConnectionFactory.java)。

## 使用 Memcached PHP 实现一致性哈希
<a name="BestPractices.LoadBalancing.PHP"></a>

 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](http://php.net/manual/en/memcached.configuration.php) 请特别注意 `memcached.sess_consistent_hash` 参数。

## 使用 Memcached .NET 实现一致性哈希
<a name="BestPractices.LoadBalancing.dotNET"></a>

 ElastiCache Memcached .NET 客户端是围绕 Enyim Memcached 的封装器。默认情况下，Enyim Memcached 客户端已启用一致性哈希。

 有关更多信息，请参阅 [https://github.com/enyim/EnyimMemcached/wiki/MemcachedClient-Configur `memcached/locator` user-content-memcachedlocator](https://github.com/enyim/EnyimMemcached/wiki/MemcachedClient-Configuration#user-content-memcachedlocator) ation\$1 中的文档。