配置您的 ElastiCache 客户端以实现高效的负载平衡 (Memcached) - 亚马逊 ElastiCache

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

配置您的 ElastiCache 客户端以实现高效的负载平衡 (Memcached)

注意

此部分适用于自行设计的多节点 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 客户端库可以实现一致性哈希。请参阅您要使用的库的文档,了解其是否支持一致性哈希以及如何实现一致性哈希。

如果你使用的是 JavaPHP,或者。 NET,我们建议您使用其中一个 Amazon ElastiCache 客户端库。

使用 Java 实现一致性哈希

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

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

在 Memcached 中使用一致PHP的哈希值

ElastiCache Memcached PHP 客户端是内置 Memcache PHP d 库的封装器。默认情况下,Memcac PHP hed 库会关闭一致性哈希算法。

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

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

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

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

使用一致的哈希算法。 NET使用内存缓存

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

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