RSS구독하기:SUBSCRIBE TO RSS FEED
즐겨찾기추가:ADD FAVORITE
글쓰기:POST
관리자:ADMINISTRATOR
Dev/Redis  2012. 7. 7. 16:11

들어가며

Redis > Document > Redis Administration 을 번역한 것이다. http://redis.io/topics/admin
오역 및 잘못된 내용이 있을 수 있습니다. 참고 용도로만 사용해 주세요.

작성 기준일: 2012-07-07, redis.io-topics-admin.pdf

이 페이지는 Redis instance의 관리와 연관된 주제들을 포함한다. 새로운 주제들은 FAQ의 형태로 다루어 진다. 새로운 주제들은 계속 추가될 것이다.

Redis 설정 힌트들

리눅스 운영체제를 사용해라

Redis는 Linux 운영 체제에 배포하는 것을 추천한다.  물론 Redis는 osx에서는 충분히, FreeBSD, OpenBSD에서는 가끔 테스트를 한다. 하지만 Linux는 중요한 stress(부하) 테스트를 하는 곳이고, 다른 많은 제품들이 동작하고 있는 곳이다.

overcommit memory settting to 1 을 설정해라

반드시 Linux 커널을 'overcommit memory setting to 1'로 설정해라. /etc/sysctl.conf 에 vm.overcommit_memory = 1 을 추가하고 재부팅해라. 또는 바로 효과를 얻기 위해서 sysctl vm.overcommit_memory = 1 명령어를 사용해라.

Redis가 background saving을 할 때, 자식 프로세스가 부모 프로세스와 메모리를 공유 할 수 있도록 설정 하는 것이다. 보다 자세한 내용은 http://redis.io/topics/faq 의 Background saving is failing with a fork() error under Linux even if I've a lot of free RAM! 확인하자.

약간의 swap 영역을 설정해라

반드시 시스템에 약간의 swap 영역을 설정해라. (가능한한 메모리로 swap되는 것을 추천한다.) 만약 리눅스가 swap 메모리 공간을 가지지 않고, Redis instance가 갑자기 너무 많은 메모리를 사용해 버린다면, Redis가 out of memory로 crash가 발생하거나, 리눅스 커널 OOM(out of memory) killer가 Redis process를 죽일 것이다.

swap 영역은 부족한 메모리 공간으로 디스크를 사용하는 것이므로 성능에 좋지않다. 하지만 swap 공간이 전혀 없는 경우 out of memory로 Redis instance가 crash가 나거나 OOM killer에 의해서 Redis instance가 죽을 수 있다. 따라서 Redis가 crash 나는 것을 방지하고 최대한 Ram을 사용하도록 설정하는 것이 중요하다.
SWAP Memory : 
Linux Swap Space
Swap 메모리
OOM :
OOM : out of memory

일반적으로 사용하는 메모리의 2배까지 사용될 수 있다.

쓰기가 매우 많이 발생하는 응용프로그램에서 disk에 RDB 파일을 저장하거나 AOF 로그를 재작성하는 Redis를 사용하면, Redis는 일반적으로 사용하는 메모리의 2배까지 사용할 수 있다. 추가적으로 사용되는 메모리는 저장하는 프로세스가 기록하는 동안에 수정되는 메모리 페이지 수들에 비례하게 된다. 그래서 수정되는 메모리 페이지 수는 저장되는 시간동안 수정된 키 (또는 아이템들의 타입의 초계)의 수와 자주 비슷한다.

 Redis를 캐쉬 용도로만 사용하면 파일에 기록을 전혀 하지 않고, 저장이 중요하다면 Master-Slave 구조에 Slave만 파일 작성하도록 해야 성능상 문제가 적을 것 같다.

Replication을 사용하면 RDB 저장은 사용된다.

만약 persistence를 비활성 했어도, replication을 사용하면 RDB 저장을 수행하는 것이 필요할 것이다.

Replication 시 Slave가 Master에 SYNC 명령을 요청하면, Master 해당 시점의 Dataset을 RDB로 저장하고, 이후 요청받는 명령어 collection을 저장 후 Slave로 전송하기 때문에 Master의 persistence를 비활성화 했어도, Slave와 동기시에 RDB 저장이 필요하다.

EC2 EBS volumes에서 Redis Persistence 활성화은 좋지않다.

