상황 레디스 압축파일을 해제한 후 make 명령어를 수행하면 아래처럼 jemalloc No such file or directory 오류가 발생합니다. 1 2 3 4 5 6 7 8 9 10 11 [root@redis-5.0.7]# make cd src && make all make[1]: Entering directory `/opt/redis-5.0.7/src' CC Makefile.dep make[1]: Leaving directory `/opt/redis-5.0.7/src' make[1]: Entering directory `/opt/redis-5.0.7/src' CC adlist.o In file included from adlist.c:34:0: zmalloc.h:50:10: fatal error..
Database/Redis
레디스 AOF 시 오류 발생 레디스 aof 시 아래와 같은 오류가 발생했습니다. 이 에러는 AOF 쓰기작업을 하는데 디스크에 쓰는 속도가 느려 레디스가 느려질 수 있다는 의미입니다. Asynchronous AOF fsync is taking too long (disk is busy?). Writing the AOF buffer without waiting for fsync to complete, this may slow down Redis. AOF 와 관련된 레디스 옵션 (일부) appendonly aof 쓰기를 활성화 하는 여부입니다. appendfsync always : 명령어가 수행될 때마다 aof 파일로 디스크 쓰기를 진행합니다. everysec : 1초에 한번씩 aof 파일로 디스크 쓰기를 진행..
개요 레디스는 메모리DB 입니다. 메모리DB 이기 때문에 레디스에서 사용하는 메모리 할당량을 확실히 알아야 합니다. 메모리가 부족하게 되면 OOM 에 의해 프로세스가 죽을 수 있기 때문입니다. 그래서 메모리 사용량에 대해 조사하던 도중 SAVE 동작 시 자식프로세스가 생성되어 rdb 파일을 백업하는 데 이 때 메모리를 2배로 사용한다. 라는 글이 있어서 이에 대한 테스트를 진행해 보려고 합니다. 메모리를 2배로 사용한다는 의미는 아래와 같습니다. 레디스 프로세스 (부모) 가 메모리상의 데이터를 가지고 있고, SAVE 시 자식 프로세스가 생성되어 메모리상의 데이터를 전체 복사 후 rdb 파일로 내려쓴다. 참고로 이 포스팅에서의 SAVE 동작은 사용자가 직접하는게 아니라 레디스 엔진에서 save 옵션값으로 ..
개요 서비스에서 380만 정도 Key에 21GB 정도의 메모리가 할당되어 운영되고 있습니다. 메모리 DB 라는 관점에서, 21GB 라는 메모리는 큰 편이라고 볼 순 없지만 AWS EC2 환경에서 r5.2xlarge 타입으로 운영되고 있고 Scale Up 을 하는순간 추가 비용이 발생하는 문제와 디스크처럼 여유롭게 공간을 확보하기 힘들기 때문에 개선이 필요할 것으로 보았습니다. 개선방법 포스팅에서 다루지 않을 개선 방법 가장 편한 방법은 필요없는 데이터를 삭제하는 것과 위에서 말한것처럼 Scale Up 을 하는 것 입니다. ( 사실 라이브 상황에서 이건 쉬운 방법이 아닙니다.. ㅠㅠ ) Scale Up 을 하는동안의 DownTime 을 감당해야 하고 (이중화로 구성되어 있기 때문에 서비스 다운은 아니지만요..
개요 Redis 와 Sentinel 로 구성된 레디스가 있습니다. Jedis 를 사용하는 어플리케이션에서 Sentinel 에서 마스터 IP 를 조회하여 Redis 에 접속하고 있습니다. sentinel failover 를 수행한 후 어플리케이션에서 새로운 마스터를 인지하지 못하는 상황이 발생했습니다. 모든 Sentinel 에서는 새로운 마스터 IP 로 변경되어 있는 상태였습니다. 원인에 대한 범위 좁히기 왜 어플리케이션에서 새로운 마스터를 찾지 못했을까 Jedis 라이브러리를 사용하는 어플리케이션에서 Pub/Sub 기능을 이용하여 Sentinel 의 메시지를 받고 이 Sentinel 메시지 중 +switch-master 의 메시지를 받으면 Failover 가 수행되도록 쓰레드로 구현이 되어 있습니다. 그..
개요 Redis 에서는 Sentinel 기능이라는 마스터/슬레이브를 모니터링 하는 기능을 제공합니다. Sentinel 은 일명 모니터를 하는 기능으로 마스터/슬레이브를 정해주며 마스터 노드가 Failover 되었을 때 슬레이브 노드를 마스터로 구동 후, 마스터로 접속할 수 있도록 해주는 기능입니다. Jedis 라이브러리에서는 이렇게 Failover 되었을 때 센티넬로부터 새로운 마스터 정보를 얻어와서 변경된 마스터로 접속할 수 있도록 제공하고 있습니다. 테스트 환경 테스트를 하기 위한 환경은 아래와 같고 모든 테스트는 리눅스 환경에서 이루어졌습니다. Jedis 를 사용한 자바 코드도 리눅스 환경에서 동작합니다. OS Ubuntu 18.04 Redis Master 127.0.0.1 6161 Redis Sl..
개요 Java 에서 Jedis 혹은 Lettuce 를 사용하여 Redis 에 접속할 수 있습니다. 이 중 Jedis 를 다뤄볼 예정이고 Jedis 는 Redis 기능을 사용할 수 있는 여러 기능들을 모아놓은 라이브러리라고 보시면 됩니다. 테스트 환경 Jedis 기능을 테스트하기 위해서 Ubuntu 환경에서 진행했습니다. Windows 환경에서 Jedis 기능을 사용하려는 분들에게는 이 포스팅이 적절하지 않을 수 있습니다. OS Ubuntu 18.04 Java openjdk 1.8.0_275 Redis 2.8.21 Jedis 2.9.0 사전에 진행된 부분 1. Ubuntu 에 Java (jdk)가 설치되어 있어야 합니다. 2. Ubuntu 에 Redis 가 설치되어 있어야 합니다. Java 와 Jedis ..
상황 아래와 같은 구조에서 레디스 Failover 테스트 중에 failover-abort-no-good-slave 오류가 발생했습니다. 원인 레디스 접속을 위해서는 암호를 입력하도록 설정된 상태입니다. 그러나 센티넬에서는 레디스 인증관련 암호설정이 없었습니다. 레디스 conf 파일 requirepass "P@ssword" masterauth "P@ssword" 센티넬 conf 파일 # sentinel auth-pass TEST P@ssword 시나리오 - 해결방법 센티넬 conf 파일에 auth-pass 설정이 안됨 센티넬에서 레디스 TEST 인스턴스의 암호가 없기 때문에 접속하여 replication 정보를 얻어올 수 없었고, failover-abort-no-good-slave 로그가 기록되었습니다. ..
상황 2.8.4 버전에서 2.8.24 버전으로 업그레이드 후 발생하였습니다. 구조는 다음과 같습니다. 테스트 환경에서 재연에 필요한 인스턴스만 구성하였습니다. 업그레이드 작업 방법 단계 작업내용 1 Sentinel 인스턴스 다운 2 Redis Slave 인스턴스 다운 3 Redis Master 인스턴스 다운 4 redis / sentinel 바이너리 2.8.24 버전으로 교체 5 Redis Master 인스턴스 구동 6 Redis Slave 인스턴스 구동 7 Sentinel 인스턴스 구동 8 Sentinel 페일오버 테스트 진행 (오류 발생) 원인 Redis conf 파일에는 rename-command 의 옵션이 있었습니다. 이 옵션이 있는 경우, failover 시 아래와 같은 오류가 발생하는 것으로 ..
%cpu레디스는 인스턴스별로 하나의 CPU 를 사용하고, 할당된 CPU 사용량을 나타냅니다. aof_rewrite_in_progress현재 AOF 파일을 저장중이면 1, 아니면 0 입니다. aof_rewrite_scheduledAOF 파일을 저장하는 스케줄이 설정되어 있으면 1, 아니면 0 입니다. blocked_clientsBLPOP, BRPOP, BRPOPLPUSH, WAIT 명령으로 대기중인 클라이언트 수를 나타냅니다. client_biggest_input_buf현재 연결된 클라이언트 중 가장 큰 입력 버퍼 값을 나타냅니다. client_longest_outpu_list현재 연결된 클라이언트 중 가장 긴 출력 값을 나타냅니다. commands_processed초당 처리되는 명령어 수를 나타냅니다. ..