자바 엔터프라이즈 성능을 위해 Memcached 사용, 1 부 : 아키텍처 및 설정

LiveJournal.com에서 사이트 성능을 개선하기 위해 Danga Interactive에서 개발 한 Memcached의 분산 아키텍처는 현재 Twitter, Facebook 및 Wikipedia와 같은 소셜 웹 애플리케이션의 기하 급수적 인 확장 성을 지원합니다. 이 두 부분으로 구성된 자습서에서 Sunil Patil은 Memcached의 분산 해시 테이블 아키텍처를 소개하고이를 사용하여 데이터베이스 기반 Java 엔터프라이즈 애플리케이션을위한 데이터를 캐시하는 방법을 시작합니다.

이 자습서에서는 Memcached를 사용하여 Java 엔터프라이즈 애플리케이션의 성능을 향상시키는 방법을 소개합니다. 전반부는 Memcached의 아키텍처와 비교하여 전통적인 자바 캐싱 아키텍처의 개요로 시작합니다. 또한 머신에 Memcached를 설치하고 Telnet을 통해 Memcached를 사용하기위한 설정 및 명령을 소개합니다. 후반부에서는 자바로 "Hello Memcached"클라이언트 프로그램을 개발할 것입니다.이 프로그램은 spymemcached 클라이언트의 내부를 살펴 보는 데 사용할 것입니다. 또한 Memcached를 사용하여 데이터베이스 서버의 부하를 줄이고이를 사용하여 동적으로 생성 된 페이지 마크 업을 캐시하는 방법에 대해서도 알아 봅니다. 마지막으로 spymemcached 클라이언트를 구성하기위한 몇 가지 고급 옵션을 고려할 것입니다.

JavaWorld의 Java 캐싱에 대한 추가 정보

  • Memcached를 사용한 분산 캐싱에 대한 자세한 내용은 "서버 부하 분산 아키텍처, 1 부 : 전송 수준 부하 분산"을 참조하세요.
  • 또한 전통적인 Java 캐싱에 대해 배우려면 "오픈 소스 Java 프로젝트 : Java 캐싱 시스템"을 참조하십시오.

Memcached 및 Java 캐싱 아키텍처 개요

EHCache 및 OSCache와 같은 Java 캐싱 프레임 워크는 기본적으로 HashMap애플리케이션 코드의 객체입니다. 캐시에 새 개체를 추가 할 때마다 응용 프로그램의 메모리에 저장됩니다. 이 전략은 소량의 데이터를 저장하는 데는 잘 작동하지만 몇 기가 바이트 (GB) 이상의 캐싱에는 작동하지 않습니다. Memcached 서버의 설계자는 시스템 확장 성을 허용하는 분산 아키텍처 접근 방식을 취했습니다. 결과적으로 Memcached를 사용하여 엄청난 양의 데이터를 캐시 할 수 있습니다.

Memcached의 아키텍처는 두 부분으로 구성됩니다. 첫 번째는 자체 프로세스에서 실행되는 Memcached 서버입니다. 애플리케이션을 확장하려면 추가 머신에 Memcached 서버를 설치하고 실행할 수 있습니다. Memcached 서버의 인스턴스는 서로를 인식하지 못합니다. Memcached가 클라이언트의 Memcached가 시스템의 두 번째 조각, 않습니다 각 서버에 대해 알고. 클라이언트는 각 캐시 항목에 대해 서버를 선택하고 캐시 항목을 저장하거나 가져 오는 책임이 있습니다.이 프로세스는 기사 뒷부분에서 자세히 설명합니다.

Java EE 웹 애플리케이션에서 작업 한 경험이있는 경우 이전에 EHCache 또는 OSCache와 같은 오픈 소스 Java 캐싱 프레임 워크를 사용했을 가능성이 있습니다. 또한 DynaCache (IBM WebSphere Application Server와 함께 제공됨) 또는 JBoss Cache (JBoss AS와 함께 제공됨)와 같이 애플리케이션 서버의 일부로 제공되는 상용 캐싱 프레임 워크를 사용했을 수도 있습니다. 이 자습서의 실습 부분을 시작하기 전에 Memcached가 이러한 기존 Java 캐싱 프레임 워크와 어떻게 다른지 이해하는 것이 중요합니다.

