///
Search
🥈

ElastiCache 운영을 위한 우아한 가이드: 초고속 메모리 분석 툴 개발기와 레디스 운영 노하우 소개 (김가림)

1. Overview of ElastiCache for Redis

고성능 인메모리 데이터베이스
Redis 인스턴스 장애시 자동으로 Failover
Redis 기본 파라미터를 사용하지 않고 EalstiCache가 추천/운영하기 효율적이라고 생각하는 파라미터로 기본 파라미터가 변경되어 있음.
타입 변경
타입 변경시 신규 Redis 인스턴스 생성 후 신규 Reid 인스턴스로 복제 진행. 복제가 완료되면 신규 인스턴스로 스위칭 → 스위칭 시 클라이언트에서는 순단 발생. Redis 인스턴스의 IP 변경으로 인해… 클라이언트 DNS로 연결 → 변경 작업은 최대한 영향도가 없는 시간에 진행 → 운영 작업전 Failover될때 DNS 캐싱(TTL)으로 인해 얼마나 순단 발생하는 지 확인. TTL 조정 필요
스케일 아웃은 클러스터 모드로 사용할 때만 가능
데이터가 여러 샤드에 나누어져서 저장. 샤드를 추가하는 것을 스케일 아웃이라고 함.
온프레미스에서는 최소 3개의 마스터가 있어야 하나 ElastiCache에서는 하나 또는 두개의 샤드로도 클러스 사용 가능
최대 500개의 샤드. 샤드당 5개 복제

2. 가상 이슈 사례로 알아보는 ElastiCache 운영 방법

이슈 발생시 확인해야할 메트릭…
네트워크 - 인바운드, 아웃바운드
개발팀 - 변경, 새로 배포된 사항 확인

이슈 사례 1 - CPU 증가

CPU 92%
네트워크 트래픽 증가
커멘드 사용 수 저하로 → 정상적으로 지금 요청 처리할 수 없는 상황은 아닌지 의심.
읽기 / 쓰기 커맨드 영향??
유형 별 카운트 지원
추가 메트릭을 Grafana 로 모니터링
mget 커맨드가 716.61ms 로 느리게 수행되고 있다. → 해당 시점에 5만개 가까이 한번에 실행됨.
위 그래프를 통해 mget이란 커맨드가 시스템 이슈에 영향을 미치고 있는것 같다…
mget 커맨드 → Redis에서 String 형식의 키를 한번에 여러가 가저오는 커맨드
CLI에서 또는 로그 그룹에서 Slowlog 확인 가능
위 예에서는 mget 커맨드로 5000개 이상의 키를 가져오느라 뭔가 지연이 길어짐 → CPU 피크
항상 slow log에 잡히는 것은 아니다.
Redis는 싱글 쓰레드로 동작하기 때문에 모든 클라이언트의 요청을 하나의 이벤트 루프에서 차근차근 수행
맨 우측 커맨드 경우 대기시간은 19초. 실제 처리는 1초 but, 응답은 20초 → 이런 경우 slow log에 안잡힘
Redis 사용시 지연을 유발시키는 커맨드 자체를 사용하지 않는것이 좋다.
MGET + 위 커맨드
Hash, Set: 내부에 아이템이 많이 들어가면, 그런 아이템을 한번에 가져와서 지연 유발
HGETALL: 내부에 모든 키와 밸류를 한번에 리턴하기 때문에 오래 걸릴 수 있다.
Sorted Set: 집합 연산을 할 수 있는데 집합의 카디널리티가 너무 크게 될수록 이런 집합 연산을 하는데에도 오랜 시간이 소요
ElastiCache에서는 엔진 CPU 사용률, CPU 사용률 메트릭 제공
엔진 CPU 사용률: 92%, CPU 사용률: 32%
엔진 CPU 사용률 → Redis 프로세스 자체 Load
CPU 사용률 → 서버 CPU 사용률
AWS에서는 CPU 갯수에 따라 아래처럼 모너터링 권고 → CPU가 늘어날 수록 그 안에서 Redis가 얼마나 사용하고 있는 확인하기 어렵다.
CPU가 4개 이상이면 → 엔진 CPU 사용률
CPU가 2개 이하이면 → CPU 사용 → Redis프로세스 뿐만 아니라 기타 백그라운드 모니터링 등에 사용하는 기타 백그라운드 프로세스의 로드가 같이 보는것이 좋다.

이슈 사례 2

네트워크 사용량 증가
네트워크 이슈로 인지하지 못한 이유…
보통은… 대역폭이 부족해서 어 부족한 상황이다 하면은 왼쪽 그래프처럼 특정한 임계치에 더 이상 데이터가 증가하지 않는 더 이상 어 네트워크를 사용할 수 없는 이런 상황을 예상
실제로는 오른쪽처럼 그런 임계치를 더 넘어선 데이터도 사용… → AWS 네트워크 I/O 크레딧 매커니즘으로 인해…
타입별로 쓸 수 있는 네트워크 대역폭이 정해짐.
대역폭보다 적은 네트워크를 사용할 때에는 어 크레딧 버킷에 크레딧을 이렇게 모아놨다가 더 많은 네트워크를 사용할 때 그 크레딧을 사용해서 네트워크 대역폭 버스트 네트워크 대역폭을 더 사용.
인스턴스에 따라 다르지만 5분에서 60분 정도 버스트 대역폭을 사용할 수 있고 버스트 대역폭은 인풋이 아웃풋이 다 각각 따르게 존재
Busting 될때 마다 “네트워크 수신 대역폭 허용 한도가 초과됨” 그래프에 카운팅됨.
Redis에 저장되는 데이터 압축 또는 스케일

이슈 사례 3 - 메모리 증가

개발팀에서 Redis에 데이터 입력하기 때문에 Redis운영팀에서는 데이터을 열어보기가 힘듬. → 그래서 분석 툴 개발했다.

3. 신규 레디스 메모리 분석 툴 개발기

레디스 메모리 분석 툴 기능의 필요성

신규
매일 새벽에 배치로 작업후 Grafana에 저장
데이터 변화 파악 가능

Redis Keys Statistics 소개

Top 20 largest keys in Redis

Key Count by Type

Detailed Prefix Statistics

Redis에서 키 설계시 보통 콜론(:) 으로…

성능 향상 시행착오

1. 일반적인 방법으로 키의 정보 수집

2. 파이프라인 방식 도입

3. 루아 스크립트 방입

고민 포인트