Computer >> 컴퓨터 >  >> 프로그래밍 >> Redis

Redis RDB 파일 오프라인 분석 도구 rdb-tools 완벽 가이드

배경

Redis를 운영하다 보면 메모리 사용량이 과도하게 증가하거나 네트워크 대역폭이 포화되는 등 다양한 문제에 직면하게 됩니다. 이런 문제를 해결하려면 Redis의 메모리 사용 현황을 정밀하게 분석해야 합니다.

Redis 메모리 분석 방식은 크게 두 가지로 나뉩니다.

  • 온라인 분석: 실행 중인 Redis 서버에 직접 접속하여 메모리를 분석합니다. 구현이 간단하지만 분석 작업이 Redis 서버에 부하를 주기 때문에 서비스 안정성에 영향을 줄 수 있습니다.
  • 오프라인 분석: RDB 백업 파일을 기반으로 분석합니다. 운영 중인 Redis 서버에 전혀 영향을 주지 않으므로, 사용 중인 메모리가 2GB를 초과하는 경우 이 방식을 권장합니다.

그렇다면 Redis 메모리를 어떻게 오프라인으로 분석할 수 있을까요? 오픈소스 생태계에는 redis-rdb-tools(Python 기반)와 rdr(Golang 기반)이라는 잘 알려진 도구 두 가지가 있습니다.

하지만 개발자가 Python이나 Go에 익숙하지 않다면, 이 도구들을 기반으로 자신만의 기능을 확장하기가 쉽지 않습니다. 이 글에서는 C#으로 구현된 또 다른 오프라인 분석 도구인 rdb-tools를 소개합니다. C# 개발자에게는 훨씬 친숙하고 확장하기 쉬운 선택지가 될 것입니다.

rdb-tools란?

rdb-tools는 C#으로 구현된 Redis RDB 파일 파싱 및 분석 도구입니다. 다음 두 가지 구성 요소로 이루어져 있습니다.

  • 파서 라이브러리(Parser Library): 필요에 맞게 자유롭게 커스터마이징할 수 있는 라이브러리입니다.
  • 분석 CLI 도구(CLI Tool): 명령줄에서 기본적인 분석을 수행할 수 있는 도구입니다.

파서 라이브러리는 net6.0 기반으로 제작되어 확장이 매우 용이합니다. CLI 도구 역시 net6.0 기반으로, Microsoft의 command-line-api를 사용해 빌드되었으며 런타임 의존성 없이 단일 바이너리 파일로 패키징할 수 있습니다.

CLI 도구 설치 및 사용법

rdb-cli는 두 가지 방법으로 설치할 수 있습니다.

  1. .NET 6.0 SDK가 설치되어 있지 않은 경우: OS 버전에 맞는 최신 안정 릴리스(stable release)에서 도구를 다운로드합니다.
  2. .NET 6.0 SDK가 이미 설치되어 있는 경우: 아래 명령어로 간단히 설치할 수 있습니다.
dotnet tool install --global rdb-cli

여기서는 첫 번째 방법을 기준으로 살펴보겠습니다.

다운로드 후 압축을 해제하면 rdb-cli라는 실행 파일을 얻을 수 있습니다.

다음 명령어를 입력하면 도움말 정보를 확인할 수 있습니다.

./rdb-cli -h

도움말을 보면 두 가지 명령어를 사용할 수 있으며, 그중 핵심은 memory 명령입니다.

memory 명령의 도움말을 보면 분석 대상 RDB 파일 경로와 함께 다양한 옵션을 지정해야 함을 알 수 있습니다. 가장 간단하고 일반적인 사용 예시는 다음과 같습니다.

./rdb-cli memory /tmp/test/demo.rdb -ot html

이 명령은 RDB 파일을 분석하고 그 결과를 HTML 형식으로 출력합니다.

실제 실행 결과를 보면, 약 2.1GB 크기의 RDB 파일을 불과 32초 만에 분석했습니다. 상당히 빠른 속도입니다. 상세한 HTML 보고서는 /tmp/test/res.html 경로에 생성됩니다.

HTML 리포트 구성

생성된 HTML 결과물은 크게 세 부분으로 구성됩니다.

1. 기본 정보

RDB 버전, Redis 버전, 총 메모리 사용량, 전체 키 개수 등의 요약 정보를 제공합니다.

2. 히스토그램

데이터 타입별 메모리 및 키 수 분포, 만료 시간(TTL)별 메모리 및 키 수 분포 등을 시각적으로 보여줍니다.

3. 상세 테이블

상위 키 프리픽스 목록, 상위 빅키(Big Key) 목록, 상위 스트림(Stream) 목록, 함수 목록(Redis 7.0 이상) 등을 포함합니다.

또한 전체 데이터를 분석할 필요가 없고 특정 조건으로 필터링하고 싶다면, 다양한 파라미터 옵션을 활용할 수 있습니다.

예시 1: DB 9와 DB 10만 분석하고 싶은 경우

./rdb-cli memory /tmp/test/demo.rdb -ot html --db 9 --db 10

예시 2: string과 hash 타입만 분석하고 싶은 경우

./rdb-cli memory /tmp/test/demo.rdb -ot html --type string --type hash

참고를 위해 2~8GB 규모의 RDB 파일에 대한 분석 성능 데이터도 함께 확인할 수 있습니다.

파서 라이브러리 활용법

앞서 소개한 CLI 도구만으로는 요구 사항을 충족하기 어려울 때가 있습니다. 이럴 때는 파싱 클래스 라이브러리를 기반으로 원하는 기능을 직접 커스터마이징할 수 있습니다.

먼저 NuGet에서 RDBParse 패키지를 설치합니다.

dotnet add package RDBParse

다음으로 IReaderCallback 인터페이스를 구현하는 클래스를 작성합니다.

public class MyReaderCallBack : IReaderCallback
{
}

그런 다음 BinaryReaderRDBParser 클래스의 인스턴스를 생성하고, 해당 인스턴스의 Parse 메서드를 호출하면 됩니다.

var path = "/yourpath/your.rdb";
var cb = new MyReaderCallBack();
var parser = new RDBParser.BinaryReaderRDBParser(cb);
parser.Parse(path);

콜백 클래스 내부에 원하는 로직을 구현함으로써, 키 순회 시점에 메모리 통계 집계, 특정 키 필터링, 커스텀 리포트 생성 등 자유롭게 확장할 수 있습니다.

마무리

이번 글에서는 C# 기반의 RDB 분석 도구인 rdb-tools를 소개하고, CLI 도구의 기본 사용법부터 파서 라이브러리를 활용한 커스터마이징 방법까지 살펴보았습니다. 운영 환경에 부담을 주지 않으면서 Redis 메모리를 깊이 있게 분석해야 하는 상황이라면 좋은 대안이 될 것입니다.

이 글이 여러분의 Redis 운영에 도움이 되기를 바랍니다!

참고 자료

  • rdb-tools GitHub 페이지
  • Redis 소스 코드의 rdb.c
  • rdr GitHub 페이지
  • redis-rdb-tools GitHub 페이지