번개멍
Redis란 무엇인가? 본문
Redis 특징
모든 데이터를 메모리에 저장하고 조회하기에 빠른 속도를 보장한다.
싱글 쓰레드를 사용하기 때문에 원자성을 유지할수 있기 때문에 트랜잭션에 자유롭다.
여기서 원자성이란 어떤 것이 더 이상 쪼개질 수 없는 성질을 말한다.
리스트형 데이터 입력과 삭제의 속도가 mysql 에 비해 10배 빠르다.
실제 메모리에 종속되기에 예기치 않은 오류로 리부팅이 되면 데이터가 날라간다.
단점을 보호하기 위해 보관및 백업을 통해 영속성을 유지할수 있다.
DBMS 를 사용할때는 데이터가 캐시가 아닌 디스크에 저장되기 때문에 데이터를 가져올때 마다
disk I/O 가 발생하게 된다.
입출력시 디스크를 경유하게 되면 메모리를 통한 입출력 보다 만배 이상 느리다고 한다.
그러는 반면 Redis 는 메모리에서 한번에 데이터를 가져오기에 속도가 굉장히 빠르다.
Redis 사용법으로는 Look aside Cache, Write Back 주로 이와 같은 방식으로 사용 된다.
Look aside Cache
💡 일반적인 Cache를 사용한 개발 방식.
- Server 에서 Cache 에 데이터 가 존재하는지 확인
- Cache 에 데이터가 있으면 Cache 에서 가져온다.
- Cache 에 데이터가 없으면 DB에서 읽어온뒤 Cache 에 저장한다.
Write Back
💡 중요도가 적은 로그 적재 또는 무거운 작업(ex. 백업) 개발 방식.
- Server 에서 Cache 에 모든 데이터를 저장
- Cache 에 특정 시간동안의 데이터를 저장
- 모인 데이터를 한번에 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 접근시 마다 로딩이 길어진다.
- Maxmemory 를 설정하더라도 실제 사용하는 메모리는 더 크다.
- 물리적 메모리 이상을 사용하면 문제가 발생한다.
- O(N) 관련 명령어는 주의긴 명령어를 쓰게 되면 망한다.!!
- KEYS
- FLUSHALL, FLUSHDB
- Delete Collections
- Get All Collections
- 큰 Collection을 작은 여러개의 Collection 으로 나누어 저장한다.
- Keys 는 한번에 전체의 키를 가져오는 반면 Scan은 짧게 여러번 명령을 하기에 중간에 다른 명령어 처리가 가능하다.
- 대표적인 O(N) 명령어
- Single Threaded 이기에 단순한 get/set 의 경우 초당 10만 TPS이상 가능
- Replication
- 권장 설정 Tip
- Maxclient 설정 50000
- RDB/AOF 설정 OFF
- 특정 commands disable - Keys
- 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 : 강대명님의 우아한 테크 강의