Search
Duplicate
💽

Redis

태그
작성일자
1 more property

Redis란?

Redis 는 일종의 Database 로써 in-memory 기반의 저장소 이다. in-memory 기반이란, 전통의 database 는 정보를 disk(HHD, SSD 등) 에 저장하는 방식이고 레디스는 RAM이라 불리는 저장소를 사용한다. key-value 기반의 저장소이고, 캐시 및 메시지 브로커로 사용된다.

도입 이유

기존 로직은 iot 데이터를 수신 하고 있는 상태에서 이 데이터를 자바 메모리 상에 저장 후 특정 주기마다 API 요청을 받아 Postgresql에서 조회를 하여 iot 데이터와 Postgresql 데이터를 가공 후 전송 해주는 방식이었는데, 이러한 방식은 api 방식으로 대량의 데이터를 처리하여 응답해주니 처리 시간이 매우 오래 걸렸다. 5분 동안 모은 데이터를 처리 하는데 5분 이상이 소모되었다. 때문에 이 로직을 없애고 iot 데이터 수신 시 마다 필요한 데이터를 빼내올 수 있는 저장소가 필요했고, 기존 api 로직을 websocket 방식으로 바꿈으로써 클라이언트의 요청시 작동하는 로직이 아니라 스트리밍 방식으로 한번에 하나의 데이터만 처리할 수 있게 하는 로직이 필요했다.
iot 데이터를 수신해서 Postgresql 에 저장되어있는 데이터와 매칭 및 가공하여 GIS 상에 표출하는 로직이 존재하는데 분당 10만건 이상의 iot 데이터를 처리해야하는 상황에서 매 주기마다 db에 접근하여 데이터를 가공하기에는 큰 무리가 있었다. 그렇다고 db의 데이터를 자바에 담고 있기에는 리스크(out of memory)가 크고 데이터가 휘발성이라는 점에서 불편이 있었다. 다시 말해 현재 필요한 요구 사항은 빠른 속도로 데이터를 꺼내올 수 있고, 휘발성 데이터가 아닌 영속성을 띄는 데이터 저장소인데, 이에 부합하는 저장소가 redis 였다.

구성 방법

일단 클러스터링 구성은 불가피해 보였다. 분당 10만번의 데이터의 select 가 일어나야하는 상황에서 단일 쓰레드로 동작하는 방식은 조금 무리가 있어보였기 때문에 같은 서버 내에서라도 3개의 cluster 를 구성했다.
도커 compose 파일
#도커 컴포즈 version: '3' services: redis-master-1: container_name: redis-master-1 image: bitnami/redis:latest command: redis-server /etc/redis.conf volumes: - ./7001/redis-master-1.conf:/etc/redis.conf restart: always network_mode: "host" environment: - REDIS_PROTECTED_MODE=no user: "0:0" redis-master-2: container_name: redis-master-2 image: bitnami/redis:latest command: redis-server /etc/redis.conf volumes: - ./7002/redis-master-2.conf:/etc/redis.conf restart: always network_mode: "host" environment: - REDIS_PROTECTED_MODE=no user: "0:0" redis-master-3: container_name: redis-master-3 image: bitnami/redis:latest command: redis-server /etc/redis.conf volumes: - ./7003/redis-master-3.conf:/etc/redis.conf restart: always network_mode: "host" environment: - REDIS_PROTECTED_MODE=no user: "0:0"
YAML
복사
redis.conf ⇒ compose 의 각 컨테이너 volume 에 맞게 디렉토리 설정
port 7001 bind 0.0.0.0 cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 3000 appendonly yes cluster-announce-ip 1.2.3.4 cluster-announce-port 7001 cluster-announce-bus-port 17001 protected-mode no port 7002 bind 0.0.0.0 cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 3000 appendonly yes cluster-announce-ip 1.2.3.4 cluster-announce-port 7002 cluster-announce-bus-port 17002 protected-mode no port 7003 bind 0.0.0.0 cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 3000 appendonly yes cluster-announce-ip 1.2.3.4 cluster-announce-port 7003 cluster-announce-bus-port 17003 protected-mode
YAML
복사
위와 같은 설정으로 compose 를 실행하고 난 뒤에 redis 컨테이너 내부로 접속하여, 컨테이너 끼리의 cluster 설정 필요
docker exec -it redis-master-1 /bin/bash redis-cli --cluster create 1.2.3.4:7001 1.2.3.4:7002 1.2.3.4:7003
YAML
복사
위와 같이 구성 후 프로젝트 시작시에 필요한 데이터를 가공하여 redis 에 적재했고, iot 데이터 수신 시 마다 redis에 접근하여 필요한 데이터를 꺼내 가공 후 websocket 방식으로 프론트로 전송했다.

결과

성능적으로 5분 이상 걸리던 데이터 처리 작업이 실시간(0.01초 이내)으로 줄어들었다.
대략적으로 1/30000 정도의 속도 개선이 있었다.