데이터실무

DA, SQL, DB보안 등 실무자를 위한 위한 DB기술 바이블!

레디스 운영관리

데이터 저장
인메모리 데이터 저장
레디스 운영관리
작성자
admin
작성일
2021-02-15 13:53
조회
2402

컴퓨팅 자원 임계점 파악

CPU

레디스는 싱글 스레드로 동작한다. 다시 말하면, 단일 레디스 서버 인스턴스는 하나의 CPU 코어를 온전히 독점해 사용하게 된다. 따라서 CPU Core 개수보다 적은 레디스 서버 인스턴스를 기동하는 것이 바람직하다. 즉, CPU 4코어 서버 하드웨어에서는 1~3개의 레디스 서버 인스턴스를 기동하고, CPU 8코어 서버 하드웨어에서는 1~7개의 레디스 서버 인스턴스를 기동하는 것이 바람직하다.
만약 모든 CPU 자원(Core)들을 레디스 서버 인스턴스들이 사용하게 된다면, 운영체제 운용에 필요한 CPU 자원이 부족해 시스템이 정상 동작할 수 없어 전체적인 시스템 성능저하 현상이 나타날 수 있기 때문이다. 이때 해당 서버 내 레디스 인스턴스들의 성능 또한 함께 저하될 것이다.


메모리

레디스는 메모리에 데이터를 저장해 활용하기 때문에 메모리 크기에 대한 설정은 성능에 직접적인 영향을 미친다. 레디스 메모리 용량 설정 시 다음을 고려해야 한다.


  • 레디스는 데이터와 함께 Key를 저장하기 때문에 이를 메모리 용량 산정 시 고려해야 한다.
  • 스냅샷 또는 AOF로 데이터 영속성(Persistency)를 활용하는 경우 Swap Space는 최소 물리 메모리와 동일한 크기로 설정한다. 참고로 Swap Space를 사용하게 되는 시점부터 시스템 성능은 급격하게 저하된다. 따라서 레디스튜닝 시 메모리와 Swap Space 간 페이지 인/아웃 발생 여부를 지속적으로 모니터링해야 한다.
  • 레디스 환경설정 파일에 maxmemory를 지정하면 지정된 메모리 크기보다 더 많은 데이터를 저장하려 해서 쓰기 명령이 실패하더라도 여전히 읽기 명령은 실행되므로, 응답 시간이 중요한 서비스는 반드시 maxmemory를 명시적으로 지정한다.
CPU와 메모리간 병목지점

CPU와 메모리 간 데이터 이동은 시스템의 데이터 버스를 경유하게 된다. 이때 데이터 전송 성능은 메모리 대역폭을 넘어설 수 없다. 각 시스템 별 메모리 대역폭이 상이하므로, 시스템 제조사가 제공하는 테크니컬 데이터 시트 등을 활용해 사전에 파악해두어야 한다.

[그림 Ⅱ-3-10] CPU와 메모리간병목지점

[그림 Ⅱ-3-10] CPU와 메모리간병목지점


레디스와 외부시스템간 병목지점

