Redis에 대해서 알아보자.
메모리상에 key value store (KVS) 를 구축할수 있게 해주는 소프트웨어이다.
KVS는 저장하고 싶은 데이터(값 : value) 에 대해, 대응하는 키를 설정해, 이것을 pair 로 보존하는 데이터베이스의 한 종류며, Redis 는 컴퓨터의 메인 메모리상에 KVS를 구축하여, 외부 프로그램으로부터 데이터의 보존및 읽기가 가능케 한다.
ANSI C로 만들어져있으며, 모든 데이터셋을 메모리내에 읽어들이기에, 엄청난 수준의 속도로 동작한다.
엔트리급 리눅스 서버로 110,000 SET / 초, 81,000 GET / 초 의 속도를 내게 할수있다.
또한 Redis는 커멘드의 파이프라이닝 을 지원하기에 복수의 값을 하나의 커멘드로 취득하게 설정이 가능하기에, 클라이언트 라이브러리와의 통신속도 향상도 가능하다.
데이터 구조
- 문자열
- 바이너리 데이터
- 리스트
- 집합(set)
- 해쉬
이런 데이터에 대해 요소의 pop/ push, add/remove, 또는 서버사이드에 set 사이에서 합, 곱, 차이등 형에 의해 여러가지 조작을 지원하고 있다. Redis는 set형과 list형 에 대해 다른종류의 정렬기능을 지원하고 있다.
Redis 의 특징과 용도
Redis는, 메모리상에 동작하는 KVS 형태의 휘발성 데이터베이스이다.
휘발성이라고 하면 Redis자신이 정지하거나, Redis가 동작하는 하드디스크의 전원이 꺼지면 데이터가 날라갈꺼라고 생각하겠지만, Redis는 데이터를 디스크에 저장하여, 영속화 시키는 기능을 갖고 있기에 그런 걱정을 없앨수 있다.
특징으로서는 메모리상에 데이터를 저장하기에 아주 빠른속도로 데이터의 저장및 불러오기가 가능하다.
캐쉬용 데이터베이스로도 훌륭하지만 독립된 데이터스토어로도 사용가능한 설계로 되어있어 100 가지를 넘는 커멘드를 지원하고 있다.
데이터 영속화
Redis에는, 데이터를 영속화(디스크에 쓰기)를 실행하기위한 방법으로서, Snapshot 과 Append Only File 이라는 2가지 방법을 쓰게 된다.
Snapshot
스냅샷으로 설정할경우, Redis는 정기적으로 데이터베이스의 내용을 디스크에 쓰게 된다.
Redis를 재기동하면 이 파일부터 데이터를 불러와 복원시킨다. 일정횟수의 갱신, 일정간격으로 디스크에 파일을 쓰게한다.
파일이 쓰기 타이밍은 설정파일, config 커멘드로 변경이 가능하다.
출력은 비동기로 이뤄지며, 프로세스가 크래쉬될경우 전회의 스냅샷이후의 데이터가 손실될 가능성이 있기에, 다소의 데이터손실은 용납할 필요가 있다.
수동으로 스냅샷을 보존하는 경우는, SAVE 커멘드 또는 BGSAVE 커멘드로 실행할수 있다.
쓰이게되는 파일의 형식은 바이너리다.
설정항목 | 내용 | 서식 |
---|---|---|
save | 데이터베이스를 디스크에 저장하는 타이밍을 설정할수 있다. 초단위 , 지정된 회수, 저장명령을 받으면 데이터베이스에 저장된다. | save seconds changes |
rdbcompression | .rdb형식의 데이터베이스에 덤프할때, 압축할지 안할지 설정할수있다. 기본으로는 ‘yes’가 되어있으며, 평상시에는 압축하도록 되어있다. 혹시 저장시 CPU 파워를 절약할경우에는 ‘no’를 설정하자. | rdbcompression yes |
dbfilename | DB를 덤프할때 파일명을 지정한다. | dbfilename dump.rdb |
dir | 작업디렉토리를 설정한다. DB는 이 디렉토리내에, dbfilename설정 디렉티브에 설정된 이름으로 쓰이게 된다. 추가기입전용파일모드도 이 디렉토리내에 작성된다. | dir ./ |
추가기록 전용 파일(Append Only File)
Append Only File은 쓰기 조작을 모두 로그파일에 기록한다.
스냅샷에서의 데이터베이스 손실의 가능성을 허용하지 않을때 이것을 사용한다.
스냅샷과 겸용하여 쓸수 있기에, Redis 도큐먼트에서는 Append Only File 만 써서 운용하는것을 추천하지 않는다. 스냅샷과 겸용하는 경우, 재기동시에는 Append Only File의 방식이 사용된다. 파일출력 타이밍은 설정에 변경가능하므로, 기본은 1초당으로 설정되어있다.
출력되는 파일의 형식은 텍스트로, 파일사이즈는 점점더 방대해지기에 정기적으로 재구성할 필요가 있다.
버전은 2.2까지는 수동으로 BGREWRITEAOF 커멘드로 실행하여, 재구성할 필요가 있었지만, 2.4 버전부터는 자동으로 재구성을 실행할수 있게 되었다.
설정항목 | 내용 | 서식 |
---|---|---|
appendonly | 혹여나 데이터가 아주중요하며, 데이터를 손실하고 싶자 않을경우, 이것을 유효화 시켜야 한다. 이 모드가 설정되면, Redis는 appendonly.aof에 쓰기조작을 받을때마다 모두 기록해놓는다. 이 파일은 기동시에 모든 데이터셋을 메모리내에 구축해나아갈때 불러들인다. | appendonly yes |
appendfilename | 추가기입전용파일의 이름을 설정한다. 기본은 appendonly.aof 이다. | appendfilename appendonly.aof |
appendfsync | OS 시스템에 대해, 출력버퍼에 데이터가 쌓여있는것을 기다리지 않고, 데이터를 디스크에 쓰도록 지시할수 있게한다. OS에 의해 실제로 데이터를 디스크에 쓴다던가, 되도록 빨리 쓰도록 하게한다. Redis는 다음 3가지모드를 지원하고 있다.
no: fsync 하지 않는다. 데이터를 쓰게하는것은 OS에 전담시키기에 고속으로 동작한다. aways: 추가기입전용 로그에 저장될때마다 fsync를 실행한다. 속도는 느리지만 안전하게 동작된다. everysec: 마지막의 fsync로부터 1초경과하면 fsync를 실행한다. (위 두개의 중간에 위치) |
appendfsync everysec |
no-appendfsync-on-rewrite | Append Only File 의 fsync 정책이 alway 냐 everysec에 설정되어있으며, 백그라운드의 저장용 프로세스(백그라운드의 저장 혹은 Append Only File의 로그의 백그라운드 저장)가 디스크에 대해 대량의 I/O를 발생하고 있다면, 리눅스의 설정에 의해 fsync() 가 호출될때에 Redis가 장시간 블록할 가능성이 있다.
현재는 수정방법이 없기에, 다른 스레드의 fsync의 호출은, 동기적인 쓰기호출까지 블록해버리고민다. 이 옵션을 쓰면, BGSAVE나 BGREWRITEAOF이 실행중에는 메인스레드에서는 fsync()호출은 실행하지 않도록 되며, 이문제를 회피할수 있게된다. 이것은 즉, 다른 자식스레드가 저장하는동안, appendfsync none이 설정되어있는것과 같은동작을 하는것처럼 되려고 한다는것이다. 이용자 시점에서 볼때, 크래쉬 나는 경우, 최악의 시나리오를 예측하면, 최대 30초의 로그를 잃을 가능성이 있다는것이다. 혹시 지연시간의 문제를 갖고있다면, yes를 설정한다. 그렇지 않을경우 안전성의 관점에서 no 를 설정한다. |
no-appendfsync-on-rewrite no |
리플리케이션에 의한 부하분산
Redis에는, 다른 컴퓨터에 복제를 하는 기능이 있어,
갱신이 가능한 1대를 “마스터” 로,
그 복제된 읽기 전용의 복수의 컴퓨터를 “슬레이브” 로 구성하여 대규모화를 계획할수있다. 이런 부하분산 방법을 리플리케이션이라고 한다.
참고
http://promamo.com/?p=3358
사나
•4년 이전
정리가 잘 되어있네요 잘보고갑니다
blog-admin
•4년 이전
감사합니다.
꾀 오래된 예전자료인데 참고가 되셨으면 좋겟습니다.