기존 Java 캐시 사용

오픈 소스를 선택하든 상용 옵션을 선택하든 기존 Java 캐싱 프레임 워크를 사용하는 것은 매우 쉽습니다. EHCache 또는 OSCache와 같은 오픈 소스 프레임 워크의 경우 바이너리를 다운로드하고 필요한 JAR 파일을 애플리케이션의 클래스 경로에 추가해야합니다. 캐시 크기, 디스크 오프로드 등을 구성하는 데 사용할 구성 파일을 만들어야 할 수도 있습니다. 애플리케이션 서버와 함께 번들로 제공되는 캐싱 프레임 워크의 경우 일반적으로 소프트웨어와 함께 번들로 제공되므로 추가 JAR을 다운로드 할 필요가 없습니다.

애플리케이션에서 캐싱 프레임 워크에 대한 지원을 추가 한 후 CacheManager개체 를 만들고 캐시 항목을 가져오고 설정 하여 사용을 시작할 수 있습니다. 내부적으로 캐싱 프레임 워크는 CacheManager애플리케이션이 실행중인 동일한 JVM에서 객체를 생성합니다 . 캐시 항목을 추가 할 때마다 해당 개체는 캐싱 프레임 워크에서 유지 관리하는 일부 유형의 해시 테이블에도 추가됩니다.

응용 프로그램 서버가 여러 노드에서 실행중인 경우 분산 캐싱에 대한 지원을 원할 수도 있습니다. 분산 캐시 시스템에서 AppServer1의 캐시에 개체를 추가하면 해당 개체는 AppServer2 및 AppServer3에서도 사용할 수 있습니다. 기존 Java 캐시 는 분산 캐싱에 복제 를 사용 합니다 . 즉, AppServer1에 캐시 항목을 추가하면 시스템의 다른 앱 서버에 자동으로 복제됩니다. 결과적으로 모든 노드에서 항목을 사용할 수 있습니다.

Memcached 사용

캐싱에 Memcached를 사용하려면 먼저 선택한 플랫폼에 대한 Memcached 서버를 다운로드하여 설치해야합니다. Memcached 서버를 설치하면 캐싱 호출을 위해 TCP 또는 UDP 포트에서 수신 대기합니다.

다음으로 Memcached 용 Java 클라이언트를 다운로드하고 클라이언트 JAR을 애플리케이션에 추가합니다. 그런 다음 Memcached 클라이언트 객체를 만들고 해당 메서드를 호출하여 캐시 항목을 가져오고 설정할 수 있습니다. 캐시에 객체를 추가하면 Memcached 클라이언트는 해당 객체를 가져와 직렬화하고 저장을 위해 Memcached 서버에 바이트 배열을 보냅니다. 이 시점에서 캐시 된 개체는 애플리케이션이 실행중인 JVM에서 가비지 수집 될 수 있습니다.

캐시 된 객체가 필요한 경우 Memcached 클라이언트의 get()메서드를 호출 할 수 있습니다 . 클라이언트는 get요청 을 받아 직렬화하여 Memcached 서버로 보냅니다. Memcached 서버는 요청을 사용하여 캐시에서 객체를 찾습니다. 객체가 있으면 바이트 배열을 Memcached 클라이언트로 다시 반환합니다. 그런 다음 Memcached 클라이언트 객체는 바이트 배열을 가져와 역 직렬화하여 객체를 생성하고 애플리케이션에 반환합니다.