레디스 인스턴스와 레디스 인스턴스 그리고 레디스 인스턴스와 외부 시스템 간의 데이터 전송은 네트워크를 경유하게 된다. 네트워크 대역폭 설계 시 데이터 크기와 함께 Key를 반드시 포함해 필요 대역폭을 산정해야 한다. 특히 레디스 인스턴스들 간의 네트워크 병목현상 발생 여부를 면밀히 고려해야 한다. 마스터 노드와 슬레이브 노드 간 연결이 끊어진 후, 재 접속 시 슬레이브 노드는 자신의 데이터를 모두 삭제하고 마스터 노드의 전체 데이터를 재동기화하게 된다. 이를 위한 데이터 전송 트래픽이 네트워크 대역폭을 모두 잠식해 전체 서비스 성능이 급격히 저하되기 때문이다. 네트워크 병목 현상을 극복하기 위해 다음을 고려할 수 있다.


  1. ① 네트워크 대역폭의 충분한 확보


    1. - 레디스 인스턴스들 간의 네트워크는 가능한 최대 대역폭을 확보
    2. - 여러 포트에서 대역폭을 공유하는 일반 허브가 아닌, 포트별 대역폭을 지원하는 스위칭 허브를 사용
    3. - 스위칭 허브 간 물리 포트들을 논리 포트로 묶어 대역폭을 합산 제공하는 네트워크 가상화 기술로 안정적 대역폭 확보(동일 기종 하이엔드 스위칭 허브들 간 기본 제공)
    4. - 서버 하드웨어 내 물리 NIC들을 논리적으로 묶어 대역폭을 합산 제공하는 Channel Bonding을 활용해 안정적 대역폭 확보(Channel Bonding Software 필요)
  2. ② 네트워크 이중화


    1. - 레디스가 탑재된 각 서버 하드웨어의 NIC (Network Interface Card)을 이중화하며, 각 NIC의 서브넷을 분리해 설정(단일 스위치 허브 내 VLAN 또는 스위칭 허브 이중화)
    2. - 클라이언트의 읽기/쓰기 명령 수행 서브넷과 레디스 인스턴스들 간 데이터 전송(복제와 샤딩용) 서브넷을 분리
  3. ③ QoS(Quality Of Service)


    1. - 네트워크 장비를 활용해 멀티미디어 등 타 네트워크 트래픽이 레디스 데이터 전송 대역폭을 잠식하지 못하도록 통제

이상 언급한 CPU, 메모리, 네트워크 자원의 적절한 용량을 산정하기 위해 레디스 인스턴스에 가상의 읽기/쓰기 요청을 발생시키는 ‘redis-benchmark’를 활용할 수 있다. Redis-benchmark 명령 실행 중 레디스 인스턴스의 컴퓨팅 자원 사용 현황을 모니터링하기 위해 다음의 도구들을 활용할 수 있다.


  • “top”: OS 기본제공
  • “htop”: OS 기본제공
  • “Nagios Redis Plugin”:http://exchange.nagios.org/directory/Plugins/Databases/check_redis_stats-2Epl-(Advanced-Nagios-Plugins-Collection)/details - “Percona Cacti Plugin”: http://www.percona.com/doc/percona-monitoring-plugins/1.0/cacti/redis-templates.html
  • “redis-stat”:https://github.com/juneguun/redis-stat

레디스 관리 도구

레디스 명령어들의 종류를 구분하면 아래와 같다. 위에 언급된 서버 관리 명령어 외 타 유형의 명령어들은 http://redis.io/commands에서 참조할 수 있다.


  • Key 관리 명령어
  • String 데이터 관리 명령어
  • Hash 데이터 관리 명령어
  • List 데이터 관리 명령어
  • Set 데이터 관리 명령어
  • Sorted Set 데이터 관리 명령어
  • HyperLogLog 관리 명령어
  • Pub/Sub 관리 명령어
  • Transaction 관리 명령어
  • Scripting 관리 명령어
  • Connection 관리 명령어
