Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

번개멍

Redis란 무엇인가? 본문

코딩이야기

Redis란 무엇인가?

번개멍 2023. 10. 18. 12:21

Redis 특징

모든 데이터를 메모리에 저장하고 조회하기에 빠른 속도를 보장한다.

싱글 쓰레드를 사용하기 때문에 원자성을 유지할수 있기 때문에 트랜잭션에 자유롭다.

여기서 원자성이란 어떤 것이 더 이상 쪼개질 수 없는 성질을 말한다.

리스트형 데이터 입력과 삭제의 속도가 mysql 에 비해 10배 빠르다.

실제 메모리에 종속되기에 예기치 않은 오류로 리부팅이 되면 데이터가 날라간다.

단점을 보호하기 위해 보관및 백업을 통해 영속성을 유지할수 있다.

DBMS 를 사용할때는 데이터가 캐시가 아닌 디스크에 저장되기 때문에 데이터를 가져올때 마다

disk I/O 가 발생하게 된다.

입출력시 디스크를 경유하게 되면 메모리를 통한 입출력 보다 만배 이상 느리다고 한다.

그러는 반면 Redis 는 메모리에서 한번에 데이터를 가져오기에 속도가 굉장히 빠르다.

Redis 사용법으로는 Look aside Cache, Write Back 주로 이와 같은 방식으로 사용 된다.

Look aside Cache

💡 일반적인 Cache를 사용한 개발 방식.

  1. Server 에서 Cache 에 데이터 가 존재하는지 확인
  2. Cache 에 데이터가 있으면 Cache 에서 가져온다.
  3. Cache 에 데이터가 없으면 DB에서 읽어온뒤 Cache 에 저장한다.

Write Back

💡 중요도가 적은 로그 적재 또는 무거운 작업(ex. 백업) 개발 방식.

  1. Server 에서 Cache 에 모든 데이터를 저장
  2. Cache 에 특정 시간동안의 데이터를 저장
  3. 모인 데이터를 한번에 DB 에 저장

데이터를 여러번 DB에 Insert 하는것보다 Batch 를 이용하여 한번에 처리하는것이 처리속도가 빠르다.

위와 같이 서버가 리부팅 되게 되면 데이터가 날라가기 때문에 추가 작업이 필요하다.

Redis 사용처

  • 인증 토큰 저장
  • Ranking 보드로 사용
  • 유저 API Limit
  • 잡 큐

데이터 구조

  • String
  • Hash
  • List
  • Set
  • Sorted Set
  • score 는 double 타입이기에 값이 정확하지 않다.

Collection 주의 사항

하나의 Collection에 만개 이하의 데이터를 유지하는게 좋다.

Expire는 Collection의 item 개별로 걸리지 않고 전체 Collection에 대해서만 걸림

Redis 운영

  • 메모리 관리의 중요성
    • Swap 이 있다면 Swap 를 사용하게 되어 해당 메모리 Page 접근시 마다 로딩이 길어진다.
    Swap 를 사용하게 되면 Disk I/O 가 발생하기 때문에 속도가 현저히 줄어든다.RSS 값을 모니터링이 필요하다.
  • Maxmemory 를 설정하더라도 실제 사용하는 메모리는 더 크다.
  • 물리적 메모리 이상을 사용하면 문제가 발생한다.
  • O(N) 관련 명령어는 주의긴 명령어를 쓰게 되면 망한다.!!
    • KEYS
    • FLUSHALL, FLUSHDB
    • Delete Collections
    • Get All Collections
    KEYS 를 대체하기 위해 scan 명령을 사용한다.Collection의 모든 item 을 조회 할때는 데이터의 일부만 가져오거나 (Sorted Set)
  • 큰 Collection을 작은 여러개의 Collection 으로 나누어 저장한다.
  • Keys 는 한번에 전체의 키를 가져오는 반면 Scan은 짧게 여러번 명령을 하기에 중간에 다른 명령어 처리가 가능하다.
  • 대표적인 O(N) 명령어
  • Single Threaded 이기에 단순한 get/set 의 경우 초당 10만 TPS이상 가능
  • Replication
  • 권장 설정 Tip
    • Maxclient 설정 50000
    • RDB/AOF 설정 OFF
    • 특정 commands disable - Keys
    전체 장애의 90% 이상이 Keys, SAVE 로 발생한다. 실사용할때는 마스터의 경우는 RDB 및 AOF Disable 하고 slave 의 경우에 둘중 하나를 활성화 한다.
  • redis.conf

