Configuração do seu cliente do ElastiCache para balanceamento de carga eficiente - Amazon ElastiCache

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Configuração do seu cliente do ElastiCache para balanceamento de carga eficiente

nota

Esta seção se aplica a clusters do Memcached multinó autoprojetado.

Para usar efetivamente vários nósdo Memcached do ElastiCache, você precisa ser capaz de espalhar suas chaves de cache entre os nós. Uma maneira simples de balancear a carga de um cluster com n nós é calcular o hash da chave do objeto e modificar o resultado por n - hash(key) mod n. O valor resultante (de 0 a n-1) é o número do nó em que você coloca o objeto.

Essa abordagem é simples e funcionará bem desde que o número de nós (n) seja constante. No entanto, sempre que você adiciona ou remove um nó do cluster, o número de chaves que precisam ser movidas é (n - 1) / n (em que n é o novo número de nós). Assim, essa abordagem resulta em um grande número de chaves movidas, o que se converte em um grande número de perdas no cache inicial, especialmente porque o número de nós fica grande. A escala de 1 para 2 nós resulta na movimentação de (2-1)/2 (50%) das chaves, o melhor caso. A escala de 9 a 10 nós resulta na movimentação de (10-1)/10 (90%) das chaves. Se você estiver aumentado a escala devido a um pico no tráfego, não convém ter um grande número de perdas no cache. Um grande número de perdas no cache resulta em acertos no banco de dados, que já está sobrecarregado devido ao pico no tráfego.

A solução para esse dilema é o hashing consistente. O hashing consistente usa um algoritmo, de modo que, sempre que um nó é adicionado ou removido a/de um cluster, o número de chaves que devem ser movidas é de aproximadamente 1/n (onde n é o novo número de nós). A escala de 1 para 2 nós resulta na movimentação de 1/2 (50%) das chaves, o pior caso. Escalar de 9 a 10 nós resulta na movimentação de 1/10 (10%) das chaves.

Como usuário, você controla qual algoritmo de hashing é usado para clusters de vários nós. Recomendamos configurar os clientes para usar o hashing consistente. Felizmente, existem muitas bibliotecas de cliente Memcached na maioria das linguagens populares que implementam o hashing consistente. Verifique a documentação da biblioteca que você está usando para ver se ela oferece suporte para hashing consistente e como implementá-lo.

Se você estiver trabalhando em Java, PHP ou .NET, recomendamos o uso de uma das bibliotecas de cliente do Amazon ElastiCache.

Hash consistente usando o Java

O cliente Java Memcached do ElastiCache baseia-se no cliente Java spymemcached de código-fonte aberto, que possui capacidades de hashing consistente incorporadas. A biblioteca inclui uma classe KetamaConnectionFactory que implementa o hashing consistente. Por padrão, o hashing consistente está desativado em spymemcached.

Para obter mais informações, consulte a documentação do KetamaConnectionFactory em KetamaConnectionFactory.

Hash consistente usando o PHP

O cliente PHP Memcached do ElastiCache é um wrapper ao redor da biblioteca PHP Memcached interna. Por padrão, o hashing consistente é desativado pela biblioteca PHP Memcached.

Use o código a seguir para ativar o hashing consistente.

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

Além do código anterior, recomendamos que você também ative memcached.sess_consistent_hash no seu arquivo php.ini.

Para obter mais informações, consulte a documentação de configuração de tempo de execução do PHP Memcached em http://php.net/manual/en/memcached.configuration.php. Observe especificamente o parâmetro memcached.sess_consistent_hash.

Hash consistente usando o .NET

O cliente .NET Memcached do ElastiCache é um wrapper ao redor do Enyim Memcached. Por padrão, o hashing consistente é ativado pelo cliente Enyim Memcached.

Para obter mais informações, consulte a documentação de memcached/locator em https://github.com/enyim/EnyimMemcached/wiki/MemcachedClient-Configuration#user-content-memcachedlocator.