[참고자료]
Snapshot
: RDB와 비슷하게 어떤 특정 시점의 데이터를 Disk에 담는 방식을 뜻한다. Blocking 방식의 SAVE와 Non-blocking 방식의 BGSAVE 방식이 있다.AOF
: Redis의 모든 write/update 연산 자체를 모두 log 파일에 기록하는 형태이다. 서버가 재시작 시 write/update를 순차적으로 재 실행하고 데이터를 복구한다.예를 들어, 게임의 랭킹 상위 100위를 보여주는 기능이 있다고 해보자.
랭킹 정보를 사용자에게 제공하기 위해
오라클같은 관계형 데이터베이스에
랭킹 정보를 저장을 하고
order by 로 불러올 수 있다.
그런데 사용자 수가 폭발적으로 증가해
수백만명으로 늘어나게 되면 어떻게 될까?
보여주는건 100명의 데이터뿐이지만
시간이 점점 오래 걸리게 될 것이다.
이러한 문제를 해결하기 위해
캐시에 상위 100명의 랭킹정보를 담고 있다면
좋은 해결책이 될 것이다.
나는 원래 Java - SpringBoot로 개발 하던 사람이었다. Redis를 접하고 가장 먼저 든 생각은 ‘그냥 hash map구조 아니야?’ 였다. 그래서 처음엔 구지 인스턴스에 redis를 설치하면서 까지 사용해야할 필요를 못 느꼈다.
그러나, 서버가 1대 있다는 가정이 아닌, 분산 환경을 대입하면 장점이 드러난다.
1) 분산 환경에서의 Redis 장점
유저의 요청이 크게 늘어나 서버를 몇 대 증설하였지만, 동일한 해쉬맵 데이터를 참조해야할 상황이 있다고 가정한다.
이 때 원격 프로세스간에 동일한 해쉬맵 데이터를 참조해야 한다면, 분산 환경에서 원격 프로세스간 데이터를 동기화 하기 어렵다.
이 때, 아래의 그림과 같이 ¹별도의 레디스 서버를 구성하고, 해당 레디스에서 값을 꺼내 쓴다면 메모리 기반 데이터 구조의 빠른 응답성을 확보함과 동시에 데이터 불일치 문제를 해결할 수 있다.
2) DBMS로서의 장점
또한 어플리케이션을 종료하면 휘발되어 사라져버리는 HashMap과 달리, Redis는 다양한 영속성(디스크 백업) 옵션을 제공한다.
🚨 의견(1): 프로젝트에 redis를 적용하니 팀원 중 한 명이 Redis는 비용이 많이 나가는데, 빈 객체를 생성해서 hash-map구조로 하는게 더 경제적이지 않느냐는 의견을 냈다.
어찌보면 맞는 말 같기도 하지만 '사업규모가 커져 분산 환경을 사용해야한다면?', '보안에 문제가 생긴다면?' 과 같은 부분을 함께 고민해야한다. 단순 프로젝트성이라면 빈 객체로 hash-map구조를 사용하여 구현해도 되지만 실제 프로덕션 환경임을 간과해선 안된다고 생각이 들었다.
사용자의 정보
= 기업의 돈
과 직결되어 있기 때문이다.
🚨 의견(2): 데이터서버에서 redis까지 사용할 이유가 있는가?
현재의 서버에서 성능이슈가 발생할 가능성에 대해 따져본다면 나의 결론은, 충분히 필요하다이다.
왜냐하면,
지금 데이터서버가 단일서버로 운영하고 있다하더라도 추후 예정된 신규사업에서 146대의 카메라와 2-3개의 리프트 카메라가 30분마다 최소 4-500개의 img가 서버에 전송될 예정이다.
현재, DB에는 34개의 클라이언트가 있고 이 클라이언트는 하나의 서버에 정시 혹은 30분 간격으로 데이터 전송(img, json) 요청을 하고 있다.
회사의 규모가 확장함에 따라 신규사업과 같은 곳이 20곳만 된다고 하더라도 8mb크기의 image를 450개씩 30분마다 전송한다고 가정한다면, 처리해야할 총 데이터량은 대략 72GB에 이른다. 이는 인스턴스의 상당한 부담이 될 수 있다.
이 요청마다 매번 db에서 조회를 하게되면 데이터베이스 과부하 뿐 아니라 EC2에서도 상당한 부담이 될 것이라고 생각한다. 그렇기 때문에 캐시 서버를 사용하는 이유다. 캐시 서버의 가장 대표적인 것이 redis이다.
캐시 서버인 redis를 사용하게 된다면, 매 요청마다 db에서 조회를 하지 않고, 클라이언트가 웹 서버에 요청을 보낼 때마다 웹 서버는 데이터를 DB에서 가져오기 전에 Cache에 데이터가 있는지 확인한다.
캐시 서버에 데이터가 있으면 데이터를 DB에 데이터를 요청하지 않고 바로바로 클라이언트에 데이터를 반환하는데 이를 cache Hit라고 한다.
반대의 경우는 cache Miss라고 한다. cache 서버에 데이터가 없으면 DB에 해당 데이터를 요청한다. DB는 사용자가 원하는 데이터를 반환해주고, 웹 서버는 반환된 데이털르 다음 사용을 위해 캐시에 저장한 후 클라이언트에 반환한다. 따라서 이후, 같은 요청이 들어온다면 그때는 cache hit이 발생하는 구조다.
redis를 사용할 때 3가지 방법이 있다.
1) AWS의 Redis Cloud를 사용하는 방법과, 2) AWS ElastiCache를 사용 하는 방법, 그리고 3) EC2인스턴스에 Redis를 설치하는 방법이다.
결론적으로 말하면, 나는 EC2인스턴스에 Redis를 설치할 예정이다.
현재는 내 로컬에 redis를 설치하여 실행했다. 로컬에서 redis서버를 꺼버리면 redis를 사용할 수 없기에 다른 방법을 찾아봐야 했다. 아직은 적용 전이지만 해볼 수 있는 것은,
1. AWS에 ElastiCache를 사용해서 redis 캐시 서버 만들기
2. AWS의 EC2에 직접 redis 설치하기
1번에 대한 방법은 ElastiCache는 AWS의 내부에서만 사용이 가능하기 때문에 test가 생각보다 쉽지 않다. 그래서 접근이 쉬운 2번의 방법을 생각하고 있다.
EC2 서버에 접속한다.
인스턴슬르 선택하고 오른쪽 상단 연결버튼을 누르면 SSH로 연결할 수 있는 명령어가 뜬다.
ssh -i ~ 와 같은 형식으로 적혀있을 건데 그것을 복사해준다.
인스턴스 생성 시 새로 발급받은 보안키 페어가 있는 곳으로 이동하여 명령어를 실행시켜 준다.
ssh-keygen -R [EC2 ip]
등의 방법이 있다. 22번 포트의 접근 ip를 내 ip로 바꾸고 인스턴스를 중지한 뒤 재부팅하면 접속이 가능하다.