2. Redis-Server
1. Redis 설치
1) redis-server
설치
- 서버에서
redis-server
를 설치한다.
- 설치 후 버전을 확인한다.
2) 서버 메모리 확인
- 서버의 메모리를 확인한다.
2. Redis 메모리
1) redis.conf
redis.conf
에서 Redis의 메모리를 설정할 수 있다.- 여기서 중요한 키워드는
maxmemory
와maxmemory-policy
이다.
2) maxmemory
maxmemory
는 Redis가 사용할 수 있는 최대 메모리를 정의한다.- 서버 사양과 목적에 맞게 정의한다.
3) maxmemory-policy
maxmemory-policy
는 최대 메모리 사용량 초과 시 데이터를 어떻게 처리할 것인지 정의한다.maxmemory
초과로 인해서 데이터가 지워지게 되는 것을 Eviction이라고 한다.default
는noeviction
이고, 그 외의 처리 방식은 다음과 같이 다양하다.
1] noeviction
- 기존 데이터를 삭제하지 않는다.
- 메모리가 꽉 찬 경우에는 OOM(Out Of Memory) 오류를 반환하고 새로운 데이터는 버리게 된다.
2] allkeys-lru
- LRU(Least Recently Used)라는 페이지 교체 알고리즘을 통해 데이터를 삭제하여 공간을 확보한다.
3] volatile-lru
- expire set을 가진 것 중 LRU로 삭제하여 메모리 공간을 확보한다.
4] allkeys-random
- 랜덤으로 데이터를 삭제하여 공간을 확보한다.
5] volatile-random
- expire set을 가진 것 중 랜덤으로 데이터를 삭제하여 공간을 확보한다.
6] allkeys-lfu
- LFU(Least Frequently Used) 방식으로, 가장 적게 액세스한 키를 제거하여 공간을 확보한다.
7] volatile-lfu
- expire set을 가진 것 중 가장 적게 액세스한 키부터 제거하여 공간을 확보한다.
4) Redis는 COW(Copy On Write) 방식
maxmemory
가 설정된 대로 작동하면 좋겠지만, 그렇지 않은 경우가 있다.- Redis는 쓰기 요청이 발생하면 COW 방식을 통해 작동한다.
- 쓰기 요청이 오면 OS는
fork()
를 통해서 자식 프로세스를 생성하는데,fork()
시에는 다른 가상 메모리 주소를 할당받지만 물리 메모리 블록을 공유한다. - 쓰기 작업을 시작하는 순간에는 수정할 메모리 페이지를 복사한 후에 쓰기 작업을 진행한다.
- 즉, 기존에 쓰던 메모리보다 추가적인 메모리가 필요하다.
- 하지만 전체 페이지 중에서 얼마나 작업이 진행될지 모르기 때문에
fork()
시에는 기본적으로 복사할 사이즈만큼의 free memory가 필요하다. - Redis를 직접 설치할 때
/proc/sys/vm/overcommit_memory
값을1
로 설정하지 않아 장애가 날 때가 있다.
- 확인한 것과 같이
overcommit_memory
값이0
이면 OS는 주어진 메모리량보다 크게 할당할 수가 없다. - 즉,
fork()
시에 OS가 충분한 메모리가 없다고 판단하기 때문에 에러를 발생시킨다. overcommit_memory
값을1
로 설정해서 OS에게 메모리를 더 초과해서 할당할 수 있도록 한 후에maxmemory
에 도달한 경우maxmemory-policy
에 따라 처리되도록 설정하는 것이 좋다.
5) Docker 환경에서 overcommit_memory
변경
- Docker 환경에서
sudo vim /proc/sys/vm/overcommit_memory
를 실행한 후 값을 수정하면 에러가 발생한다. - 왜냐하면 일반적으로
sudo docker run
으로 컨테이너 생성 시 호스트의 자원에 접근할 수 없기 때문이다. - 그래서 다음과 같이
--privileged
옵션을 추가해서 컨테이너를 생성한다.
- GPU를 사용하는 경우
--gpus all
을 추가한다. - 이렇게 생성된 컨테이너를 실행시켜 접속한 후 똑같은 방법으로
overcommit_memory
를 변경하면 또 에러가 발생한다. - 그래서 다음과 같이
sysctl
명령어를 통해 해결한다.
- 명령어를 실행하면 다음과 같이 확인된다.
3. redis.conf
- 먼저
redis.conf
를 확인한다.
1) 로그 파일 위치 확인
- 로그 파일은
/var/log/redis/redis-server.log
에 있다.
2) 포트 바인딩
- 포트 바인딩 내용은 다음과 같이 확인된다.
- 기본적으로
127.0.0.1:6379
로 설정되어 있다.
3) Memory Management
- 메모리 관련 내용은 다음과 같이 확인된다.
maxmemory
maxmemory-policy
maxmemory-samples
및replica-ignore-mamemory
4) 메모리 변경
redis.conf
에 다음과 같이 추가하여 메모리와 관련된 내용을 변경한다.
5) Redis 재시작 및 상태 확인
- 다음과 같이 Redis를 재시작한다.
- 다음과 같이 상태를 확인한다.
Could not create server TCP listening socket 127.0.0.1:6379: bind: Address already in use
와 같은 메시지가 로그에 찍힌다면 다음과 같이 해결한다.
- 다시 재시작한다.
- 상태를 확인한다.
redis-server.service - Advanced key-value store
Loaded: loaded (/usr/lib/systemd/system/redis-server.service, disabled)
Active: active (running)
4. Redis 실행
1) redis-cli
실행
- 다음과 같이
redis-cli
를 실행하면redis-server
로 접속해서 직접 데이터를 관리할 수 있다.
2) Redis 설정 정보
- 설정 정보를 확인할 수 있다.
3) 데이터 저장하기
- 데이터 한 개 저장하기
- 데이터 여러 개 저장하기
4) 데이터 가져오기
- 데이터 한 개 가져오기
- 데이터 여러 개 가져오기
5) 데이터 삭제하기
- 특정 키와 값을 지울 때 사용한다.
6) 카운터 생성
- Redis에 해당 키에 대한 값을 저장한다.
- 특정 키의 값을 가져온다.
- 값에 1을 더한다.
- 확인한다.
7) 저장된 키 확인
- 모든 키를 확인한다.
- 특정 문자를 가진 키를 확인한다.