Canvas 1 Layer 1

아마존 엘라스틱캐시의 멤캐시디 클러스터 스케일 아웃

들어가며: 아마존 엘라스틱캐시의 확장

멤캐시디Memcached는 메모리 캐시 시스템으로 키-밸류 형식으로 데이터를 메모리에 저장해서 빠르게 읽고 쓸 수 있도록 설계되있습니다. 멤캐시디는 사용하지 않는 곳을 찾기가 어려울 정도로 여러 서비스에서 사용되고 있습니다. 엘라스틱캐시는 AWS에서 제공하는 매니지드 맴캐시디 서비스로 직접 설치하거나 운영하지 않아도 됩니다.

멤캐시디 서버를 사용하다가 용량 부족으로 더 많은 용량이 필요하다면 스케일 업(Scale up) 혹은 스케일 아웃(Scale out) 방식을 이용합니다.

스케일 업은 메모리를 더 높은 사양으로 교체하는 것인데 엘라스틱캐시에서는 더 좋은 사양의 노드 타입으로 변경하는 것을 의미합니다. 엘라스틱캐시에서는 노드 타입 변경은 지원하지 않으므로 새로운 노드 타입으로 멤캐시디를 만들고 어플리케이션에서 새로운 노드로 접속하도록 변경해야 합니다. 스케일 업을 하는 경우 메모리에 있던 정보가 사라져서 처음부터 다시 캐시를 쌓아야 하므로 캐시가 어느정도 쌓이기 전까지 서비스의 부하가 늘어나는 단점이 있습니다.

스케일 아웃은 멤캐시디 서버를 추가하는 방식입니다. 기존에 있던 서버에 추가로 노드를 투입하는 것으로 기존에 캐시되어 있던 내용이 대부분 유지되므로 부하가 늘어나는 단점이 없습니다. 이 글에서는 스케일 아웃하는 방법에 대해 더 이야기 해보겠습니다.

멤캐시디 클러스터의 스케일 아웃

엘라스틱캐시에서는 멤캐시디 서버를 생성하면 기본적으로 클러스터로 생성 됩니다. 클러스터라고 해도 서버를 한 대만 사용할 수도 있고 여러대의 서버를 사용할 수도 있습니다. 클러스터에는 최대 20대의 멤캐시디 노드를 추가할 수 있는데 10기가의 노드를 사용하고 있다면 최대 200기가까지 확장 가능함을 의미합니다.

아마존 엘라스틱캐시 멤캐시디 서버의 클러스터 크기 지정
아마존 엘라스틱캐시 멤캐시디 서버의 클러스터 크기 지정

엘라스틱캐시 멤캐시디 클러스터를 생성하면 엔드포인트Configuration Endpoint에서 접속 주소를 얻을수 있습니다.

멤캐시디 클러스트의 정보. 클러스터에 접속 가능한 엔드포인트를 확인할 수 있습니다
멤캐시디 클러스트의 정보. 클러스터에 접속 가능한 엔드포인트를 확인할 수 있습니다

클러스터에 노드가 1개라면 그냥 이 값을 바로 사용해도 되지만 노드가 여러 개라면 추가 작업이 필요합니다. 일반적으로 라이브러리에 멤캐시디 주소를 설정할때 각각의 클러스터의 Configuration Endpoint 대신 각 노드의 Endpoint를 일일이 명시합니다. 루비 온 레일즈Ruby on Rails에서 사용하는 달리dalli 젬에서는 다음과 같은 방법으로 지정합니다.

멤캐시디 클러스터에 서버가 추가되거나 삭제 되면 설정에 새로운 노드의 주소를 추가하고 재시작하는 방식입니다.

이러한 불편함을 없애기 위해서 엘라스틱캐시에서는 오토 디스커버리Auto Discovery 기능을 제공합니다. 이 기능을 이용하면 클러스터의 엔드포인트Configuration Endpoint 주소 하나만 설정하면 클러스터에 속한 노드들을 자동으로 찾아서 분산 저장합니다. 노드 한대가 갑자기 빠지거나 노드를 추가해도 알아서 잘 동작합니다.

하지만 아쉽게도 오토 디스커버리를 모든 언어에서 사용할 수 있는것은 아닙니다. 이를 지원하는 라이브러리가 필요한데 현재는 자바Java, PHP, 닷넷.NET만 공식적으로 지원하고 있으면 루비에서 많이 사용하는 dalli 젬에서는 공식지원하지 않습니다. 대신 dalli-elasticache에서 비공식으로 지원하는데 노드가 추가되거나 삭제되었을때 자동으로 반영되지는 않고 서버 재시작이 필요합니다.

엘라스틱캐시 멤캐시디 클러스터를 이용해 노드를 추가하고 삭제하는 것은 쉽지만 주의해야할 점이 있습니다. 클러스터 효율을 위해 캐시키가 여러대의 노드에 적절하게 분산되게 하는 방법 중 일관적 해싱Consistent hashing을 사용해야 대량의 캐시키 이동으로 인해 캐시 누락 사태를 방지할 수 있습니다. 일관적 해싱 알고리즘은 멤캐시디 클라이언트 라이브러리에서 지원해야 하는데 레일즈의 멤캐시디 라이브러리 달리에서는 일관적 해싱을 지원하고 있습니다.