레디스 서버 관리 명령어
명령 설명
BGREWRITEAOF AOF 파일에 비동기 방식으로 재기록
BGSAVE 디스크에 비동기 방식으로 데이터 세트 저장
CLIENT KILL [ip:port] [ID client-id] [TYPE master:slave] 클라이언트 연결 단절
CLIENT LIST 클라이언트 연결 목록 출력
CLIENT GETNAME 현 연결 이름 리턴
CLIENT PAUSE timeout(millseconds) 지정 시간 동안 클라이언트 요청 처리 중단
CLIENT SETNAME connection-name 현 연결에 이름 부여
CLUSTER SLOTS 클러스터 현황 출력
COMMAND 모든 레디스 명령어들을 출력
COMMAND COUNT 현행 모든 레디스 명령어 개수를 리턴
COMMAND GETKEYS 전체 레디스 명령어들의 Key를 출력
COMMAND INFO command-name [command-name] 특정 레디스 명령어에 대한 상세 설명
CONFIG REWRITE 현 레디스 설정 내역을 설정 파일에 기록
CONFIG SET parameter value 현 레디스 설정을 변경
CONFIG RESETSTAT 내부 통계 지표들을 초기화
DBSIZE 현 데이터베이스 내 Key 개수를 리턴
DEBUG OBJECT key 해당 Key에 대한 디버깅 정보 출력
DEBUG SEGFAULT 강제 서버 Crash
FLUSHALL 모든 데이터베이스 내 모든 Key들을 삭제
FLUSHDB 현행 데이터베이스 내 모든 Key들을 삭제
INFO
서버 정보 및 누적 통계 값 출력
LASTSAVE 마지막 디스크 저장 성공 UNIX Time Stamp 출력
MONITOR 서버가 수령하는 모든 명령어를 실시간으로 출력
ROLE 현 레디스 인스턴스의 복제(Replication) 역할 출력
SAVE 데이터 세트를 동기방식으로 디스크에 저장
SHUTDOWN [NOSAVE] [SAVE] 데이터 세트를 동기방식으로 디스크에 저장한 뒤 서버 종료
SLAVEOF host port 특정 인스턴스의 슬레이브임을 지정
SLOWLOG subcommand [argument] 특정 명령어의 Slow Log 기록 여부를 지정
SYNC 복제를 위한 내부 명령어
TIME 현재 서버 시간을 출력
레디스클라이언트 현황
지원 언어 클라이언트 이름 특징
C Hiredis 레디스 공식 C 클라이언트. 전체 명령어 집합 수행, pipelining, event driven programming을 지원
C# ServiceStack.Redis
C# StackExchange.Redis
C++ redis3m
C++ C++ Client
Java Jedis
Java Redisson 레디스 서버 기반의 확장성 높은 분산 자바(Java) 데이터 구조들을 지원
Lua redis-lua
Node.js node_redis
Perl Redis
PHP Predis
PHP phpredis C로 작성됨
Python redis-py
Ruby redis-rb
다양한 레디스 고급 도구

다음은 레디스 API 활용해 작성되지는 않았으나 레디스 활용을 위해 작성된 ORM(Object Relation Mapping) 도구, 메시징 라이브러리 등의 다양한 상위 수준 도구들이다.


