개 요
백엔드개발을 어느정도 하다보면, 성능에 대한고민을 많이하게되는 순간이오게된다.
데이터 저장소라는 의미는 초기에는 데이터베이스만 생각하다 메모리에도 저장 할 수 있게 되는것을 알게된다.
또한, 메모리에 저장하는것이 데이터베이스에서 데이터를 로드해오는것보다 빠르다는것도 알게된다.
메모리에 데이터를 저장하고 사용하는것을 cache 라고하며 백엔드개발자로서 웹서버의 성능을 높이기위해 반드시 필요한 기능이다.
그럼, 성능을 향상시키기 위한 메모리 저장소에 대해서 알아보자.
종 류
- Memcached
- Redis
특 징
둘다 오픈 소스이며 Memcahed는 명료하고 단순함을 위하여 개발된 반면, Redis는 다양한 용도에 효과적으로 사용할 수 있도록 많은 특징을 가지고 개발되었습니다.
공통점
1. 1ms 이하의 응답대기시간
1ms 이하의 응답시간을 제공합니다. 데이터를 메모리에 저장하기 때문에, 디스크 기반의 데이터베이스보다 빠르게 데이터를 읽을 수 있습니다.
2.개발의 용이성
문법적으로 사용하기 쉽고, 개발코드 양 또한 적습니다.
3. 데이터 파티셔닝
데이터를 여러 노드에 분산하여 저장시킬 수 있습니다. 따라서 수요가 증가할 때 더 많은 데이터를 효과적으로 처리하기 위하여 스케일아웃이 가능합니다.
4. 다양한 프로그래밍 언어 지원
여러 개발언어를 지원합니다. 자바, 파이썬, C, C++, C#, JavaScript, Node.Js, Ruby, Go 그리고 다른 언어들을 지원합니다.
Memcached만 의 특징
멀티스레드를 지원하기 때문에, 멀티프로세스코어를 사용할 수 있습니다. 따라서, 스케일업을 통하여 더욱 많은 작업처리를 할 수 있습니다.
Redis만 의 특징
1. 더욱 다양한 데이터 구조
문자열 뿐만 아니라 List, Set, 정렬된 Set, Hash, Bit 배열, hyperloglogs (매우 적은 메모리로 집합의 개수를 추정할 수 있는 방법)을 지원합니다. 프로그램에서 위의 다양한 자료구조를 사용할 수 있습니다. 예를 들어, Sorted Set을 활용하여 게임유저의 상위랭크 정보를 쉽게 제공할 수 있습니다.
2. Snapshots
레디스는 특정시점에 데이터를 디스크에 저장하여 파일 보관이 가능합니다. 또한, 장애상황시 복구에 사용할 수 있습니다.
3. 복제
Master — Salves 구조로, 여러개의 복제본을 만들 수 있습니다. 따라서 데이터베이스 읽기를 확장할 수 있기 때문에 높은 가용성(오랜 시간동안 고장나지 않음) 클러스터를 제공합니다
3. 트랜젝션
트렌젝션이란 데이터베이스 상태를 변경시키는 작업 단위를 의미하고, 원자성, 일관성, 독립성, 지속성의 특징을 가지고 있습니다. Redis는 이러한 특징을 지원합니다.
4. Pub / Sub messaging
Publish(발행)과 Sub(구독)방식의 메시지를 패턴 검색이 가능합니다. 따라서 높은 성능을 요구하는 채팅, 실시간 스트리밍, SNS 피드 그리고 서버상호통신에 사용할 수 있습니다.
5. 루아 스크립트 지원
매우 경량화된 절차스크립트 언어인 루아를 지원합니다. eval 명령어를 사용하여 루아스크립트를 실행시킬 수 있습니다. 따라서, 프로그램을 명료하게하고 성능을 높일 수 있습니다.
6. 위치기반 데이터 타입 지원
Redis는 실시간 위치기반데이터를 지원합니다. 따라서, 두 위치의 거리를 찾거나, 사이에 있는 요소 찾기등의 작업을 수행할 수 있습니다. 이를 활용하여 맛집, 길찾기 그리고 지도기반의 고성능 서비스를 제공할 수 있습니다.
주의점
위의 특징만 보면, 모든 상황에서 Redis를 선택해야할 것 같습니다.
하지만, Redis는 싱글 쓰레드이기 때문에, 1번에 1개의 명령어만 실행할 수 있습니다. Keys(저장된 모든키를 보여주는 명령어)나 flushall(모든 데이터 삭제)등의 명령어를 사용할 때, 맴캐쉬드의 경우 1ms정도 소요되지만, 레디스의 경우 100만건의 데이터 기준 1초로 엄청난 속도 차이가 있습니다.
또한, RDB 작업(특정 간격마다 모든 데이터를 디스크에 저장)이 매우 오래걸립니다. AWS, 60기가 메모리 기준으로 10분이나 소요됩니다. Redis 장애에 원인의 대부분이 해당 기능 때문에 발생하기 때문에 사용할 때 주의해야합니다.
Redis | Memcached | |
저장소 | In Memory Storage | |
저장 방식 | Key-Value | |
데이터 타입 | String, Set, Sorted Set, Hash, List | String |
데이터 저장 | Memory, Disk | Only Memory |
메모리 재사용 | 메모리 재사용 하지 않음(명시적으로만 데이터 삭제 가능) | 메모리 부족시 LRU 알고리즘을 이용하여 데이터 삭제 후 메모리 재사용 |
스레드 | Single Thread | Multi Thread |
캐싱 용량 | Key, Value 모두 512MB | Key name 250 byte, Value 1MB |
Ehcache
ehcache는 Spring에서 간단하게 사용할 수 있는 Java기반 오픈소스 캐시 라이브러리이다.
redis나 memcached같은 캐시 엔진들도 있지만, 저 2개의 캐시 엔진과는 달리 ehcache는 데몬을 가지지 않고 Spring 내부적으로 동작하여 캐싱 처리를 한다.
따라서 redis같이 별도의 서버를 사용하여 생길 수 있는 네트워크 지연 혹은 단절같은 이슈에서 자유롭고 같은 로컬 환경 일지라도 별도로 구동하는 memcached와는 다르게 ehcache는 서버 어플리케이션과 라이프사이클을 같이 하므로 사용하기 더욱 간편하다.
참고자료
'서버 > 성능과 튜닝' 카테고리의 다른 글
성능튜닝을 위한 Linux Thread 수 확인 및 Queue 길이 확인 (0) | 2020.05.19 |
---|---|
성능튜닝 관련 application 설정 (0) | 2020.05.19 |
톰켓(Tomcat) 성능 튜닝하기 (0) | 2020.05.19 |
성능테스트 프로세스 (0) | 2020.05.19 |
API 성능테스트 시 고려사항 (0) | 2020.05.06 |