Tech story/Cloud

kt cloud Dev Tools - IMDB Redis 환경 구성 #1

KT Cloud Crew 2021. 11. 3. 13:18

 

 

Intro

지난 글에서는 IMDB(In-Memory DataBase)의 정의와 특성 그리고 종류에 대해 다뤄봤습니다. 이번 글에서는 Redis의 다양한 Operation Model 중 Stand Alone에 대해 글을 써보려 합니다.해당 글은 Ubuntu 18.04 및 Redis 5.x 버전에 맞게 작성되어있습니다.

 

Stand Alone 구조란?

Stand Alone 구조는 Redis의 가장 기본적인 Operation Model입니다. 단 하나의 Master 단일 노드로 구성됩니다.

 

설치 과정

  1. 설치를 위해 필요한 패키지 사전 설치
    
    root@jsm-redisTechBlog:~# apt-get install  build-essential pkg-config gcc tcl libsystemd-dev -y
  2. Redis 소스 다운로드 및 압축해제
    
    root@jsm-redisTechBlog:~# wget https://download.redis.io/releases/redis-5.0.10.tar.gz
    root@jsm-redisTechBlog:~# tar xvzf redis-5.0.10.tar.gz
  3. Redis Make install
    
    root@jsm-redisTechBlog:~# cd ./redis-5.0.10
    root@jsm-redisTechBlog:~/redis-5.0.10# make distclean
    root@jsm-redisTechBlog:~/redis-5.0.10# make USE_SYSTEMD=yes
    root@jsm-redisTechBlog:~/redis-5.0.10# make install
  4. Redis dir 생성
    
    root@jsm-redisTechBlog:~/redis-5.0.10# mkdir /etc/redis
    root@jsm-redisTechBlog:~/redis-5.0.10# mkdir /var/log/redis
    root@jsm-redisTechBlog:~/redis-5.0.10# mkdir /var/lib/redis
    root@jsm-redisTechBlog:~/redis-5.0.10# mkdir /var/run/redis
  5. redis.service 등록
    
    root@jsm-redisTechBlog:~/redis-5.0.10# cat >> /etc/systemd/system/redis.service <<EOF
    [Unit]
    Description=KT CLOUD REDIS
    After=network.target
    [Service]
    Type=notify
    User=root
    Group=root
    LimitNOFILE=65536
    ExecStart=/usr/local/bin/redis-server /etc/redis/redis.conf
    ExecStop=/usr/local/bin/redis-cli shutdown
    TimeoutStartSec=900
    TimeoutStopSec=900
    RestartSec=5s
    Restart=on-success
    [Install]
    WantedBy=multi-user.target
    EOF
    root@jsm-redisTechBlog:~/redis-5.0.10# systemctl daemon-reload
  6. redis.conf 이동 및 수정
    
    root@jsm-redisTechBlog:~/redis-5.0.10# cp ~/redis-5.0.10/redis.conf /etc/redis/redis.conf
    root@jsm-redisTechBlog:~/redis-5.0.10# cat >> /etc/redis/redis.conf <<EOF
    bind 0.0.0.0
    port 6379
    supervised systemd
    daemonize no
    pidfile "/var/run/redis/redis.pid"
    logfile "/var/log/redis/redis.log"
    loglevel notice
    syslog-enabled yes
    syslog-ident "REDIS"
    rdbcompression yes
    dbfilename "dump.rdb"
    dir "/var/lib/redis"
    EOF
  7. redis.service 실행 및 자동 실행 설정
    
    root@jsm-redisTechBlog:~/redis-5.0.10# systemctl start redis
    root@jsm-redisTechBlog:~/redis-5.0.10# systemctl enable redis​

위의 과정으로 기본적인 Stand Alone 형태의 redis server 구축이 완료되었습니다.

Client 접속 방법

위의 구축된 서버에 접속하기 위한 방법으로 redis-cli를 활용하는 방법과, 다양한 언어의 redis client 라이브러리를 활용하는 방법이 있습니다. 각 언어별 지원하는 client 라이브러리는 공식 페이지에서 확인할 수 있습니다.
언어 별 Client Library 목록  >> https://redis.io/clients  

 

Redis

 

redis.io

Redis-cli 이용 방법

위에서 설치했던 redis-server에서 redis-cli 커맨드를 통해 서버에 직접 접속할 수 있습니다. 서버에 접속하여, redis-server의 정보를 확인하고, 가장 기본적인 CRUD를 수행하는 과정은 다음과 같습니다.

  • 서버 접속
    
    root@jsm-redisTechBlog:~# redis-cli -h localhost -p 6379
  • redis info
    
    localhost:6379> info
    # Server
    redis_version:5.0.10
    ...생략...
    # Clients
    connected_clients:1
    ...생략...
    # Memory
    used_memory:854472
    ...생략...
    # Persistence
    loading:0
    ...생략...
    # Stats
    total_connections_received:3
    ...생략...
    # Replication
    role:master
    ...생략...
    # CPU
    used_cpu_sys:0.516337
    ...생략...
    # Keyspace
  • CREATE
    
    localhost:6379> set kt cloud
    OK
  • READ
    
    localhost:6379> get kt
    "cloud"
  • UPDATE (+READ)
    
    localhost:6379> set kt techBlog
    OK
    localhost:6379> get kt
    "techBlog"
  • DELETE (+READ)
    
    localhost:6379> del kt
    (integer) 1
    localhost:6379> get kt
    (nil)

