효율적인 로드 밸런싱을 위해 ElastiCache 클라이언트 구성 - Amazon ElastiCache

효율적인 로드 밸런싱을 위해 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에서 KetamaConnectionFactory 설명서를 참조하세요.

PHP를 사용한 일관적 해싱

ElastiCache Memcached PHP 클라이언트는 기본 제공 Memcached PHP 라이브러리 주변의 래퍼입니다. 기본적으로 Memcached PHP 라이브러리에서는 일관적 해싱이 해제됩니다.

다음 코드를 사용하여 일관적 해싱을 설정하세요.

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

또한 php.ini 파일에서 memcached.sess_consistent_hash를 설정할 수도 있습니다.

자세한 내용은 http://php.net/manual/en/memcached.configuration.php에서 Memcached PHP의 런타임 구성 설명서를 참조하세요. 특히 memcached.sess_consistent_hash 파라미터에 유의하시기 바랍니다.

.NET을 사용한 일관적 해싱

ElastiCache Memcached .NET 클라이언트는 Enyim Memcached 주변의 래퍼입니다. 기본적으로 Enyim Memcached 클라이언트에서는 일관적 해싱이 설정됩니다.

자세한 내용은 https://github.com/enyim/EnyimMemcached/wiki/MemcachedClient-Configuration#user-content-memcachedlocator에 있는 memcached/locator 설명서를 참조하세요.