본문 바로가기

728x90

DB/Redis

(9)
Redis 성능 튜닝 1. Eviction 정책 메모리가 한계에 도달할 때 어떤 조치가 일어날지 결정하는 것을 뜻한다. 처음부터 메모리가 부족한 상황을 많들지 않는 게 중요하고, 캐시로 사용할 때는 적절한 eviction policy가 사용된다. 1.1 Redis의 메모리 관리 maxmemory 100mb Memory의 사용 한도를 설정한다. 지정하지 않으면 32bit에서는 3GB, 64bit에서는 0(무제한)으로 설정된다. 32bit OS에서는 사용하는 게 제한됐기 때문에 3GB밖에 못 쓴다. maxmemory-policy noeviction maxmemory일 경우에 eviction 정책을 설정한다. 1.2 maxmemory-policy 옵션 Redis는 메모리를 어떻게 다루는지가 정말 중요하다. 이에 관한 옵션이 있다...
Redis 클러스터 1. 확장성과 분산 확장성은 서비스가 커질 때 대응할 수 있는 능력을 뜻한다. 주로 규모에 대한 확장성을 의미한다. 방식은 수직 확장(Scale-up)과 수평 확장(Scale-out)이 있다. 1.1 수직 확장(Scale-up) 단일 하드웨어의 리소스(CPU, 메모리, 네트워크 어댑터 등)를 추가하거나, 기존 하드웨어를 고성능으로 교체하는 것을 의미한다. 1.2 수평 확장(Scale-out) 서버를 여러 개를 둬서 작업을 분산한다. 이론적으로 무한대로 확장이 가능하다. 그러나 수직 확장에 비해 매우 까다롭다. 수평 확장을 하면 아래와 같은 개발 복잡성이 많아진다. 부분 장애 네트워크 실패 데이터 동기화 로드밸런싱 개발 및 관리의 복잡성 그럼에도 서비스 복잡도와 규모의 증가로 분산은 피할 수 없기에 많이 ..
Redis 백업과 장애 복구 1. RDB 백업 특정 시점의 스냅샷으로 데이터를 복구한다. 재시작 시 RDB 파일이 있으면 복구한다. 장점으로는 작은 파일 사이즈로 버전 관리를 할 수 있어서 백업 관리가 용이하고, fork를 통해 백업해서 child process가 서비스 중인 프로세스는 성능에 영향이 없다. 단점으로는 틈이 있을 수 있어서 데이터 유실이 있을 수가 있고, fork를 사용해서 시간이 오래 걸려 CPU와 메모리 자원을 많이 소모한다. 그래서 데이터 무결성이나 정합성 요구가 크지 않을 때 사용한다. 1.1 RDB 설정 설정 파일이 없어도 기본값으로 RDB가 활성화됐다. 설정 파일을 만들려면 템플릿을 받아 사용해야 한다. 저장 주기 설정(ex: 60초마다 5개 이상 변경) save 60 5 스냅샷 저장 파일 이름 .dump..
Pub/Sub 패턴으로 채팅방 구현 1. Pub/Sub 패턴 메시징 모델 중 하나로 발행(Publish)과 구독(Subscribe) 역할을 개념화 한 패턴이다. 발행자와 구독자는 서로에 관한 정보 없이 특정 토픽을 매개로 송수신한다. 2. 메시징 미들웨어와 Redis의 Pub/Sub 차이점 보통 kafaka, RabbitMQ, ActiveMQ 같은 메시징 미들웨어의 장점은 낮은 결합도로 직접 서로 의존치 않고 미들웨어에 의존한다. 두 번째는 탄력성으로 느슨한 연결로 인해 장애가 일부 생겨도 영향이 최소화된다. 세 번째는 통신을 비동기 처리해서 API 호출을 제거하여 처리 시간을 감소한다. 반면 Redis의 Pub/Sub은 메시지가 큐에 저장하지 않고, kafaka의 컨슈머 그룹 같은 분산 처리 개념이 없다. 또한 메시지 발행 시 push ..
Sorted Sets으로 리더보드 구현 1. 리더보드(Leaderboard)의 특성 게임이나 경쟁에서 상위 참가자의 랭킹과 점수를 보여준다. 그룹 상위 랭킹 혹은 특정 대상의 순위를 나타낸다. 최다 구매 상품, 리뷰 순위 등의 순위로 나타낼 수 있는 다양한 부분에서 응용이 가능하다. 구매 상품의 뷰, 댓글 등을 계산할 수 있다. 2. API 관점에서 리더보드의 동작 점수 생성 및 업데이트를 구할 때 SetScore로 점수를 구하거나, 상위 랭크 조회 시 범위 기반으로 getRange를 사용하던가, 아니면 특정 대상 순위 조회를 할 때 값 기반 조회로 getRank를 사용한다. 리더보드의 핵심은 빠른 업데이트와 빠른 조회이다. 관계형 DB 등의 레코드 구조를 사용했을 때 데이터 구조와 성능에 문제가 발생한다. 업데이트 시 한 행에만 접근하기에 ..
Redis로 캐시 레이어 구현 1. 캐싱의 원리와 목적 캐시는 성능 향상을 위해 값을 복사한 임시 기억 장치이다. 위로 갈수록 속도가 빠르며, 가격이 비싸다. 캐시에 복사본을 저장하고 읽음으로써 속도가 느린 장치의 접근 횟수를 줄인다. Cache의 데이터는 원본이 아니라 언제든 사라질 수 있다. 이에 데이터 일관성 문제를 해결해야 한다. 캐시는 어디든 적용이 가능하다. 네트워크 지연 속도를 감소하거나, 서버 리소스 사용 감소, 병목현상을 감소할 수 있다. DB는 무한정 늘어날 수 없어서 병목이 된다. 그런데 캐시는 이런 병목 현상을 줄일 수가 있다. 캐싱 개념들은 아래와 같다. 캐시 적중(Cache Hit): 캐시에 접근해 데이터를 발견한다. 캐시 미스(Cache miss): 캐시에 접근했으나 데이터를 발견 못 함. 캐시 삭제 정책(..
Redis를 이용한 세션 구현 1. 세션이란? 세션은 연결에 필요한 메타 데이터 + 시간을 뜻하고, 어디에 적용되느냐에 따라 조금씩 다른 뜻을 가진다. 일반적인 세션은 네트워크 상에서 두 개 이상의 통신장치 간에 유지되는 상호 연결을 뜻한다. 연결된 일정 시간 동안의 유지 정보를 나타낸다. Web 로그인 세션은 웹에서 특정 유저가 로그인했음을 나타내는 정보이다. 브라우저는 Cookie를 서버는 해당 Cookie의 세션 정보를 저장한다. 유저가 로그아웃하거나 세션이 만료될 때까지 해당 유저의 서비스가 가능하다. 1.1 로그인 과정 먼저 ID, Password를 입력해서 DB로부터 유저 정보가 일치한 지 확인한다. 일치하면 유저 정보를 세션으로 저장하고 연관된 SessionId를 반환한다. Session ID를 HTTP Header의 s..
Redis 적용 및 다양한 DataType 1. Redis 설치 소스와 바이너리 형태로 제공하며, 주로 리눅스에서 설치해 사용한다. 물론 Redis는 OS에 상관없이 어디든 사용 가능하다. window 설치, Mac 설치 링크를 참고. 편의를 위해서 이 포스팅에서는 Docker에서 Redis를 간편히 설치하겠다. 도커 설치는 공식 홈페이지를 확인하면 된다. docker pull redis docker run --name my-redis -d -p 6379:6379 redis redis 이미지를 가져와서 my-redis라는 이름으로 6379 포트에 실행한다. docker ps 명령어를 통해 redis 컨테이너가 실행됨을 확인할 수 있다. 2. Redis 실습 도커 컨테이너 안에서 실행되게끔 만들었다. Redis 모듈의 구조는 위의 사진과 같다. r..

728x90