EC2 EBS volumes에서 Redis Persistence 활성화은 좋지않다. 왜냐하면 EBS 성능은 보통 안 좋기 때문이다. 영속성(persistence)을 유지하기 위해서 ephemeral storage를 사용해라. 그리고 가능할 때 EBS의 persistence 파일을 옮겨라.

Amazon EC2 EBS에서 disk 관련 성능이 매우 좋지 않아서 다른 방안을 설명해 주는 것 같다. 관련해서 아는게 없다.
Amazon EC2 EBS Instances and Ephemeral Storageec2-ebs-instances-and-ephemeral-storage/
Amazon EC2 – Ephemeral storage on EBS-backed instancesephemeral-storage-on-ebs-backed-instances/ 
EC2 Ephemeral Disks vs EBS Volumes in RAID

Xen hypervisor를 사용하면 fork() 시간이 느릴수 있다.

만약 Xen hypervisior를 사용하는 가상 머신(virtaul machine)에 배포한다면 fork() time이 느릴 수 있다. 이것은 dataset 크기에 따라서 수 밀리초(milliseconds)에서 수 초동안 Redis를 block 시킬 수 있다. 이 문제는 다른 hypervisor에서는 흔치 않다.

가상화 서버를 사용할 때 Xen hypervisor를 사용하면 BGSAVE같이 자식 프로세스를 생성하는 하는 경우 Redis가 느려질 수 있다는 이야기. 이 문제는 Amazon EC2가 Xen hypervisor를 이용해서 서버 가상화를 하다보니 문제가 되는 듯. 정확한 원인은 확실하지 않다.
http://redis.io/topics/problems - List of known Linux related bugs affecting Redis.

deamontool에서 실행할 때는 daemonize no를 사용해라

daemontool에서 실행할 때는 daemonize no를 사용해라.

여기서 daemontool이 무엇인지 모르겠다.

무정지로 Redis 업그레이드 및 재시작 하기

Redis는 당신의 서버에서 매우 오래동안 실행되는 프로세스가 되기위해서 디자인 되었다. 예를 들어, CONFIG SET 명령어를 이용해서 어떠한 재시작도 없이 많은 설정을 변경할 수 있습니다.

심지어 Redis 2.2 부터는 재시작 없이 AOF에서 RDB 스냅샨(snapshot) 영속성(persistence)으로 변경할 수 있습니다. 보다 많은 정보를 'CONFIG SET *' 명령어를 통해서 확인하세요.

하지만 가끔 재시작은 필요하다. 예를 들어서 새로운 버전의 Redis 프로세스로 업그레이드 하거나, CONFIG command 가 제공하지 않는 설정을 변경해야 할 때 필요합니다.

다음 단계들은 정지 시간을 피하기 위해서 사용되는 아주 흔한 방법입니다.

  1. 현재 Redis instance의 Slave로 새로운 Redis instacne를 셋팅한다. 이것을 하기 위해서는 다른 서버 또는 한 서버가 2개의 Redis Instance를 유지할 수 있는 충분한 RAM을 가지고 있어야 한다.
  2. 만약 서버가 하나라면, slave는 master와는 다른 port를 이용해서 시작되어야 한다. 그렇지 않으면 slave는 실행할 수 없을 것이다.
  3. Relication의 초기 동기화가 완료되기를 기다려라 (slave 로그 파일을 확인해라)
  4. INFO를 사용해서 Master와 Slave의 key수가 동일한 것을 확인해라. redis-cli를 이용해서 slave가 정상적으로 동작하는지 확인해라.
  5. 모든 Client들이 새로운 instance를 사용하도록 설정해라.(새로운 instance는 slave이다)
  6. Master가 더이상 어떤 query도 받지 않는 것이 확인 되었을 때(MONITOR command를 사용해서 확인 가능하다), SLAVEOF NO ONE 명령어를 사용해서 slave와 master간 연결을 제거한다. 그리고 matser를 종료시킨다.


'Dev > Redis' 카테고리의 다른 글

Redis Replication  (0) 2012.07.08
All About Redis  (0) 2012.07.07
Redis 서버 설정 정리  (1) 2012.07.04

Trackback
Reply
Moss:
Root (119)
Dev (14)
Life (29)
Programming (2)
Music (2)
Android (4)
Tip (2)
Java (11)
Creative (3)
Lyrics (2)
Windows 7 (2)
Etc (7)
C# (8)
Spring (1)
jQuery (2)
Web (4)
Travel (10)
Cook (0)
«   2024/04   »
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