관련 라이브러리 소개 - Lettuce Library (Java Spring Boot)

Redis를 지원하는 수많은 라이브러리 중 Spring Boot의 Lettuce Library를 활용하여 위에서 구축한 redis server에 접속하는 과정입니다. 해당 과정에는 Spring Boot 2.5와, gradle 7.0.2, openJDK 11 버전을 사용하였습니다.
아래의 소스는 https://github.com/jeonsmin9449/jsmKtTechBlogDemo 에서도 확인하실 수 있습니다.

  • build.gradle
    프로젝트에 data-redis 의존성을 추가합니다.
    
    plugins {
      id 'org.springframework.boot' version '2.5.0'
      id 'io.spring.dependency-management' version '1.0.11.RELEASE'
      id 'java'
    }
    ​
    group = 'com.jsm.kt.techblog'
    version = '0.0.1-SNAPSHOT'
    sourceCompatibility = '11'
    ​
    repositories {
      mavenCentral()
    }
    ​
    dependencies {
      implementation 'org.springframework.boot:spring-boot-starter'
      implementation 'org.springframework.boot:spring-boot-starter-data-redis'
      testImplementation 'org.springframework.boot:spring-boot-starter-test'
    }
    ​
    test {
      useJUnitPlatform()
    }
  • Code 작성
    
    import io.lettuce.core.RedisClient;
    import io.lettuce.core.RedisURI;
    import io.lettuce.core.api.StatefulRedisConnection;
    import org.junit.jupiter.api.Test;
    import org.springframework.boot.test.context.SpringBootTest;
    ​
    @SpringBootTest
    class JsmKtTechBlogDemoApplicationTests {
    ​
      private String ip = "yourIPHere";
      private int port = 6379;
    ​
      @Test
      void redisConnectionTest(){
          RedisURI redisURI = RedisURI.builder()
                  .withHost(ip)
                  .withPort(port)
                  .build();
          RedisClient redisClient = RedisClient.create(redisURI);
          StatefulRedisConnection<String, String> connection = redisClient.connect();
    ​
          //redis-cli> info
          String info =connection.sync().info();
          System.out.println(info);
    ​
          //redis-cli> set kt cloud
          String result1 = connection.sync().set("kt", "cloud");
          System.out.println(result1);
    ​
          //redis-cli> get kt
          String result2 = connection.sync().get("kt");
          System.out.println(result2);
    ​
          //redis-cli> set kt techBlog
          String result3 = connection.sync().set("kt", "techBlog");
          System.out.println(result3);
    ​
          //redis-cli> get kt
          String result4 = connection.sync().get("kt");
          System.out.println(result4);
    ​
          //redis-cli> del kt
          Long result5 = connection.sync().del("kt");
          System.out.println(result5);
    ​
          //redis-cli> get kt
          String result6 = connection.sync().get("kt");
          System.out.println(result6);
    ​
      }
    ​
    }​
    간단한 Connection 및 Command만 테스트하기 위해서, 별도의 MVC 등을 구축하지 않고, 테스트코드에 작성하였습니다. 이에 대한 실행 결과는 다음과 같습니다.

    
    .   ____         _           __ _ _
    /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
    ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
    \\/ ___)| |_)| | | | | || (_| | ) ) ) )
    ' |____| .__|_| |_|_| |_\__, | / / / /
    =========|_|==============|___/=/_/_/_/
    :: Spring Boot ::               (v2.5.0)
    ​
    ...
    ...
    2021-06-07 18:03:36.820 INFO 3769 --- [   Test worker] .k.t.j.JsmKtTechBlogDemoApplicationTests : Started JsmKtTechBlogDemoApplicationTests in 5.982 seconds (JVM running for 6.743)
    
    # Server
    redis_version:5.0.10
    생략...
    생략...
    생략...
    # Keyspace
    db0:keys=4,expires=0,avg_ttl=0
    ​
    OK
    cloud
    OK
    techBlog
    1
    null
    BUILD SUCCESSFUL in 13s

 

마무리

이번 글에서는 Redis의 가장 기본적인 Operation Model인 Stand Alone을 직접 설치해보고,
redis-cli 및 라이브러리를 활용하여 접속하는 과정을 알아보았습니다.
다만 Stand Alone은 단일 노드인 만큼, 장애 발생시 원활한 대처가 어렵습니다. 다음에는 이러한 단점들을 보완한 Operation Model인 'Master-Replica' 구조를 알아보고 이후에는 'Cluster'구조까지 알아보도록 하겠습니다.
끝까지 읽어주셔서 감사합니다. 

 

KT Cloud 상품 소개

오늘 소개드린 Redis와 관련해서 KT Cloud에서 제공중인 서비스가 있어 알려드립니다. 바로 DBaaS for Redis 서비스입니다. Cloud 환경안에서 Redis를 손쉽고 간편하게 구축/관리할 수 있는 편의성을 제공해 드립니다.

아래 링크 참조해 주세요 

 

https://cloud.kt.com/product/db/dbaas-for-redis/

 

DB - DBaaS for Redis

서비스 개요DBaaS for Redis는 Redis를 쉽게 구축하고 운영할 수 있는 서비스 입니다.자동 Fail-Over을 제공하여 장애가 발생하여도 사용자의 개입 없이 자동으로 처리되어 안정적인 서비스 제공이 가능

cloud.kt.com

 

관련글

1. KT Cloud Dev Tools - IMDB 기술 소개 - https://tech.ktcloud.com/58