Sharding

Range

서버의 상황에 따라 리소스 차이가 매우 크다.

Modular

Indexed

해당 Key가 어느곳에 저장되어야하는지 관리서버가 별도로 존재

Index 서버가 죽게 되면 전체 서비스가 되지 않는다.

Redis Cluster

장점

  • 자체적인 Primary, Secondary Failover
  • Slot 단위의 데이터 관리

단점

  • 메모리 사용량이 더 많다
  • Migration 자체는 관리자가 시점을 결정
  • 라이브러리 구현이 필요하다 의존성이 있다.

Proxy K8S 클러스터링

Redis 클러스터 구성

  • Automatic cluster management tool 없으므로 수동으로 배포 진행
  • Clustering 시 ip만 지원 (hostname, dns 지원 안함)
  • Cluster 최소 단위는 3개 노드. 즉, HA 구성을 위해서는 최소 6개 node 필요 (권장사항은 최소 7개. master 사망 시 slave -> master, 여유 1개 노드 -> slave)

1. Redis 배포

  • redis-configmap.yaml
  • redis-statefulset.yaml
  • redis-service.yaml

2. Redis 클러스터링

  • 다음 명령어를 사용하여 현재 배포된 Redis Pod 들의 내부 ClusterIP를 조회
\\$(kubectl get pods -n lfcp-prod -l app=redis -o jsonpath='{range.items[*]}{.status.podIP}:6379 ')

  • 클러스터링 설정
kubectl exec -it redis-0 -n lfcp-prod -- redis-cli --cluster create --cluster-replicas 1 {ip-0}:6379 {ip-1}:6379 {ip-2}:6379 {ip-3}:6379 {ip-4}:6379 {ip-5}:6379

{ip-0} ~ {ip-5} 는 앞서 조회한 Redis Pods ClusterIP

  • 클러스터링 확인
kubectl exec -it redis-0 -n lfcp-prod -- redis-cli -a lmmcpredisadmin cluster nodes

Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
95e2a06ec18692ad98ecf6af253e3e44dfdfdaac 10.180.16.34:6379@16379 master - 0 1619598117361 2 connected 5461-10922
b3b345adb6416bbbdad0b6112608ebe72decaf09 10.180.16.35:6379@16379 master - 0 1619598118363 3 connected 10923-16383
0e216371d55dde742190d657f8709497f7d9adbd 10.180.16.38:6379@16379 slave 95e2a06ec18692ad98ecf6af253e3e44dfdfdaac 0 1619598119365 2 connected
ecf10f22b8d78f99aff06e7eae4246688d786659 10.180.16.33:6379@16379 myself,master - 0 1619598116000 1 connected 0-5460
2788ce247a90b700f31b39c1a7ebfda5bc4800e0 10.180.16.36:6379@16379 slave b3b345adb6416bbbdad0b6112608ebe72decaf09 0 1619598117000 3 connected
562f5763ca1b3ee07ca203a130bc1601cd098576 10.180.16.37:6379@16379 slave ecf10f22b8d78f99aff06e7eae4246688d786659 0 1619598117000 1 connected

3. Redis-proxy 배포

  • redis-proxy-configmap.yaml
  ClusterServerPool {
        Password lmmcpredisadmin
        MasterReadPriority 60
        StaticSlaveReadPriority 50
        DynamicSlaveReadPriority 50
        RefreshInterval 1
        ServerTimeout 1
        ServerFailureLimit 10
        ServerRetryTimeout 1
        KeepAlive 120
        Servers {
            + 10.180.16.33:6379
            + 10.180.16.34:6379
            + 10.180.16.35:6379
            + 10.180.16.36:6379
            + 10.180.16.37:6379
            + 10.180.16.38:6379
        }
    }

CusterServerPool > Servers 에 Redis Pods ClusterIP 수정 후 배포

  • redis-proxy-statefulset.yaml
  • redis-proxy-service.yaml

배포 완료 후 Redis Proxy 통해 접속

Reference : 강대명님의 우아한 테크 강의

Comments