리눅스에 레디스를 설치하는 방법은 패키징 파일을 설치하는 것 또는 소스 코드를 다운로드해 직접 빌드하는 방법으로 총 2가지가 존재한다.
인터넷 연결이 가능한 서버의 경우 패키지를 이용하면 간편하게 설치가 가능하지만, 레디스 관련 파일들이 분산되어 저장되기에 관리가 어렵다.
하나의 서버에 여러개의 레디스 인스턴스를 띄우고자 할 때에는 소스 파일로 관리하는 것이 편할 수 있다.
사전에 생성해 놓은 EC2 리눅스 서버에 레디스를 설치보자.
-- 버전 지정
$ wget http://download.redis.io/releases/redis-7.0.8.tar.gz
-- 최신 버전 다운로드
$ wget https://download.redis.io/redis-stable.tar.gz
레디스를 빌드하기 위해서는 gcc 버전 4.6 이상이 필요하므로 gcc를 설치해준다.
-- sudo 사용자 전환
$ sudo su -
-- gcc 설치
$ yum install -y gcc
-- 압축 파일 해제 후 빌드
$ tar -zxvf redis-7.0.8.tar.gz
$ mv redis-7.0.8 redis
$ cd redis
$ make
위와 같이 make가 끝난 후 기본 디렉토리 내의 bin 디렉토리에 실행 파일을 복사하기 위해 다음 명령어를 입력해준다.
$ make PREFIX=/home/ec2-user/redis install
make install 명령어는 빌드된 Redis 실행 파일들을 특정 디렉토리에 복사하여, 실행 가능한 상태로 준비하는 과정이다.
PREFIX 옵션은 설치 경로를 지정하는 데 사용되며, 기본적으로 /usr/local 경로에 설치되지만, 관리의 편의성을 위해 /home/ec2-user/redis 경로에 설치하도록 하자.
설치 후 bin 경로에 아래와 같은 파일들이 생성된 것을 확인할 수 있다.
$ bin/redis-server redis.conf
위 명령어를 통해 레디스를 foreground 모드로 시작할 수 있다.
포그라운드(foreground) 모드에서는 Redis 서버가 터미널에 실행 로그를 출력하며, 해당 터미널을 종료하면 Redis 서버도 종료된다.
위와 같이 redis is starting부터 Ready to accept connections 로그가 실행 된다면 레디스가 정상적으로 실행된 것이다.
하지만, 로그에 몇가지 시스템 변수를 변경하라는 내용이 출력된 것을 확인할 수 있다.
레디스 설치 후 일부 서버 설정 파일과 레디스의 구성 파일을 변경하는 것이 좋다.
레디스의 기본 maxClients 설정 값은 10000이고, 해당 값은 레디스를 실행하는 서버의 파일 디스크립터 수에 영향을 받는다.
파일 디스크립터(file descriptor): 운영 체제에서 파일, 소켓 등을 식별하는 데 사용하는 고유한 식별자.
cf. Redis는 클라이언트와의 각 연결에 소켓을 사용하고, 이 소켓은 파일 디스크립터를 소비하기 때문에 서버의 파일 디스크립터 수에 영향을 받는다. maxclients 설정과 서버의 파일 디스크립터 제한이 서로 일치해야 안정적으로 많은 클라이언트를 처리할 수 있다. 따라서, Redis 서버를 운영할 때 파일 디스크립터 제한을 충분히 높게 설정하는 것이 중요하다.
그래서 원하는 레디스의 최대 클라이언트 수 + 32 이상으로 서버의 파일 디스크립터를 설정해야한다.
$ ulimit -a | grep open
현재 서버의 파일 디스크립터 수는 아래 명령어로 확인할 수 있다.
파일 디스크럽터 수를 늘리려면, /etc/security/limits.conf 파일을 수정한다.
* hard nofile 10032
* soft nofile 10032
위 구문을 추가해준다.
리눅스는 메모리를 페이지 단위(4KB)로 관리하며, 메모리 사용 시 TLB(Table Lookaside Buffer)의 오버헤드를 줄이기 위해 THP(Transparent Huge Page) 기능을 도입했다. THP 도입을 통해 4KB 대신 2MB 또는 1GB 크기의 큰 페이지를 자동으로 사용해 메모리 관리의 효율성을 높인 것이다.
하지만, Redis와 같은 데이터베이스 애플리케이션에서는 THP를 사용하면 성능 저하와 레이터시 증가가 발생할 수 있다. 큰 페이지를 관리하는 데 필요한 추가적인 메모리 오버헤드가 발생할 수 있고, 레이턴시가 올라갈 수 있기 때문에 레디스를 사용할 때는 THP를 비활성화 해주는 것이 좋다.
cf. TLB(Translation Lookaside Buffer)는 CPU가 가상 메모리를 물리 메모리로 변환하는 과정을 빠르게 수행하기 위해 사용하는 캐시 메모리다.
이 캐시는 페이지 테이블의 주소 변환 정보를 저장하고 있으며, 이를 통해 메모리 접근 속도를 크게 향상시킨다.
일시적 비활성화 방법
echo never > /sys/kernel/mm/transparent_hugepage/enabled
영구적 비활성화 방법
sudo vi /etc/rc.d/rc.local
# 해당 파일에 다음 구문을 추가해준다.
#!/bin/bash
if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
echo never > /sys/kernel/mm/transparent_hugepage/enabled
fi
# rc.local 파일에 실행 권한을 부여한다.
sudo chmod +x /etc/rc.d/rc.local
# 서비스 활성화
sudo systemctl enable rc-local
sudo systemctl start rc-local
# 동작 확인
cat /sys/kernel/mm/transparent_hugepage/enabled
출력 결과를 보면 현재 설정이 never로 되어 있으므로, Transparent Hugepage(THP)가 성공적으로 비활성화 된 것임을 확인할 수 있다.
cf. Redis는 데이터를 디스크에 저장할 때 fork()를 사용하여 백그라운드 프로세스를 생성한다. 이 과정에서 Copy-On-Write(COW) 메커니즘이 작동하며, 부모 프로세스와 자식 프로세스가 동일한 메모리 페이지를 공유한다.
그러나 Redis의 데이터가 변경될 경우, 메모리 페이지가 복사되면서 메모리 사용량이 급격히 증가할 수 있어서 vm.overcommit_memory를 1로 설정하여, 시스템이 메모리를 초과해서라도 할당할 수 있도록 하는 것이 좋다.
vm.overcommit_memory 설정은 시스템이 메모리를 할당할 때 어떤 방식으로 동작할지를 결정한다. 이는 주로 Redis와 같은 메모리 기반 데이터베이스를 사용할 때 성능 최적화 및 오류 방지를 위해 조정된다.
vm.overcommit_memory = 0 (기본값)
시스템이 메모리를 할당할 때 실제 물리적 메모리와 스왑(swap) 공간을 기준으로 과도한 메모리 할당을 제한한다.
스왑 공간: 물리적 메모리가 부족할 때 디스크의 일부를 메모리처럼 사용하는 공간이다.
안정적이지만 메모리가 부족할 경우 프로세스가 메모리를 할당받지 못해 실패할 수 있다.
vm.overcommit_memory = 1
시스템이 물리적 메모리의 한계를 무시하고 요청된 만큼 메모리를 할당한다.
Redis와 같은 애플리케이션이 메모리를 효율적으로 사용하도록 돕고, 백그라운드 데이터 저장 시 성능 저하를 방지할 수 있다.
vm.overcommit_memory = 2
cf. Redis 인스턴스는 클라이언트와 TCP 연결을 통해 통신하며, TCP 연결 하나당 소켓 하나가 소모된다.
클라이언트가 Redis 서버에 연결 요청을 보낼 때, 서버는 이 요청을 TCP Backlog Queue에 저장한다. TCP Backlog Queue의 기본 값은 511이고, 서버 설정이 최소 이 값보다 크도록 설정해야한다.
이때 TCP Backlog는 연결 대기 중인 요청들을 관리하며, Redis 설정(tcp-backlog) 및 시스템 설정(somaxconn, syn_backlog)에 따라 큐 크기가 제한된다. Backlog 큐가 가득 차면 새로운 연결 요청이 거부될 수 있으므로, tcp-backlog 설정이 중요하다.
- somaxconn: 서버가 listen() 호출 시 대기할 수 있는 TCP 연결 요청의 최대 큐 크기. 기본값은 128이며, Redis 등에서 tcp-backlog 값보다 커야 한다.
- syn_backlog: TCP 3-way handshake 중 SYN 패킷을 처리하기 위한 대기 큐 크기. 기본값은 128이며, 동시 연결 요청 처리를 위해 충분히 큰 값으로 설정해야 한다.
서버의 현재 설정 값은 아래 명령으로 확인할 수 있다.
sudo sysctl -a | grep syn_backlog
sudo sysctl -a | grep somaxconn
/etc/sysctl.conf 파일의 값들을 수정하여 해당 값들을 변경한다.(영구 적용)
net.ipv4.tcp_max_syn_backlog = 1024
net.core.somaxconn = 1024
sudo reboot
cf. 재부팅 없이 바로 설정을 즉시 적용하고 싶다면 아래 명령을 수행한다.(일시적 적용)
sysctl net.ipv4.tcp_max_syn_backlog=1024 sysctl net.core.somaxconn=1024
위와 같이 확인해보면 성공적으로 적용된 것을 확인할 수 있다.
레디스를 실행할 때는 redis.conf라는 설정 파일을 이용한다.(redis/redis.conf)
keyword argument1 argument2
conf 파일은 위와 같은 형태로 구성되어 있다. 주요 설정 값들은 아래와 같다.
port (default: 6379)
커넥션이 지정된 포트로 레디스 서버에 접속할 수 있도록 허용한다.
bind (default: 127.0.0.1-::1)
bind 파라미터는 어떤 ip로 들어오는 연결에 대해서 허용할 것인지를 결정한다. Redis는 기본적으로 로컬 머신에서만 접근할 수 있도록 설정되어 있으며, 외부 네트워크에서 접근하려면 bind 옵션을 수정해야 한다.
bind 192.168.1.100 127.0.0.1
protected-mode (default: yes)
해당 설정이 yes일 경우 패스워드를 설정해야만 레디스에 접근할 수 있다는 의미이다. protected-mode를 no로 설정하면 비밀번호가 없어도 외부에서 Redis에 접근할 수 있다.
requirepass / masterauth (default: x)
requirepass
requirepass는 Redis 서버에 접속하는 클라이언트가 인증을 위해 입력해야 하는 비밀번호를 설정하는 옵션이다.
비밀번호를 설정하면, 클라이언트는 Redis에 접속하여 명령어를 실행하기 전에 AUTH <비밀번호> 명령어로 인증을 받아야 한다.
masterauth
Redis의 Master-Slave(Replica) 구조에서 Slave(Replica) Redis 서버가 Master Redis 서버에 연결할 때 비밀번호 인증을 수행하기 위해 사용하는 설정이다. Master Redis 서버에 비밀번호(requirepass)가 설정되어 있을 경우, Slave 서버는 masterauth에 설정된 비밀번호로 Master 서버에 인증해야 한다.
protected-mode
requirepass
동작 방식 yes
설정 안 함 로컬에서만 접근 허용, 외부 접근 차단. yes
설정함 로컬/외부 모두 비밀번호 필요. no
설정 안 함 로컬/외부 모두 접근 가능 (위험). no
설정함 로컬/외부 모두 비밀번호 필요.
demonize (default: no)
레디스 프로세스를 데몬으로 실행시키려면 yes로 변경해야한다. 레디스를 데몬으로 실행 시 프로세스가 백그라운드에서 실행되고, pid 파일이 생성된다. (redis/redis.conf에서 값 변경)
cf. 데몬 모드로 실행되면 PID 파일(/var/run/redis_6379.pid)이 생성되며, 이를 통해 실행 중인 Redis 프로세스의 프로세스 ID(PID)를 관리할 수 있다.
cf. 대부분의 최신 Linux 시스템에서는 systemd로 Redis를 관리하므로, 데몬 모드 대신 포그라운드 모드를 사용하는 것이 일반적이다.
(Systemd가 프로세스를 관리하기 때문에 별도로 데몬 모드를 사용할 필요가 없다.)
cf. redis가 실행 중인 서버의 스펙이 충분하지 않을 시
(error) MISCONF Redis is configured to save RDB snapshots, but it's currently unable to persist to disk. Commands that may modify the data set are disabled, because this instance is configured to report errors during writes if RDB snapshotting fails (stop-writes-on-bgsave-error option). Please check the Redis logs for details about the RDB error.
에러가 발생 할 수 있다.해당 에러는 RDB 스냅샷 저장 중 추가 메모리가 필요하기 때문에 RDB 스냅샷 저장에 실패했음을 의미한다.
따라서 redis.conf에 들어가 stop-writes-on-bgsave-error no로 옵션을 수정해줘야 영구 반영된다.
위와 같이 변경한 후에는 sudo systemctl restart redis 명령어를 수행해주도록 하자.
demonrize를 yes로 설정한 경우 다음과 같은 명령으로 레디스를 실행 시킬 수 있다. Redis 서버를 특정 설정 파일(redis.conf)을 사용하여 실행하는 명령이다.
$ bin/redis-server redis.conf
cf. 레디스 프로세스 실행 확인 명령어
ps aux | grep redis
다음 명령어로 레디스 프로세스를 종료할 수 있다.
$ bin/redis-cli shutdown
레디스에 접속하려면 레디스 cli(command line interface)를 이용하면 된다.
레디스 cli는 레디스 설치 시 기본으로 설치되며, bin 디렉토리 내에 위치한다.
언제 어디서든 실행하기 위해 먼저 redis-cli가 위치한 경로를 환경변수로 등록해준다.
$ export PATH=$PATH:/home/ec2-user/redis/bin
하지만 위 명령어로는 현재 연결된 세션에 대해서만 적용이 되기에 영구적으로 등록해주기 위해서는 아래 명령어들을 입력해준다.
# 사용 중인 쉘 확인
echo $SHELL
# 설정 파일에 경로 추가
echo 'export PATH=$PATH:/home/ec2-user/redis/bin' >> ~/.bashrc
# 변경 사항 반영
source ~/.bashrc
# 경로가 제대로 추가되었는지 확인
echo $PATH
아래 명령어를 통해 redis에 접속해준다. 만약, requirepass에 패스워드를 설정해준 경우에는 접속 시 -a 옵션을 이용해 패스워드를 함께 입력해주거나 접속한 뒤 AUTH 커맨드와 함께 패스워드를 입력해야만 레디스를 정상적으로 사용할 수 있다.
redis-cli -h <IP주소> -p <포트> -a <패스워드>
ip 주소 생략 시 127.0.0.1(localhost)이 기본 값이며, 포트를 생략하면 기본 값은 6379이다.
위 명령어로 접속하면 기본적으로 대화형 모드로 레디스에 접속하며 사용자가 연결을 끊을 때까지 레디스 서버에 접속된 상태를 유지한다.
redis-cli <명령어>
위와 같이 명령어를 실행시키면 해당 명령어가 실행된 후 자동으로 종료한다.
레디스는 key-value 형태로 데이터를 저장하게 된다.
데이터 저장
SET <key> <value>
데이터 조회
GET <key>