애플리케이션이 둘 이상의 애플리케이션 서버에서 실행 중이더라도 모두 동일한 Memcached 서버를 가리키고 캐시 항목을 가져오고 설정하는 데 사용할 수 있습니다. Memcached 서버가 두 개 이상인 경우 서버는 서로에 대해 알 수 없습니다. 대신 사용 가능한 모든 Memcached 서버를 인식하도록 Memcached 클라이언트를 구성합니다. 예를 들어 애플리케이션이 AppServer1에 Java 객체를 생성하고 set()Memcached 메서드를 호출 하면 Memcached 클라이언트는 해당 항목이 어떤 Memcached 서버로 이동하는지 알아냅니다. 그런 다음 해당 Memcached 서버와 만 통신을 시작합니다. 마찬가지로 AppServer2 또는 AppServer3의 코드 get가 항목을 시도 할 때 Memcached 클라이언트는 먼저 해당 항목이 저장된 서버를 파악한 다음 해당 서버와 만 통신합니다.

Memcached 클라이언트 로직

기본 구성에서 Memcached 클라이언트는 매우 간단한 로직을 사용하여 가져 오기 또는 설정 작업을위한 서버를 선택합니다. get()또는 set()호출을 할 때 클라이언트는 캐시 키 hashCode()를 가져 와서 11과 같은 정수를 얻기 위해 해당 메서드를 호출합니다 . 그런 다음 해당 숫자를 가져와 사용 가능한 Memcached 서버 수 (예 : 2 개)로 나눕니다. 그런 다음 나머지 값 (이 경우 1)을받습니다. 캐시 항목은 Memcached 서버 1로 이동합니다.이 간단한 알고리즘은 각 애플리케이션 서버의 Memcached 클라이언트가 주어진 캐시 키에 대해 항상 동일한 서버를 선택하도록합니다.

Memcached 설치

Memcached는 Unix, Linux, Windows 및 MacOSX에서 실행됩니다. Memcached 소스를 다운로드하여 컴파일하거나 다른 사람이 컴파일 한 바이너리를 다운로드하여이를 사용하여 Memcached를 설치할 수 있습니다. 여기에서는 선택한 플랫폼에 대한 바이너리를 다운로드하는 과정을 살펴 보겠습니다. 소스에서 컴파일하는 것을 선호하는 경우 리소스를 참조하십시오.

다음 설치 지침은 Windows XP 32 비트 컴퓨터 용입니다. Linux와 같은 다른 플랫폼에 대한 설치 지침은 참고 자료를 참조하십시오. 또한이 기사의 샘플 코드는 Windows XP 32 비트 시스템에서 개발되었지만 다른 플랫폼에서도 작동해야합니다.

  1. Jellycan 코드에는 작업하기 쉽고 효율적인 Memcached의 수정 된 버전이 있습니다. win32 바이너리 ZIP 파일을 다운로드하여 여기에서 시작하십시오.
  2. Memcached--win32-bin.zip하드 디스크에서 확장하십시오 . 여기에 포함 된 것은 모두 memcached.exe. 이 파일을 실행하여 Memcached 서버를 시작합니다.
  3. 이제 memcached.exe -d installmemcached.exe를 서비스로 등록 하기 위해 실행 합니다. 서비스 콘솔을 사용하여 Memcached 서버를 시작하고 중지 할 수 있습니다.

CL 시작 / 중지

서비스 패널이 아닌 명령 줄에서 Memcached 서버를 시작하고 중지 해보십시오. 이렇게하면 다양한 명령 줄 옵션을 시도하고 요구 사항에 가장 적합한 구성을 파악할 수있는 더 많은 유연성을 얻을 수 있습니다.

memcached.exe명령 줄 옵션없이 를 실행하면 기본적으로 Memcached 서버는 64MB의 메모리로 포트 11211에서 시작됩니다. 경우에 따라 구성을보다 세부적으로 제어 할 수 있습니다. 예를 들어, 컴퓨터의 다른 프로세스에서 포트 11211을 사용하고 Memcached 서버가 포트 12000을 사용하기를 원한다고 가정합니다. 또는 QA 또는 프로덕션 환경에서 Memcached 서버를 시작하는 경우 기본 64MB보다 더 많은 메모리를 제공하고 싶을 것입니다. 이러한 경우 명령 줄 옵션을 사용하여 서버의 동작을 사용자 지정할 수 있습니다. memcache.exe -help명령을 실행하면 그림 3에 표시된 것과 같은 명령 줄 옵션의 전체 목록이 생성됩니다.

