JaM2in
Published in

JaM2in

Arcus Single Cache (Dev.)를 소개합니다

ARCUS Single Cache (Dev.) 는 AWS Marketplace에서 ARCUS 캐시를 쉽고 빠르게 경험할 수 있도록 구성된 AMI입니다. AMI(Amazon Machine Image)는 인스턴스 시작하는 데 필요한 소프트웨어(OS, Application) 등이 포함된 템플릿으로, 사용자들이 EC2 인스턴스를 통해 실행할 수 있습니다. ARCUS Single Cache (Dev.)는 AMI 구성을 통해 개발자들이 ARCUS 캐시를 체험해 볼 수 있도록 one-click deployment 형태로 제작되었습니다. AWS ARCUS Single Cache (Dev.) 링크

기존 ARCUS 캐시를 사용하기 위해서는 Github에서 ARCUS를 clone받은 후, 빌드 및 각종 설정 과정을 거쳐야 합니다. 이 방식은 처음 사용자들에게 어려울 수 있습니다. 그래서 기존 방식보다 빠르고 간편하게 ARCUS 캐시를 체험해볼 수 있도록 ARCUS Single Cache (Dev.) AMI를 AWS Marketplace에 출시하게 되었습니다. 이 AMI 통해 ARCUS 캐시의 기본 기능을 경험해 볼 수 있습니다.

이번 포스팅에서는 ARCUS Single Cache (Dev.)를 소개하고 사용하는 방법을 간단하게 알려드리겠습니다.

ARCUS Single Cache (Dev.) 정보

ARCUS Single Cache (Dev.)는 개발자를 위해 기본 기능을 체험해 보는 목적으로 한정하여 일부 기능이 제한되어 있습니다. ARCUS는 다중 캐시 노드들로 구성되어 동작하는 클러스터 기능을 제공하지만, 이번 ARCUS Single Cache (Dev.) 제품은 이름에서도 알 수 있듯이 하나의 노드만으로 구성된 단일 캐시를 제공합니다.

구성 정보

ARCUS Single Cache (Dev.)는 ARCUS의 클러스터 기능이 제외된 단일 캐시 노드의 기능만을 제공하고, 사용할 수 있는 메모리와 커넥션 리소스에 제약이 있습니다. 구성정보는 아래와 같습니다.

  • Memory 크기 : 250MB
  • Connection 개수 : 1024

제공 기능

ARCUS의 단일 캐시에서는 Key-Value 형태의 기본 타입과 Collection(List, Set, Map, B+tree) 타입의 아이템 자료구조와 key들을 그룹화하여 관리하는 prefix 기능을 제공하며, 이를 체험해 볼 수 있습니다. 해당 상세정보는 아래와 같습니다.

Cache Item:

  • Key-Value : 하나의 데이터를 저장하는 구조

Collection item:

  • list : 데이터들의 linked list 구조
  • set : 유일한 데이터들의 집합 구조
  • map : <field, value>쌍으로 구성된 데이터들의 집합으로 field 기준의 hash 구조
  • b+tree : b+tree 키 기준으로 정렬된 데이터들의 집합을 가지는 구조

Cache Key:

  • <prefix:subkey>
  • prefix 단위로 cache server에 저장된 key들을 그룹화하여 flush 하거나 통계 정보를 볼 수 있는 유용한 기능
  • prefix : cache key 앞에 붙는 name space
  • delimeter : prefix와 subkey를 구분하는 문자로, 콜론(‘:’)을 사용합니다.
  • subkey : 일반적으로 cache 아이템을 구별하기 위한 Key입니다.

prefix와 subkey는 명명 규칙을 가지므로 주의해야 합니다. prefix는 영문 대소문자, 숫자, 언더바(_), 하이픈(-), 플러스(+), 점(.) 문자만으로 구성될 수 있으며, 이 중에 하이픈(-)은 prefix 명의 첫 번째 문자로 올 수 없는 제약이 있습니다. subkey는 공백을 포함할 수 없으며, 기본적으로 alphanumeric만을 사용하길 권장해 드립니다.

지금까지 ARCUS Single Cache (Dev.) 에 대해 알아보았고, 이제 ARCUS Single Cache (Dev.)를 생성 및 사용하는 방법을 소개하겠습니다.

ARCUS Single Cache (Dev.) 생성

ARCUS Single Cache (Dev.)를 생성하기에 앞서 선행되어야 할 사항이 한 가지 있습니다. 바로 계정을 생성하는 것입니다. AWS 계정이 없으신 분들은 계정을 생성하신 후 진행해주시길 바랍니다.

