DevBoi

[Spring] Memcached 적용 사례 본문

Develop/[Spring]

[Spring] Memcached 적용 사례

HiSmith 2022. 9. 26. 00:58
반응형

<Memcached가 뭐임??>

 

무료로 사용할 수 있는 오픈소스이며, 분산 메모리 캐싱 시스템

DB나 API 호출 또는 렌더링 등에서 받아오는 결과 데이터를 작은 key-value 형태로 메모리에 저장하는 방식

 

1)장점

필요량 보다 많은 메모리를 가졌을때 시스템으로부터 메모리를 사용하고, 필요로하는 메모리가 부족한 경우

이를 쉽게 더 가져다 사용할 수 있도록 만들어준다.

위 두가지는 memcache를 사용하고, 안하고에 따라 다른 것이다.

사용하지 않는 경우, 각 웹서버가 분리된 메모리에서 할당된 크기만큼 사용할 수 있지만

memcache를 사용하는 경우는 논리적 결합으로 인해 각 웹서버는 전체 메모리캐시만큼

용량을 사용할 수 있다.

 

메모리 캐시를 사용하는 경우, 모든 서버는 동일한 가상 메모리 풀을 공유한다.

특정항목이 주어졌을때, 전체 웹 클러스터에서 항상 동일한 위치에 저장되고 검색이 된다.

이는 스케일아웃이나 용량에 대한 합리적인 소비 측면에서 좋다.

 

다시 말해

Memcached(맴캐시디)의 사전적 정의로는 범용 분산 캐시 시스템이고, 무료이고 오픈소스이다.

또한 Redis처럼, 고성능 분산 메모리 객체 캐싱 시스템이다.

 

<저장 구조 및 특징>

key-value 형태로 저장, key를 통해 빠르게 데이터에 접근할 수있다.

데이터로 문자열만 지원, 작고 정적인 데이터를 캐싱할 때 사용된다.

 

<구조>

데이터를 빠르게 찾기 위한 Hash Table

key,value,ttl 및 기타 정보를 담고 있는 캐시 데이터 구조

메모리 관리자인 Slab Allocator

캐시가 가득 찼을때 캐시 항목의 제거 순서를 결정하는 LRU list

 

 

<상세>

1) Hash Table

Memcached에서 빠른 데이터 검색을 위해 해쉬 테이블을 사용한다.

각각의 버킷은 데이터들의 linked-list 형태이다.

그리고 버킷을 배열 형태로 유지, 키의 해쉬값을 통해 빠른 접근이 가능하다.

데이터 접근 시 키 값의 해쉬값을 구하여, 테이블의 인덱스에 해당하는 버킷으로 이동, 원하는 데이터를 찾을 수 있다.

 

2) Slab allocator

Memcached 의 장점중 하나인 효율적인 메모리 관리이다.

slab이 효율적인 메모리 사용을 제공한다.

Slab은 메모리 할당 단위, chunk의 집합으로 구성되어있다.

Memcached에서는 slab 리스트를 유지하고, 데이터를 저장할 메모리를 할당한다.

다양한 크기의 chunk를 가진 slab class들을 유지하고 있다.

데이터를 저장할 경우, 적절한 크기의 chunk를 가진 slab을 찾아서 저장한다.

 

1)뭐가 적절한건데?

전통적인 메모리 할당 방식으로 malloc과 free를 통해, 힙 영역에서 메모리를 관리하는 것이 아니라

memcache가 저장할 때 값의 크기를 측정하고 항목과 적절한 크기를 포함하는 슬램을 할당 해주어

슬램 내부의 청크에 저장된다.

기존 청크의 크기보다 크다면, 적절한 크기의 청크로 나누어진 새로운 슬랭이 만들어지기도하고

새 항목이 기존 청크에 적합하지만 빈 청크가 없다면 새로운 슬램이 만들어 진다.

기존 항목이 업데이트되어 크기가 커지게 되도, 같은 방식으로 슬램이 생성되어 재 할당 된다.

슬램 내부 청크가 다 차있다면, 슬램 클래스 내부에서 LRU 알고리즘에 의해 미 활용 청크를 선정, 업데이트 한다.

사용가능한 메모리를 미리 할당해 두고 사용하기 때문에 malloc/free함수보다 빠른 할당이 가능하고 메모리 파편화가 덜 일어나게 됩니다.

 

2)malloc/free가 뭔데?

malloc 은 메모리를 동적으로 할당하는 함수이고, free는 할당된 메모리를 해제해주는 함수이다.

자바의 경우 jvm이 자동으로 이 메모리 관리를 해주기 떄문에 별도로 신경쓸 필요는 없다

또한 메모리를 해제를 직접 해주어야, 가능하다.

 

 

 

 

LRU list

LRU는 잘 쓰이지 않는 것부터, least recent used였나, 무튼 최근에 사용안한거를 삭제하는 알고리즘이다.

 

double-linked-list형태로 구현되어있다. 캐시항목에 접근한 순서를 유지하고

가장 오래되어 사용하지 않은 항목을 찾을 수 있게, 삭제가 필요하면 삭제를 진행한다,.

 

Memcached는 Lazy-Expiring 정책을 사용한다. 키가 만료되어도, 노드에서 삭제하지 않는다

만료된 키에 접근할 경우, 키를 검사하여, 만료여부를 확인 후 메모리에서 제거하게 된다.

즉. 삭제 작업자체는 누군가가 접근할때 발생된다.

1)정확한 삭제 동작, Lazy-Expiring

 

 

캐시 데이터 구조

Memcached에서 캐시 데이터를 저장하기 위해 key/value 이외에도 추가적인 데이터를 포함한 구조를 사용한다.

 

1) key, key의 길이

2) data,data의 크기

3) 만료 시간

4) 최근 접근 시간

5) 해쉬 테이블에서 다음 노드를 가르키는 포인터

6) 해당 캐시 항목에 동시에 접근하는 스레드 수

7) 캐시항목 상태 플래그

 

근데 왜 안써?

Memcached 는 키 이름이 250byte로 제한

캐시 값의 용량은 1MB로 제한

String만 지원가능

Redis 처럼 데이터 타입과 API가 다양하지 않다.

데이터 변경이 잦은 경우엔 메모리 파편화가 발생하기 쉽다.

 

그럼 쓰는 사람들은 뭐야?

Db/api 통신을 줄이기 위해 데이터를 캐싱 처리하는 데에 사용하면 좋은 캐시

트래픽이 몰려도 응답속도는 안정적인 편이다. (꽤나 극단적인 경우)

내부적으로 slab 할당자를 사용하고 있어서 메모리할당이 잦지 않다 -> 메모리 파편화 문제가 적다.

Redis에 비해, 메타 데이터를 적게 사용하므로, 메모리 사용률이 상대적으로적다.

 

 

실제 적용 방법

 

우선 이론적인건 더 찾는 대로 위에 정리를 하도록하고 스프링에 바로적용해서 보자

 

<윈도우 설치>

 

https://dev18.tistory.com/11

 

memcached 윈도우 설치 및 세션공유

일반적으로 php에서 세션은 파일로 많이 사용하십니다. 하지만 웹 서버가 2대 이상일경우 로그인이 풀리는 문제가 발생될 수 있습니다. A서버에서 로그인을 해서 세션을 얻었는데 B서버로 페이지

dev18.tistory.com

참고해서 진행하면 된다.

첨부파일도 있으니, 참고를 자알 하면된다.

 

 

 

 

반응형