작성 언어 도구명 설명
C Mod_redis 레디스와 http로 통신하는 Apache HTTPD 모듈
C Omhiredis rsyslog를 위한 레디스 출력 플러그인
C Webdis JSON 형식 출력을 지원하는 레디스 HTTP 인터페이스
C++ Redis Desktop Manager 다양한 OS를 지원하는 GUI 기반 레디스 관리 도구
Java Redis Qi4j EntityStore 레디스 기반 Qi4j 엔터티 저장소
Java Spring Data Redis 스프링 프레임워크와 레디스 통합 기능
Javascript Rdb-parser 레디스 RDB database 덤프에 대한 node.js 비동기식 스트리밍 파서
Javascript Recurrent node.js를 위한 레디스 기반 반복 작업 관리자
Javascript Redback 상위 수준 레디스 활용 도구(관계망 그래프 생성, 텍스트 검색, 가중치 설정 등)
Javascript Redis-sync node.js의 레디스 복제 슬레이브 관리 도구
Lua Lua-ohm Lua Redis의 Object-hash-mapping 기능
PHP HighcoTimelineBundle Symfony 2.* 기반의 Timeline 관리 기능
PHP phpRedisAdmin 웹 기반 레디스 DB 관리 도구
PHP PHPRedMin 멀티 서버 관리를 지원하는 웹 기반 레디스 DB 관리 도구
PHP PHP-Resque Resque와 PHP 연동
Python Celery 파이썬 작업 관리자
Python Kombu 레디스 기반 파이썬 AMQP 프레임워크
Python Nydus 레디스와 파이썬을 위한 연결 클러스터링, 경로 관리
Python Redisco 파이썬 기반 Object-hash-mapping
Python Redis-rdb-tools Redis dump.rdb 파일 파싱 → 메모리 분석 → JSON 형식 결과 출력
Python Retools helper library의 caching/locking
Python Rq 레디스를 위한 파이썬 작업 큐 경량 구현
Python Sider 레디스 기반의 파이썬 오브젝트 라이브러리(persistent)
Python Stdnet 레디스 데이터 관리자(질의 및 검색 API)
Ruby Amico 레디스 기반 관계관리 기능
Ruby Fnordmetric Redis/ruby 기반실시간 이벤트 추적 기능
Ruby leaderboard 레디스 기반 Leaderboards
Ruby Meerkat 서버 랙 이벤트 관리 미들웨어
Ruby Ohm 레디스를 위한 Object-hash mapping library
Ruby Ost 레디스기반 작업 큐
Ruby Recommendify Ruby/Redis 기반 추천엔진(협업적 필터링)
Ruby Redis_failover ZooKeeper 기반 자동마스터/슬레이브 페일오버 기능
Ruby Redis-dump 레디스 데이터 백업 및 복구 도구(JSON 형태)
Ruby Redis-objects 레디스 데이터 타입과 Ruby 오브젝트 매핑 도구
Ruby Redis-rdb Ruby로 Redis .rdb 파일들을 관리하기 위한 도구 셋
Ruby Redis-sampler 데이터 구성 파악을 위한 샘플 레디스 DB
Ruby Redis-store Ruby 웹 프레임워크를 위한 레디스 데이터 캐쉬 스토어
Ruby Redmon 레디스 cli, admin 관리 및 실시간 모니터링을 위한 웹 기반 도구
Ruby Resque 백그라운드 작업 생성 및 다수 큐 할당을 지원하는 레디스 기반 Ruby 라이브러리
Ruby Rollout 레디스 기반 조건적 Roll Out 기능
Ruby Sidekiq Rails 3 애플리케이션을 위한 경량 메시지 처리 도구
Ruby Soulmate 레디스 기반 고속 자동 채우기 기능(autocompleting. )
Tcl redis-tcl 확장 pub/sub 기능을 제공하는 Redis Tcl 라이브러리
Memcached와 레디스비교
구분 Memcached 레디스
(multi)get O O
(multi)get O O
Increment/decrement O O
delete O O
Expiration O O
Prepend/append O
Range Queries O
Data Types Strings, Objects Strings, Hashes, Lists, Sets, Sorted Sets
Data Size 1 MB 512 MB
Data Persistency O
Multi-Threaded O
Replication O
Atomic Operation (Transaction) O
Use Cases
  • Profile Caching
  • HTML/Page Caching
  • Cookie/Profile Tracking
  • Session Caching
  • DB Query Caching
  • latest item listing in home page
  • Deleting & Filtering
  • Order by Score/Vote/Time
  • Item Expiration
  • Counting
  • Unique Items in given time
  • Real Time Event Tracking
  • Publication/Subscribing
  • Queue Sharing
  • Caching(same with Memcached)
Performance 100,000QPS 이상 100,000QPS 이상
Performance Stability (성능 안정성) 높은 성능 안정성 Memcached 대비 일부 불안정 가능
Memory Allocator Slab jemalloc
Memory Allocation Mechanism 메모리 단편화 현상 없음(균일한 크기의 데이터 객체 사용) 데이터 삭제 요청 시 물리적으로는 메모리를 해제하지 않고 유지한 뒤, 이후 기 삭제된 데이터에 대한 질의 요청 발생 시 해당 메모리 객체 해제로 반복적 메모리 할당/해제 작업 최소화
  • 메모리 단편화 발생
  • 요청할 때마다 매번 malloc()과 free()에 의한 메모리 할당 발생
Reliability 장애 거의 없음 특성을 잘 못 이해할 경우, 프로세스 장애 발생 가능

Memcached는 고속의 데이터 프로세싱을 위해 휘발성 메모리에 최신의 작업 처리 결과를 임시 저장해 활용하는 솔루션이고, 이는 메모리 내 데이터 유실 시 언제라도 다시 재 생성할 수 있어 데이터 유실이 우려가 되지 않는 운영 조건을 전제로 한다. 그런데 데이터 유실을 감내할 수 없는 조건에서는 비 휘발성 저장소(디스크)에 데이터를 저장할 필요가 발생하는데, 이것이 바로 레디스다. 즉Memcached는 데이터 가용성(Availability)이 서비스 품질에 영향을 미치지 않는 운영 조건에서 활용해야 하며, Redis는 데이터 가용성을 확보해야 하는 서비스 운영 조건을 만족시킨다.