먼저 ARCUS 체험을 위한 EC2 인스턴스를 생성해 보도록 하겠습니다.

1 : EC2 인스턴스 생성을 위해 맨 왼쪽 위에 서비스 탭을 클릭합니다.

2 : 컴퓨팅 카테고리 밑의 EC2를 클릭합니다.

3 : 왼쪽의 대시보드를 통해 인스턴스를 클릭합니다.

4 : 맨 오른쪽 인스턴스 시작 버튼을 클릭합니다.

5 : 단계 1: Amazon Machine Image(AMI) 선택 페이지가 나옵니다. 바로 밑에 AWS Marketplace를 선택하고, 검색창에 arcus를 입력합니다.

6 : ARCUS Single Cache (Dev.) 제품이 나타난 것을 확인하고 오른쪽의 선택버튼을 눌러주세요.

7 : 단계 2: 인스턴스 유형로 넘어가서 원하시는 EC2 인스턴스를 선택합니다.

사용자가 원하는 용도에 맞는 인스턴스 타입을 선택하시면 됩니다. 간단히 체험할 목적이라면, ARCUS Single Cache (Dev.)의 인스턴스로 t2.micro를 추천합니다.

인스턴스 유형 선택이 완료했다면, 세부적인 구성(단계 3, 4, 5, 6) 또는 바로 검토 및 시작(단계 7 바로가기)을 진행할 수 있습니다. 빠른 시작을 하고 싶으시다면 검토 및 시작 버튼을, 추가하고 싶은 기능이 있다면 세부적인 구성 버튼을 눌러주세요.

8 : 모든 설정을 완료하면, 단계 7: 인스턴스 시작 검토 페이지가 나타납니다.

여기에서 필요한 설정 한 가지가 있습니다. 스크롤을 내려 보안 그룹 에 대한 설정 내용으로 이동해 주세요

그림과 같이 ARCUS 접근을 위한 port 설정을 확인할 수 있습니다. 인스턴스의 SSH 접근(22)과 ARCUS Zookeeper(2181), ARCUS Memcached(11211) 접근을 위한 port 설정이 제대로 되어있는지 확인합니다.

또한, 기본적으로 모든 IP(0.0.0.0/0) 접근이 허락되어 있습니다. 이 경우에 brute force attack에 노출될 수 있음으로 자신의 IP를 확인하여 whitelist로 등록 후 사용하시길 권고드립니다.

9 : 마지막으로 키페어(key pair) 설정을 마치면 모든 인스턴스 생성이 끝나게 됩니다.

키페어는 SSH 접속을 위해 중요하므로 안전하게 보관하시길 바랍니다.

ARCUS 동작 확인

ARCUS 캐시 인스턴스 생성 후, telnet을 이용하여 ARCUS Memcached 실행상태 확인 및 간단한 테스트를 해보도록 하겠습니다.

IP(인스턴스 public IP)와 port를 입력해주세요

$ telnet IP 11211

telnet 연결이 되었다면, 아래와 같이 stats 명령어를 입력해 보도록 합니다. 이 명령의 수행 결과로 PID, 버전, 메모리 사용량, 연산 수행 통계 등의 정보를 확인할 수 있습니다.

$ stats

이외에도 ARCUS Memcached에 직접 사용해 볼 수 있는 여러 command가 존재합니다. Command 살펴보기 를 통해 더 많은 테스트를 해 볼 수 있습니다.

ARCUS Java Client를 이용해 ARCUS Single Cache (Dev.) 체험

이번 단계는 Java Application에서 ARCUS 캐시 기능을 사용하는 단계입니다. ARCUS Java Client를 이용하여 ARCUS Single Cache (Dev.)를 체험해 보도록 하겠습니다. ARCUS Java Client 사용을 위해 아래와 같은 환경 구성이 필요합니다. 그리고 체험에 필요한 Java project를 생성해 주세요

필요 환경

  • Apache Maven (version 4 이상)
  • Java (version 1.6 이상)
  • Eclipse / Intellij IDE

pom.xml 설정

