Technical Note/NoSQL

memcached


memcached를 분산캐시라고 부르긴 하지만 자체는 분산 기능이 없고

memcached 라이브러리인 Consistent Hashing 을 통해서 데이터 분산을 한다.


why : 

1. 사용량이 많은 동적 웹 어플리케이션에서 디비의 부하를 줄이기 위해 캐쉬 용으로 만들어 졌으며

2. web서버의 동적 추가/삭제에 대한 대처 능력이 뛰어남



 

repcached 패치는 replication기능을 추가해준다



** Consistent Hashing 이란

분산캐쉬를 구현하는 기술 

다수의 노드로 이루어진 클러스터안에 데이터를 저장할 때, 데이터의 키를 기반으로 어떤 노드에 저장할 것인가 계산하는 로직



redis 


캐쉬는 이미 요청됐거나 나중에 요청될 결과를 미리 저장해 두었다가 이를 빠르게 서비스 해 주는 것을 의미




여러대의 memcached 서버에 데이터를 분산하기 위해서 

hasing 기능을 제공해주는 라이브러리를 사용하여 각각이 서버에 접근하는 식



expire Time 설정시 주의해야 함


memcached를 리플리케이션 하려면 어떻게 해야 하나요?

 

repcached는 memcached를 Master/Master 리플리케이션

단점 : 한번에 한대만 리플리케이션이 가능하다.



redis

- Memcached와 다르게 서버 기능으로 리플리케이션을 제공함 : 

이브에 있는 Redis Conf에서 마스터 서버만 지정해주면 리플리케이션 가능

- RDB와 AOF를 꼭 사용하자

  - RDB : 현재의 메모리 상태의 Snapshot을 만들어 두는것, 일정 시기와 명령 개수가 쌓였을 때마다 남길 수 있다.

  - save 300 10 : 10개 key가 변경되면 300초 뒤에 dump를 생성하라는 의미

  

  - AOF: 일종의 Jounaling 파일 역할을 함


- RDB/ AOF는 File에 write를 하는 것이므로 성능을 저하 시킨다.

- 그래서 실제로 마스터에서는 서비스만 하고 슬레이브에서 AOF와 RDB를 이용해서 백업하는 형태로 사용한다.

 

메모리 할당 크기

: 일반적으로 전체 메모리의 60~70% 정도를 사용하는 것이 안정적입니다.




추가 사항

Memory manage : jemalloc  / max memory 초과 시 처리 매커니즘 / 메모리 할당 가이드 / 각 type별 elements 최적의 size 

Data Type : 이미지 추가, 주요 연산 command 추가

Replicaion : failover 시 처리 방법 자세히 (master가 죽었을 때)




memcached & redis 메커니즘 차이점 정리




 data type 커맨드에서 set(이었나?) 에 insert 하는 커맨드 추가도 해주세요~ 



* 샤딩 과 여러 master 

* redis 안정성 



활용

1. 가장 최근의 리스트 보여주기: LPUSH, LTRIM

2. 삭제와 필터링 : LREM

3. 순위 관련 문제 (최고점수 상위 100위의 순위표, 현재 유저의 세계 랭킹) : ZADD, ZREVRANGE. ZRANK

4. 아이템에 대한 만료시간 구현 : ZRANGE..WITHSCORES

5. Count : INCR, INCRBY

6. 주어진 시간동안 고유한 N 항목 : SADD page:day1:<page_id> <user_id>, SISMEMBER page:day1:<page_id> <user_id>



Queues


여러분들은 아마도 list push, list pop 같은 Redis 명령들이 Queues에 적합하게 만들어졌는지 알고 있을 것입니다.


하지만 이보다 더 나아가서 Redis는 목록이 비어있다면 list pop의 변형을 막을 것을 할 수 있습니다. Link : http://redis.io/commands/blpop



h2. Redis 장/단점


* 장점

** 빠른 속도

** 다양한 Data Types (memcached 와 크게 다른점)

** Persistence

** Publish/Subscribe 형태의 message 제공

** 다양한 언어의 클라이언트가 제공되고 있음

** Replication을 통한 성능 향상


* 단점

** Clustering 기능이 없어 횡적 확장성이 좋지 않음

** 쿼리 기능이 풍부하지 못함

** Sharding을 일일이 클라이언트 API를 이용해서 해줘야 함. API에서 반드시 지원

** consistent hashing 을 지원하는 client를 이용해야 distribute 가능


h2. Redis가 적합한 Case


* Case1 : 데이터 검색이 많은 경우

* Case2 : 실시간 통계 데이터가 필요한 경우

* Case3 : 랭킹 정보 및 최근 N개 데이터

* Case4 : Counter 정보