본문 바로가기

Dot Database/Redis

[Spring/ Redis] Spring으로 ElasticCache for Redis 사용해보기

    ElasticCache

    AWS ElasticCache는 클라우드에서 In-Memory 데이터 스토어 또는 캐시를 손쉽게 배포, 운영 및 확장할 수 있게 해주는 AWS에서 지원하는 서비스이다. RDB와 같은 느린 디스크 기반 데이터베이스에 보다 훨씬 빠른 관리형 In-Memory 데이터 스토어에서 읽기 및 쓰기 작업을 거쳐 앱 서비스 성능을 향상시킬 수 있다. ElasticCache는 다음과 두 가지 오픈 소스 인 메모리 엔진을 지원한다.

    • Memcached : 유명한 분산 메모리 캐시 시스템으로 성능이 좋다.
    • Redis : 키-값(Key-Value) 데이터 저장소이다. 다양한 컬렉션(String, Hash, List, Set, Sorted Set 등)을 제공하여 개발자 생산성이 좋다.  
    • memcached vs redis 비교글 참고

     

    Amazon ElastiCache는 기존 primary 노드가 다운되면 이를 자동으로 감지(monitoring)한 후 복제 작업을 하던 secondary 노드에서 새로운 primary 노드를 선출한다. 이러한 auto failover 기능으로 복원력이 뛰어난 환경을 제공하여 앱 서비스 로드 시간이 길어지게 하는 데이터베이스 오버로드의 위험을 완화해준다.

     

    이번에는 캐싱 기능을 목적으로 사용할 것이기 때문에 다양한 컬렉션을 제공해 생산성이 좋은 Redis를 사용해보려고 한다.

    1. ElasticCache for Redis 인스턴스 생성하기

    1. Redis 클러스터 생성

    새롭게 디자인된 콘솔 화면으로 전환하여 [Redis 클러스터 생성] 버튼을 누른다.

     

    Redis 클러스터 생성

     

    2. 클러스터 모드 비활성화 및 클러스터 정보(이름, 설명) 입력

    클러스터 모드를 활성화하면 확장성과 가용성을 개선하는 데 실습이므로 비활성화를 유지한다. 그리고 이름설명를 입력해준다.

     

    클러스터 모드 비활성화 및 클러스터 정보(이름, 설명) 입력클러스터 모드 비활성화 및 클러스터 정보(이름, 설명) 입력

     

    3. 위치(AWS 클라우드) 및 다중 AZ 설정

    호스팅 위치 AWS 클라우드를 선택한다. ElasticCache는 오직 EC2 위에서만 실행이 가능하다. 로컬 PC에서는 사용할 수 없다. 고가용성을 위해 다중 AZ를 설정한다. 다중 AZ를 설정하면 자동 장애 조치도 디폴트로 설정된다. 이 기능은 primary 노드가 장애 발생으로 다운되더라도 복제본 노드를 primary 노드로 승격시켜주어 장애를 대처해준다.

     

    위치(AWS 클라우드) 및 다중 AZ 설정

     

    4. 클러스터 설정  - 노드 유형: 프리 티어(cache.t2.micro)로 변경

    노드 유형 디폴트는 프리티어로 설정되어 있지 않아서 주의해야 한다. 이를 무시하고 넘어가면 나중에 엄청난 요금이 부과될 수도 있다. 꼭 cache.t2.micro로 바꿔줘야 한다. 이 노드는 매달 750시간 사용 무료이다. 이 외에는 디폴트 값 그대로 유지한다.

     

    클러스터 설정  - 노드 유형: 프리 티어(cache.t2.micro)로 변경

     

    4. 서브넷 그룹 설정

    기존 서브넷 그룹이 없으면 새로운 서브넷 그룹을 생성해준다. 다중 AZ 환경을 위해서 필요하다. 

    • 만약 한달 내내 풀가동을 돌리기 위해서는 위에 다중AZ,  자동 장애 조치를 취소하고 해당 설정을 넘겨야 한다. 자동 장애 조치를 설정하면 Replica 노드 2개가 필수로 필요하기 때문에 프리티어 3개의 노드를 구동하게 된다.

     

    서브넷 그룹 설정

     

     

    5. Redis 클러스터 생성 완료

    생성하면 1~2분 소요 후 정상적으로 운영되는 것을 확인할 수 있다.

     

    Redis 클러스터 생성 완료

     

     

    2. EC2 인스턴스에서 ElasticCache 실행하기

    위에서 ElasticCache를 생성할 때 AWS 클라우드를 선택하였다면 무조건 EC2 위에서만 실행이 가능하다. 가볍게 EC2 인스턴스를 하나 만들어준다.

     

    1. EC2 인스턴스 생성 및 실행

    참고: [Spring 배포 #0-1] AWS EC2 인스턴스 생성 후 접속하기

     

    2. ElasticCache 보안그룹 생성 (내 IP, EC2)

    EC2 인스턴스가 정상적으로 구동되었으면 ElasticCache 보안 그룹을 만들어서 인바운드에 다음과 같이 두 개의 규칙을 추가해준다.

    1. 포트번호 6379 입력, 내 IP 선택 
    2. 포트번호 6379 입력, EC2 보안그룹 선택 

    ElasticCache 보안 그룹

     

    3. ElasticCache Redis 클러스터에 보안 그룹 적용

    ElasticCache 콘솔로 돌아가서 [Redis 클러스터 클릭 → 작업 버튼 클릭 수정] 순으로 진행한 후 다음과 같이 보안 항목에 2번에서 생성한 보안 그룹을 넣어준다.

     

    3. ElasticCache Redis 클러스터에 보안그룹 적용

     

    4. EC2에 Redis-cli 설치하기

    ec2 인스턴스 내부에 Redis-cli를 설치하여 ElasticCache 인스턴스가 정상적으로 동작되는지 확인한다.

    # make 명령어를 실행하기 위해 gcc를 다운한다.
    sudo yum install -y gcc

    # redis-cli 설치 및 make 명령어를 실행한다.
    sudo wget http://download.redis.io/redis-stable.tar.gz && tar xvzf redis-stable.tar.gz && cd redis-stable && make

    # redis-cli를 bin에 추가해 어느 위치서든 사용 가능하게 등록한다.
    sudo cp src/redis-cli /usr/bin/

     

    정상적으로 설치가 완료되었으면 redis-cli 명령어로 ElasticCahce를 실행한다. 

    # make 명령어를 실행하기 위해 gcc를 다운한다.
    redis-cli -h  {ElasticCache 엔드포인트}

     

    기본 엔드포인트 사용하기

    primary 노드 1개와 replica 노드 2개 엔드포인트 3개 중 현재 primary 노드가 기본 엔드 포인트와 매핑된다. 만약 장애가 발생하여 자동 장애 조치(failover) 기능으로 primary 노드가 바뀌면 새롭게 선출된 primary 노드 엔드 포인트가 자동으로 기본 엔드포인트에 매핑된다. 그러니 primary나 replica 엔드포인트가 아닌 기본 엔드포인트를 사용해줘야 한다. (참고)

     

     

    redis-cli로 접속하기

    port 기본으로 6379를 매핑해주므로 -h 호스트네임만 입력해주면 된다. 그러면 다음과 같이 정상적으로 접속되는 것을 확인할 수 있다

     

     

     

    3. Spring으로 ElasticCache for Redis 사용하기

    그럼 이제 Spring 프로젝트를 실행 시켜 Redis를 사용해보자. 먼저 기본적으로 EC2에 jdk와 git을 설치해줘야 한다.

     

    1. jdk11 설치하기

    # AWS Corretto jdk 11 다운로드
    wget https://corretto.aws/downloads/latest/amazon-corretto-11-x64-al2-jdk.rpm -O jdk11.rpm

    # jdk 11 설치
    sudo yum localinstall jdk11.rpm

    # 설치된 jdk 11 버전 적용
    sudo /usr/sbin/alternatives --config java

    # java 버전 확인
    java -version

     

    2. git 설치하기

    # git 설치하기
    sudo yum install git

    # git 설치 확인
    git --version

     

    3.  스프링 프로젝트 클론 및 yml 설정 변경

    설치가 완료되었으면 미리 Redis 테스트용으로 만들어둔 Spring 프로젝트를 클론한다.

    # 스프링 프로젝트 git clone하기
    git clone https://github.com/loosie/spring-elasticcache-redis-test

     

    정상적으로 불러왔으면 /src/main/resources/application.yml에 파일에 접속하여 redis host를 ElasticCache 엔드포인트로 변경해준다.

     

    application.yml 설정 변경

     

     

    4.  스프링 프로젝트 실행 후 Cache 기능 테스트

    그런 다음 스프링 프로젝트를 빌드한 후 실행해 준 다음 'ec2:8080/'으로 접속해서 정상적으로 작동하는 것을 확인한다.

     

    ec2:8080 접속

     

    그럼 이제 Postman을 이용하여 캐시 데이터를 저장 및 조회하는 API를 사용해보자.

     

    장바구니에 아이템 저장하기

    POST: /cart/{id} 와 저장할 아이템 바디를 담아 요청한다.

     

    장바구니에 아이템 저장하기

     

    redis-cli로 캐시에 저장된 값을 확인해보면 정상적으로 저장되어 있다.

     

    redis-cli

     

    장바구니에 아이템 조회하기

    GET: /cart/{id}로 다시 조회해보면 정상적으로 출력되는 것을 확인할 수 있다.

     

    장바구니에 아이템 조회하기

     

     

    실습한 스프링 프로젝트는 github에서 확인할 수 있습니다.

     


    참고

    https://docs.aws.amazon.com/ko_kr/AmazonElastiCache/latest/red-ug/AutoFailover.html

    https://docs.aws.amazon.com/AmazonElastiCache/latest/red-ug/WhatIs.html

    https://docs.aws.amazon.com/AmazonElastiCache/latest/red-ug/GettingStarted.html

    https://aws.amazon.com/ko/elasticache/free/

    https://jojoldu.tistory.com/348