일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 백준 2146 다리 만들기
- postgresql 파티셔닝
- 백준 11054.가장 긴 바이토닉 부분 수열
- 가장 긴 팰린드롬 파이썬
- PostgreSQL
- 다리 만들기 파이썬
- postgresql 파티션 테이블
- SQL SERVER MIGRATION
- aggressive vacuum
- 게임 개발 파이썬
- 백준 1167 트리의 지름 파이썬
- 백준 1613 역사
- 다중 컬럼 NOT IN
- postgresql autovacuum
- autovacuum
- 역사 파이썬
- 램프 파이썬
- 가장 긴 바이토닉 부분 수열 파이썬
- 반도체 설계 파이썬
- 백준 1238 파티 파이썬
- lazy vacuum
- SWEA
- 백준 1043 거짓말 파이썬
- eager vacuum
- PostgreSQL Vacuum
- 백준 1516 게임 개발
- 백준 1034 램프 파이썬
- SQL SERVER 장비교체
- 백준 2352 반도체 설계 파이썬
- 트리의 지름 파이썬
- Today
- Total
공부, 기록
Redis 기본 공부 본문
Redis Cluster - 주요 개념 및 특징
Redis Cluster : 데이터를 자동으로 여러 Redis 노드에 나누어 저장하며 HA를 지원하는 기술.
과반수의 Master 노드가 죽는 경우 클러스터가 중단 됨.
클러스터는 HA, Sharding을 지원하는 Redis의 운영 방식 중 하나이다
- dataset을 Hashslot으로 여러 노드들에 데이터가 매핑될 수 있도록 한다.
- 각 마스터는 데이터 서버 + 센티널의 역할을 같이 수행한다고 볼 수 있다.
- Scale-Out 방식
- 동작 방식
- 자체적인 바이너리 프로토콜을 통해 node-to-node로 통신을 한다.
- 각 노드들은 클러스터에 속한 다른 노드들의 정보를 모두 갖고 있는다.
- 최소 마스터 개수는 3대 이상(MEET 명령어로 3개 이하로도 강제 구성 가능).
Redis 설치
설치 전
yum groupinstall "Development Tools"
adduser redis -p redis1!
chown -R redis:redis database
설치
1. wget https://download.redis.io/releases/redis-7.0.0.tar.gz
2. tar xzf ./redis-7.0.0.tar.gz
3. make install
Redis Cluster - config 설정
redis.conf 파일에서 수정하는 값
- cluster-enabled yes : yes로 하면 cluster mode로 시작한다. no로 하면 standalone mode로 시작한다.
- cluster-config-file /path/nodes.conf : 이 파일은 클러스터의 상태를 기록하는 바이너리 파일이다. 클러스터의 상태가 변경될때 마다 상태를 기록한다.
- cluster-node-timeout 3000 : 레디스 노드가 다운되었는지 판단하는 시간이다. node의 과반수가 down 상태로 체크할 경우 slave를 master로 승격하는 failover 처리를 시작. 단위는 millisecond이다.
- cluster-slave-validity-factor : master와 slave node 간의 체크가 오랫동안 단절된 상태면 해당 slave는 승격 대상에서 제외. 이때 승격 대상에서 제외하는 판단 기준의 시간을 설정.
계산식 : (cluster-node-timeout * cluster-slave-validity-factor) + repl-ping-slave-period- repl-ping-slave-period : 복제 서버에서 마스터 서버로 ping을 날려 down 여부를 인식하는 시간
- cluster-migration-barrier : master에 연결되어 있어야 하는 최소 slave의 수 (기본값=1)
- cluster-require-full-coverage : cluster의 일부 node가 다운되어도 운영할 방법을 설정
- yes : slave가 없는 master가 다운되면 cluster 전체가 중지
- no : slave가 없는 mster가 다운되더라도 cluster는 유지. 다운된 master의 슬롯에서만 에러가 발생.
- 일부 데이터가 유실돼도 괜찮으면 no, 데이터의 정합성이 중요하다면 yes를 선택.
- no로 설정하더라도 절반 이상의 node가 down 되면 cluster는 중지된다.
- port open : 방화벽을 사용하고 있다면 기본 포트에 10000을 더한 클러스터 버스 포트도 열려있어야 한다.
예를 들어 기본 포트로 7000번을 사용한다면 17000번 포트도 같이 열어야 한다. - appendonly : 데이터를 append only file에 쓸지 여부를 정합니다.(기본값=no)
redis의 장애 발생 시 ram에 기록된 데이터가 증발하는데 이때 복구가 가능하도록 데이터 crud마다 디스크에 쓰기 작업을 합니다.다운되었던 마스터 노드의 재시작시에 용이 (파일에 가장 최근까지 데이터가 존재)- appendfilename : AOF 처리할 파일의 이름을 지정.
- appendfsync : 디스크에 데이터를 기록할 시점을 지정.
- always : 명령어 실행 시마다 기록.
- everysec : 데이터를 모아 1초마다 디스크에 기록.
- no : os에 쓰기 시점 처리를 위임.
- requirepass : redis 서버에 password 설정
- masterauth : master 노드에 패스워드 설정이 되어있는 경우, slave가 replication synchronization 작업을 하기 전에 slave에게 비밀번호를 알려줘야 한다. slave가 비밀번호를 모를 경우 master가 slave의 요청을 거절한다.
위에 requirepass에서 적은 비밀번호를 입력
Redis Cluster - 명령어 http://redisgate.kr/redis/cluster/redis-cli-cluster.php#create
- create 클러스터를 생성한다. replicas를 지정해서 슬레이브 개수를 지정할 수 있다.
- redis-cli --cluster create ip1:port1 ... ipn:portn [--cluster-replicas <arg>]
- cluster-replicas <n> : 마스터 당 슬레이브 노드를 몇 개 만들지를 정한다. 생략하거나 0으로 설정하면 슬레이브 노드를 만들지 않고 마스터로만 클러스터를 구성한다.
- DB에 데이터가 있으면 클러스터를 생성하지 못하고 종료한다. 그러므로 클러스터를 생성할 노드는 AOF 나 RDB로 부터 데이터를 읽어들이면 안됨.
- reshard 슬롯을 노드에 할당 또는 재할당한다. Source 노드와 destination 노드를 지정한다. Reshard 명령은 destination 노드로 데이터를 migrate 명령으로 옮긴다.
- redis-cli -cluster reshard ip:port (접속해서 작업할 노드)
- add-node 클러스터에 노드를 추가한다. 마스터 또는 슬레이브로 추가할 수 있다.
- redis-cli -cluster add-node 신규ip:port 기존ip:port [--cluster-slave [--cluster-master-id id]]
- cluster-slave : slave 추가
- cluster-master-id : cluster-slave를 사용하여 slave를 추가한 경우 master 를 지정한다.
- del-node 클러스터에서 노드를 제거한다.
- redis-cli --cluster del-node ip:port node-id
- 명령어 수행 후 해당 인스턴스를 shutdown 진행하므로 이미 다운된 노드에 대해서는 실행이 불가.
- shutdown 된 노드를 제거하기 위해서는 cli에서 'CLUSTER FORGET node-id' 명령어로 제거
- info 클러스터 정보를 조회한다.
- redis-cli --cluster info
- master, key, slot, slave 정보가 출력된다
- import Standalone 노드에서 데이터을 읽어서 클러스터에 저장한다.
- redis-cli --cluster IMPORT (target)ip:port --cluster-from (source)ip:port [--cluster-copy] [--cluster-replace]
- --cluster-copy : 소스에 데이터를 남겨둘지 정하는 옵션 (미지정시 삭제)
- --cluster-replace : target에 동일한 key가 있을 경우 upsert 하는 옵션
- 타겟은 클러스터 노드 중 하나를 지정하면 슬롯에 맞게 분산되어서 입력된다.
- rebalance 슬롯을 균형있게 재 분배한다.
- redis-cli --cluster REBALANCE ip:port options
- options
- --cluster-weight <node1=w1...nodeN=wN> : 가중치 적용 숫자가 높을 수록 많은 슬롯 배정
- --cluster-use-empty-masters : 클러스터에 새 노드를 추가한 경우
- --cluster-timeout <arg> ??
- --cluster-simulate ??
- --cluster-pipeline <arg> ??
- --cluster-threshold <arg>??
- check 클러스터를 체크한다.
- redis-cli --cluster CHECK ip:port
- call 클러스터 노드에 명령을 실행한다.
- redis-cli --cluster CALL ip:port command ex) redis-cli --cluster call ip:port info
- 클러스터 내 모든 노드에 접속하여 command를 날림
- set-timeout 클러스터 노드에 cluster-node-timeout을 설정한다.
- redis-cli --cluster set-timeout ip:port time(ms)
- help 도움말을 보여준다
Redis Server - 명령어 http://redisgate.kr/redis/server/redis-cli.php
- USER
- 6.0버전 이후 ACL 적용으로 user 와 pw 입력 가능.
- redis-cli -p 6000 --user user1 --pass password → 커맨드라인 입력으로 인하여 유출 가능성 있음.
- src/redis-cli --user user1 --askpass
Please input password: ********
- PIPE Pipe는 다른 서버의 AOF 파일을 로드할 때 사용하거나 레디스 명령이 있는 txt 파일로 부터 데이터를 받을 때 사용.
- cat appendonly.aof | redis-cli --pipe
- RDB RDB 파일을 다른 파일 이름으로 저장.
내부적으로 Sync 방식으로 진행되므로 이슈 발생 가능. echo $?로 결과를 확인 가능(true = 0).- redis-cli --rdb dump.rdb
- STAT 레디스 서버의 중요 통계정보를 주기적으로 출력.
- src/redis-cli --stat
- keys, memory, clients, blocked, requests, conenctions 정보
- 옵션으로 -i (주기 초단위) 가 있음. 그 외는 Ent 버전에서 사용 가능.
- BIGKEYS 데이터 타입별로 큰 키를 찾아 출력.
- src/redis-cli --bigkeys
- SCAN 키를 scan 해서 출력.
- src/redis-cli --scan --pattern 'keyB*' | wc
- SLAVE Redis-cli의 역할을 마치 복제서버처럼 변경하여 마스터로 부터 어떤 명령들이 오는지 확인 가능.
- src/redis-cli --slave
- 디버깅 용도로 사용 됨.
- CSV 명령 실행 결과를 CSV(Comma Separated Values) 형태로 출력.
- src/redis-cli --csv smembers myset
- raw 한글을 사용할 수 있게 됨
- ex_)$src/redis-cli--raw
127.0.0.1:6379> set key "야호"
- ex_)$src/redis-cli--raw
- LATENCY redis ping을 반복 수행하여 latency 측정
- redis-cli --latency
- LATENCY-HISTORY latency를 15초 단위로 출력 -i time 옵션으로 시간 설정 가능(ms단위)
- HELP 도움말을 보여준다.
Redis Cluster - 백업/복원
RDB를 이용한 방식과 AOF를 이용한 방식 2가지로 나뉨.
1. RDB
RDB persistence는 point-in-time snapshot을 사용자가 지정한 inverval 마다 찍어서 디스크에 .rdb file로 내린다.
- 장점
- 특정 시점의 데이터를 file로 저장하고 저장된 파일을 안전한 backup 저장소로 옮길수 있기 때문에 backup 용도로 좋음.
- AOF에 비해 상대적으로 빠른 복구가 가능
- 단점
- snapshot을 찍는 interval 사이에 들어온 데이터는 보존할 수 없음.
- RDB는 disk 에 파일을 내릴때 fork()를 수행하는데 이 때 dataset 의 크기가 크면 Redis가 some millisecond 동안 응답을 못 줄 확률이 있음.
2. AOF
AOF는 모든 write operation에 대한 로그를 파일로 남긴다.
그래서 redis가 startup 될때 그 로그에 남아있는 command를 다시 play함으로써 원본 dataset을 복원하는 방식.
- 장점
- 모든 write operation이 로깅 되므로 놓치는 data가 없이 완벽하게 복원 가능
- AOF 로그는 append only log이므로 파일이 corrupt될 확률이 거의 없고 만약 disk full 등의 이유로 파일이 깨지더라도 redis-check-aof tool로 쉽게 고칠 수 있음.
- AOF 로그가 너무 커지면 Reis가 알아서 로그를 rewrite 할수 있다.
- 단점
- 파일 크기가 일반적으로 RDB 파일보다 큼.
- fsync policy에 따라 다르긴 하지만 일반적으로 RDB에 비해 느림
Redis Cluster - 노드 관리
클러스터에 노드 추가
REDIS-CLI 에서 CLUSTER MEET IP PORT 입력
슬롯 관련
- 슬롯 추가
ADD SLOT
REDIS-CLI 에서 CLUSTER ADDSLOTS 슬롯 번호
대량을 입력할 때는 redis-cli cluster addslots {start_slot_number...end_slot_number} 를 사용하는게 편리하다
※ 7.0.0 버전 이후 : CLUSTER ADDSLOTSRANGE START_SLOT_NUMBER END_SLOT_NUMBER - 슬롯 제거
REDIS-CLI 에서 CLUSTER DELSLOTS 슬롯 번호
대량을 제거 때는 redis-cli cluster delslots {start_slot_number...end_slot_number} 를 사용하는게 편리하다
※ 7.0.0 버전 이후 : CLUSTER DELSLOTSRANGE START_SLOT_NUMBER END_SLOT_NUMBER - 노드 확인
- CLUSTER NODES
node-id, ip:port, flags, master 등의 정보 출력
Redis Cluster - 샤딩
- 샤딩 : 데이터를 분할하여 관리하는 기술
(수평적 파티셔닝 방식과 유사하며 차이점은 파티셔닝의 경우 단일 DBMS에서의 데이터 분할이지만 샤딩은 서로 다른 서버의 DBMS에서 데이터를 분할하여 관리하는 방법) - REBALNACE : 마스터 노드가 추가되는 경우처럼 데이터의 재 분배가 필요할 때 사용한다.
Redis Cluster - 성능 테스트 및 모니터링
redis-benchmark 툴을 사용하여 확인 가능. 기본적으로는 주요 명령어(PINK, SET, GET, LPUSH, RPUSH, LPOP, RPOP, SADD, HSET, STOP, LRANGE, MSET)을 10만회씩 실행해서 성능을 측정.
- -h: Redis 서버를 지정합니다. Default는 127.0.0.1
- -p: Redis Port를 지정합니다. Default는 6379
- -a: Redis 인증을 위한 패스워드를 지정합니다.
- -c: parallel connections 수를 지정합니다. Default는 50
- --threads: thread 수를 지정 할 수 있습니다. Default는 No
- -n: 요청 수를 지정합니다. Default는 100000
- -d: GET/SET Value 사이즈를 지정합니다. Default는 3
- -t: benchmark를 실행할 명령어를 지정합니다. Ex) SET, GET
--csv 결과를 csv로 출력
Slowquery : https://redis.io/commands/slowlog-get/
일정 시간을 넘긴 쿼리를 기록
실제로 명령을 실행하는데 필요한 시간만 기록함(클라이언트 연결시간, 응답 전송 등의 I/O 시간은 제외)
설정
slowlog-log-slower-than : 베이스 시간 설정
slowlog-max-len : 최대 항목 수 설정 (기본 10개 항목) -1 : 모든 항목 반환
로그 확인 가능 내용
- 모든 느린 로그 항목에 대한 고유한 점진적 식별자
- 기록된 명령이 처리된 Unix 타임스탬프
- 실행에 필요한 시간(마이크로초
- 명령의 인수를 구성하는 배열
- 클라이언트 IP 주소 및 포트
- 명령을 통해 설정된 경우 클라이언트 이름
'공부 > DATABASE' 카테고리의 다른 글
[SQL Server] 쿼리 개선 - UNION ALL -> OR 조건으로 수정 (0) | 2024.01.30 |
---|---|
[MySQL] pt-osc를 통한 일반 테이블 파티셔닝으로 전환 (0) | 2024.01.30 |
Redis Cluster Test (0) | 2024.01.28 |
[SQL Server] 쿼리 개선 - WHERE 구문 UDF 사용 (0) | 2024.01.24 |
[SQL Server] 운영 개선건 - 특정 시점 슬로우 쿼리 증가 현상 (0) | 2024.01.24 |