

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# 効率的な負荷分散のための 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](https://github.com/RTBHOUSE/spymemcached/blob/master/src/main/java/net/spy/memcached/KetamaConnectionFactory.java) で KetamaConnectionFactory ドキュメントを参照してください。

## 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 クライアントによって、整合性のあるハッシュが有効になります。

 詳細については、`memcached/locator` のドキュメント ([https://github.com/enyim/EnyimMemcached/wiki/MemcachedClient-Configuration\$1user-content-memcachedlocator](https://github.com/enyim/EnyimMemcached/wiki/MemcachedClient-Configuration#user-content-memcachedlocator)) を参照してください。