Project 생성이 완료되었다면, 의존성 설치를 위한 pom.xml 파일에 아래와 같이 입력해 주세요

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.navercorp.arcus</groupId>
<artifactId>arcus-quick-start</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<properties>
<project.build.sourceEncoding>UTF-8
</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- ARCUS Java Client 의존성 -->
<dependency>
<groupId>com.navercorp.arcus</groupId>
<artifactId>arcus-java-client</artifactId>
<version>1.13.0</version>
</dependency>
<!-- logging을 위한 의존성 -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.13.3</version>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.13.3</version>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.13.3</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
</exclusions>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.24</version>
</dependency>
</dependencies>

</project>

HelloArcus.java 생성

다음은 Project내에 HelloArcus.java를 생성합니다.

생성된 파일에 아래와 같이 코드를 입력합니다. ADDRESS 변수에 여러분이 생성한 EC2 인스턴스의 Public IP address가 필요하니 꼭 확인하여 입력해주시기 바랍니다.

import net.spy.memcached.ArcusClient;
import net.spy.memcached.ConnectionFactoryBuilder;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
//helloArcus.java
public class HelloArcus {

//해당하는 EC2 IP address를 ADDRESS 변수에 입력해주세요.
private static final String ADDRESS = "YOUR INSTANCE IP:2181";
//service code의 기본값은 "test"입니다.
private static final String SERVICE_CODE = "test";
public static void main(String[] args) throws InterruptedException {
System.setProperty("net.spy.log.LoggerImpl",
"net.spy.memcached.compat.log.SLF4JLogger");
ArcusClient client =
ArcusClient.createArcusClient(ADDRESS, SERVICE_CODE,
new ConnectionFactoryBuilder());
// key, expiredTime, value를 원하는 값으로 입력해 주세요.
client.set("test:hello", 30, "Hello Arcus!");
// key를 이용해 저장했던 값을 조회합니다.
Future<Object> future = client.asyncGet("test:hello");
String hello = null;
try {
hello = (String) future.get(700, TimeUnit.MILLISECONDS);
} catch (Exception e) {
future.cancel(true);
}
if(hello == null) {
hello = "not ok!";
}
System.out.println(hello);
}
}

logging 파일 생성

다음은 logging을 위해 src/main/resources/log4j2.xml 경로에 해당 파일을 생성합니다.

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Appenders>
<Console name="console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%-5p](%-35c{1}:%-3L) %m%n" />
</Console>
</Appenders>
<Loggers>
<Root level="WARN">
<AppenderRef ref="console" />
</Root>
</Loggers>
</Configuration>

실행

이제 모든 설정이 완료되었으므로 다시 HelloArcus.java 파일로 돌아가 해당 파일을 실행합니다.

정상적으로 동작이 된다면 아래와 같은 메시지가 출력됩니다.

Hello Arcus!

만약 아래와 같은 에러가 발생했을 경우, 해당하는 설정을 다시 확인해 보시기 바랍니다.

이번 체험 단계에서는 ARCUS Java Client 통해 간단히 ARCUS에 데이터를 저장하고 조회하는 기능을 살펴보았습니다. ARCUS Java Client에서는 이외에도 더 많은 기능을 사용해 볼 수 있습니다. collection 구조를 활용할 수 있는 API 및 비동기 API 등 Application에서 유용하게 활용 가능한 기능들이 있습니다. 사용하고자 하는 기능 및 API에 대해 궁금하시다면 ARCUS Java Client - Docs를 참고해 주세요.

마치며

지금까지 ARCUS Single Cache (Dev.)를 생성하고 사용법을 알아보았습니다. ARCUS Single Cache (Dev.)은 ARCUS의 기본 기능을 체험하기 위한 목적으로 개발되었습니다. 하지만, 소규모 프로젝트에 caching 기능을 적용하기에 충분하며 성능 개선 효과를 볼 수 있습니다. 이번 체험을 통해 생성한 EC2 인스턴스를 캐싱이 필요한 곳에 적용해 보시길 추천해 드립니다. 향후 ARCUS의 여러 기능을 포함한 새로운 AMI 상품을 제공할 예정입니다.

  • ARCUS Single Cache AMI (service purpose)
  • ARCUS Cache Cluster

앞으로 새롭게 출시될 여러 형태의 ARCUS AMI를 기대해주시기 바랍니다.

A collection of technical articles and blogs about ARCUS published or curated by JaM2in Developer.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store
moonseop kim

moonseop kim

More from Medium

Publish Custom DLL’s To AWS Lambda Layer

Taking the next step towards digital transformation with a branded access app (Part 1 / 4)

immudb v1.2 is released and combines Blockchain-like immutability with verifiable data deletion!

Building ghostgame.io — A multiplayer word game

Back-end system design