Telnet을 통해 Memcached와 연결

Memcached 서버가 시작되면 할당 된 포트에서 수신 대기합니다. Memcached 클라이언트는 TCP 또는 UDP 포트에서 서버에 연결하고 명령을 보내고 응답을받은 다음 결국 연결을 닫습니다. (클라이언트가 서버와 통신하는 데 사용하는 프로토콜에 대한 자세한 내용은 참고 자료를 참조하십시오.)

다양한 방법으로 Memcached 서버에 연결할 수 있습니다. 이 튜토리얼의 후반부에서 할 것처럼 Java 클라이언트를 사용하는 경우 캐시에서 객체를 저장하고 가져 오기위한 간단한 API에 액세스 할 수 있습니다. 또는 Telnet 클라이언트를 사용하여 서버에 직접 연결할 수 있습니다. Telnet 클라이언트를 사용하여 Memcached 서버와 통신하는 방법을 아는 것은 Java 클라이언트를 디버깅하는 데 중요하므로 여기서 시작하겠습니다.

Telnet 명령

먼저 선택한 Telnet 클라이언트를 사용하여 Memcached 서버에 연결해야합니다. Windows XP 시스템에서는 telnet localhost 11211Memcached 서버가 동일한 시스템에서 실행되고 기본 11211 포트에서 수신 대기한다고 가정하여 간단히 실행할 수 있습니다 . 다음 명령은 Telnet을 통해 Memcached를 사용하는 데 필수적입니다.

  • set캐시에 새 항목을 추가합니다. 전화 : Set . 다음 줄에 저장해야하는 실제 값을 입력 할 수 있습니다. 캐시 항목이 만료되지 않도록하려면 값으로 0을 입력하십시오.
  • get캐시 키의 값을 반환합니다. get 의 값을 가져 오는 데 사용 합니다 keyName.
  • add새 키가 아직없는 경우에만 추가합니다. 예를 들면 :add
  • replace키가있는 경우에만 값을 대체합니다. 예를 들면 :replace
  • delete키에 대한 캐시 항목을 삭제합니다. 호출 delete 을 사용 하여 keyName.

그림 4의 스크린 샷은 Telnet을 통한 Memcached 서버와의 샘플 상호 작용을 나타냅니다. 당신이 볼 수 있듯이, Memcached가 서버와 같은, 각 명령에 피드백을 제공 STORED, NOT_STORED등.

파트 1의 결론

지금까지 Memcached의 분산 아키텍처와보다 전통적인 Java 캐시 시스템 간의 차이점에 대해 간략하게 설명했습니다. 또한 개발 환경에서 Memcached 구현을 설정했으며 Telnet을 통해 Memcached에 연결하는 방법을 연습했습니다. 이 튜토리얼의 다음 부분에서는 자바 클라이언트 spymemcached를 사용하여 샘플 자바 애플리케이션을위한 분산 캐싱 솔루션을 설정할 것입니다. 이 과정에서 Memcached에 대해 더 많이 배우고 Java EE 애플리케이션의 성능을 향상시킬 수있는 방법을 배웁니다.

Sunil Patil은 캘리포니아 샌프란시스코에있는 Avnet Technology에서 일하는 Java EE 설계자입니다. 그는 Java Portlets 101 (SourceBeat, 2007 년 4 월) 의 저자이며 JavaWorld, IBM developerWorks 및 O'Reilly Media에서 발행 한 수많은 기사를 저술했습니다. IBM 인증 WebSphere Portal Server 애플리케이션 개발자 및 관리자 일뿐만 아니라 Sun Microsystems 인증 Java 프로그래머, 웹 구성 요소 개발자 및 비즈니스 구성 요소 개발자입니다. //www.webspherenotes.com에서 Sunil의 블로그를 볼 수 있습니다.