본 게시물은 이전에 운영하던 velog에서 작성됨 (2023년 4월 5일 작성)
레디스를 좋아요, 세션, 캐시 용도로 사용하고자 마음을 먹고
레디스 클라우드에서 제공해주는 무료 서버를 파서 사용했다.
사용하다보니 몇가지 비효율적인 부분이 생겼다.
- 레디스 클라우드와 커넥션할 때 굉장히 자주 타임 아웃이 발생하였다. 커넥션 타임을 늘려줘도 마찬가지였다.
- 레디스 클라우드 무료 인스턴스는 사용할 수 있는 최대 메모리 용량이 30MB 밖에 안된다.
- 다양한 데이터가 하나의 인스턴스에 저장되는 것은 싱글스레드로 작동하는 레디스의 성능에 문제를 끼칠 수 있을 것 같았다.
이러한 이유로 EC2 인스턴스를 하나 파서 용도별로 docker redis container를 띄워서 사용하기로 했다.
EC2 프리티어는 총 1GB의 메모리를 제공해주기 때문에 레디스 클라우드 무료 인스턴스보다 더 많은 데이터를 저장할 수 있다. 또한 용도별로 나눴기 때문에 하나의 인스턴스에 I/O가 몰리지 않아 더 빠른 데이터 처리가 가능할 것으로 생각했다.
🐇 redis.conf 만들기
우선 각 인스턴스에 적용될 설정 파일을 만들어야한다.
/etc/redis-custom-conf 디렉토리를 만들었고
내부에 3개의 conf 파일을 만들었다.
3개의 파일에는 대체로 비슷한 내용의 설정으로 작성하였다.
// redis-session.conf
# redis 인스턴스로 접근 가능한 ip
bind 0.0.0.0
# 어떤 포트로 열 것인지(기본 6379)
port 6379
# redis 인스턴스 접근 시 인증으로 사용될 비밀번호
requirepass qlalfqjsgh3492309u1jd93d
# redis 인스턴스가 사용할 최대 메모리 용량
# 32bit는 기본 3gb, 64bit는 기본 용량 제한 없음
maxmemory 100mb
maxmemory-policy volatile-ttl
# 스냅샷 백업 주기 설정 (900초 내로 50개의 키 변경 시 백업)
save 900 50
🐡 docker volume 만들기
호스트와 도커 컨테이너 간의 데이터 공유를 위해 volume을 인스턴스 별로 3개 만들었다.
🎅 컨테이너 띄우기
docker run -d --name redis-for-cache --restart always -p 6381:6379 -v /etc/redis-custom-conf/redis-cache.conf:/etc/redis/redis.conf -v redis-cache-volume:/data redis redis-server /etc/redis/redis.conf
볼륨 옵션이 2번 들어가는데 첫번째는 호스트에서 만들어놓은 conf 파일을 컨테이너의 /etc/redis/redis.conf 경로에서 사용하기 위함이고,
두번째는 redis 인스턴스의 백업 파일인 rdb 파일을 호스트에 영구 저장하기 위해 명시한다.
👻 애플리케이션과 연결하기
우선 .env 파일에 redis 인스턴스의 host, password, port를 작성한다.
CICD에서도 환경변수가 사용될 수 있도록 github actions workflow를 수정한다. 물론 환경변수 값들은 github secrets에 등록해야한다.
마지막으로 RedisModule에 redis인스턴스 정보를 추가한다.
각 인스턴스에는 namespace를 명시하였고, 이 namespace를 이용해서 원하는 redis 인스턴스를 사용할 수 있다.
이런식으로 session db를 사용하고 싶으면 getClient의 인수로 session이라는 namespace를 전달하면 된다.
[Nest] 20588 - 2023. 04. 05. 오후 2:44:05 LOG [NestApplication] Nest application successfully started +10ms
이제 타임아웃도 전혀 발생하지 않고 더 많은 용량을 저장할 수 있으며 더 빠른 데이터 활용이 가능해졌다.
'NestJS' 카테고리의 다른 글
[NestJS] OAuth 인증 (+ 중복 로그인 방지) (0) | 2023.07.30 |
---|---|
[NestJS | Redis] 데이터 캐싱하기 (Look-Aside) (0) | 2023.07.30 |
[NestJS | Redis] 세션 스토리지 만들기 (0) | 2023.07.30 |
[NestJS] DTO 만들 때에는 interface보다 class를 사용하자 (0) | 2023.07.30 |