(1). Redis 개요
Redis는 오픈소스로 ANSI C 언어로 작성되었으며, 네트워크 지원이 가능하고 메모리 기반 또는 영구화 로그 기반의 Key-Value(키-값) 데이터베이스(관계형 데이터베이스가 아님)입니다. 다양한 언어의 API를 제공합니다.
Redis는 고성능 Key-Value 데이터베이스입니다. 그 등장은 Memcached와 같은 Key-Value 저장 시스템의 한계를 상당 부분 보완하며, 특정 상황에서 관계형 데이터베이스와 좋은 보완 역할을 할 수 있습니다. Java, C/C++, PHP, JavaScript, Perl, Object-C, Python, Ruby, Erlang 등 다양한 클라이언트를 지원하며 사용이 편리합니다.
Redis는 마스터-슬레이브 동기화를 지원하며, Sentinel(레디스 내장 도구)을 통해 마스터-슬레이브 노드를 모니터링할 수 있습니다. 마스터 노드에 장애가 발생하면 다른 슬레이브 노드를 자동으로 새로운 마스터로 승격시킵니다.
- 지원하는 데이터 타입
Memcached와 유사하지만, 저장 가능한 Value 타입이 더 다양하며 String(문자열), List(리스트), Sets(집합), Sorted Sets(정렬된 집합), Hash(해시 타입/연관 배열), Bitmaps(비트맵) 및 HyperLoglog를 포함합니다.
- 성능
약 100만 개의 작은 키로 문자열을 저장하면 약 100MB의 메모리가 소모됩니다.
Redis는 단일 스레드이므로 서버 호스트에 여러 CPU가 있더라도 하나만 사용할 수 있습니다. 하지만 CPU가 병목 현상이 되지는 않는데, Redis는 비교적 간단한 K-V 데이터 저장소이기 때문입니다. 일반적인 Linux 서버에서 50만 개의 동시 요청은 1초 내에 처리할 수 있으며, 하드웨어가 좋은 경우 초당 수�만 개의 동시 요청을 처리할 수 있습니다.
- Redis와 Memcache 비교
Memcached는 메모리만을 사용하여 객체를 캐시할 수 있습니다. 반면 Redis는 메모리를 사용하여 객체를 캐시할 뿐만 아니라 주기적으로 데이터를 디스크에 저장하여 영구 저장이 가능합니다. 서버가 갑자기 전원이 차단되거나 다운되면 Redis는 디스크의 데이터를 기반으로 복구됩니다.
Redis는 단일 스레드 서버로 모든 요청을 하나의 스레드로 처리합니다. Memcached는 멀티스레드입니다.
Redis가 더 다양한 데이터 타입을 지원합니다.
(2). 설치
Redis를 yum으로 설치할 때는 Remi 저장소를 사용하는 것이 좋습니다. Remi 저장소는 최신 버전의 Redis를 제공하며, 이 저장소를 통해 YUM으로 최신 버전의 Redis를 설치할 수 있습니다. 또한 PHP와 MySQL의 최신 yum 저장소 및 관련 서비스 프로그램도 제공합니다.
- Remi 저장소는 epel 저장소에 의존하므로, 먼저 epel 저장소를 설치해야 합니다
[root@server ~]# yum -y install epel-release
- Remi 저장소 설치
[root@server ~]# yum -y install http://rpms.remirepo.net/enterprise/remi-release-7.rpm
[root@server ~]# ls /etc/yum.repos.d/ // 다운로드가 완료되면 여러 개의 remi yum 저장소가 나타납니다. 여기서 사용할 것은 remi.repo입니다
CentOS-Base.repo CentOS-Sources.repo remi-glpi92.repo remi-php70.repo remi-safe.repo
CentOS-CR.repo CentOS-Vault.repo remi-glpi93.repo remi-php71.repo
CentOS-Debuginfo.repo epel.repo remi-glpi94.repo remi-php72.repo
CentOS-fasttrack.repo epel-testing.repo remi-modular.repo remi-php73.repo
CentOS-Media.repo remi-glpi91.repo remi-php54.repo remi.repo
- 지정된 yum 저장소를 사용하여 Redis 설치
[root@server ~]# yum --enablerepo=remi install -y redis //--enablerepo로 yum 저장소 지정
[root@server ~]# redis-cli --version // 설치 후 버전 확인
redis-cli 5.0.5
참고: remi 저장소 설치 후 기본으로는 활성화되지 않습니다. remi 저장소를 사용하여 프로그램을 설치할 때는 --enablerepo=remi 옵션으로 지정해야 사용할 수 있으며, 그 후 설치를 진행합니다.
- Redis 시작 및 부팅 시 자동 시작 설정
[root@server ~]# systemctl start redis
[root@server ~]# systemctl enable redis
Created symlink from /etc/systemd/system/multi-user.target.wants/redis.service to /usr/lib/systemd/system/redis.service.
참고: Redis의 포트 번호는 6379입니다.
(3). 구성 파일 정보
Linux 환경에서 Redis의 구성 파일은 /etc/ 디렉터리에 있는 redis.conf에 저장됩니다. 자주 사용되는 매개변수는 다음과 같습니다:
// 69행, Redis가 수신할 주소
bind 127.0.0.1
// 88행, 보안 모드, 외부에서 Redis에 접근을 금지할지 여부, yes는 활성화를 의미하며 로컬 접근만 허용
protected-mode yes
// 92행, 수신 포트 번호
port 6379
/* 101행, tcp-backlog 길이 지정. tcp-backlog는 대기 큐입니다.
* 많은 요청이 Redis를 처리해야 할 때 대기해야 하는 요청 큐는 backlog로 캐시됩니다.
* backlog의 크기는 캐시할 수 있는 큐의 수를 결정합니다
*/
tcp-backlog 511
// 109행, sock 파일 통신 및 위치 지정. 서버와 클라이언트가 동일한 호스트에 있는 경우 활성화하는 것이 좋습니다. sock 방식 통신은 TCP/IP 프로토콜 스택을 거치지 않고 직접 메모리에서 데이터 교환을 수행합니다
# unixsocket /tmp/redis.sock
// 110행, sock 파일 권한 정의
# unixsocketperm 700
// 113행, 클라이언트 연결 후 유휴 시간 초과 설정(비활성, 데이터 교류 없음). 0은 이 기능을 사용하지 않음을 의미
timeout 0
// 130행, 연결을 유지할 시간(초 단위)
tcp-keepalive 300
// 136행, 백그라운드에서 데몬으로 실행할지 여부. redis 서비스 스크립트로 시작하면 no로 설정해도 데몬이 실행됩니다. 일반적으로 yes로 설정
daemonize no
// 147행, upstart 또는 systemd가 redis 프로세스를 관리할지 여부. 기본값은 무监督 모드이므로 수정할 필요 없음
supervised no
// 158행, pid 파일 경로
pidfile /var/run/redis_6379.pid
// 166행, 로그 수준
loglevel notice
// 174행, 로그 파일 위치
logfile /var/log/redis/redis.log
// 186행, 데이터베이스 기본 수. 분산 환경에서는 하나만 사용 가능
databases 16
/* 218-220행, 스냅샷 저장 정책, 디스크에 대한 영구화 전략
* 첫 번째 숫자는 시간(초 단위), 두 번째 숫자는 키-값 변경 횟수
* 예를 들어 첫 번째 설정은 900초 내에 최소 1번의 키-값 변경이 발생하면 스냅샷(영구화)을 한 번 수행
* 두 번째 설정은 300초 내에 최소 10번의 키-값 변경이 발생하면 스냅샷(영구화)을 한 번 수행
* 모든 조건은 병렬 관계이며, 다른 키-값 변경에 따라 규칙이 선택됨
*/
save 900 1
save 300 10
save 60 10000
// 235행, 스냅샷 백업 중 오류 발생 시 중지 여부, 기본값인 yes로 설정
stop-writes-on-bgsave-error yes
// 241행, RDB 파일 압축 여부 지정. yes는 압축을 의미하며 CPU 자원을 소모
rdbcompression yes
/* 250행, RDB 파일에 대해 체크섬 검증을 수행할지 여부.
* 이 항목은 redis 시작 시 RDB 파일을 로드할 때 체크섬을 검사할지, redis가 RDB 파일을 생성할 때 체크섬 정보를 생성하고, 다시 시작하거나 RDB 파일을 로드할 때 체크섬 정보를 검사할지 정의합니다.
* 검사 시 시간이 소모되어 redis 시작이 느려질 수 있지만, RDB 파일에 오류가 발생했는지 판단할 수 있습니다.
*/
rdbchecksum yes
// 253행, RDB 파일 이름
dbfilename dump.rdb
// 263행, RDB 파일 저장 경로
dir /var/lib/redis
// 286행, 마스터 서버 IP와 포트 정의, 마스터-슬레이브 복제 구성 정보
# replicaof <masterip> <masterport>
// 293행, 마스터 서버 비밀번호 정의, 마스터-슬레이브 복제 구성 정보
# masterauth <master-password>
// 308행, 슬레이브가 마스터-슬레이브 복제 과정에서 마스터와 연결이 끊어졌을 때 yes는 최신 데이터가 아닐 수 있음에도 서비스를 계속 제공, no는 요청에 대해 오류 메시지 반환
replica-serve-stale-data yes
// 324행, 슬레이브 읽기 전용 모드
replica-read-only yes
// 355행, 기본적으로 diskless(디스크 없음) 동기화 방식을 사용하지 않음
repl-diskless-sync no
// 367행, diskless 방식으로 데이터 전달 전 대기 시간(슬레이브가 전달 대기열에 도달할 시간 확보), 기본값 5초
repl-diskless-sync-delay 5
// 373행, 슬레이브가 마스터에게 ping을 보내는 간격, 기본값 10초
# repl-ping-replica-period 10
// 385행, 타임아웃 시간 설정
# repl-timeout 60
/* 400행, TCP_NODELAY 활성화 여부.
* 활성화하면 적은 TCP 패킷과 대역폭을 사용하여 슬레이브로 데이터 전송(속도 느림)
* 비활성화하면 더 많은 대역폭을 사용하여 데이터 전송(속도 빠름)
*/
repl-disable-tcp-nodelay no
/* 413행, backlog 크기 설정. backlog는 슬레이브가 연결이 끊겼을 때 동기화할 데이터를 저장하는 버퍼입니다.
* 따라서 슬레이브가 다시 연결되면 일반적으로 완전한 동기화가 필요하지 않습니다. backlog가 클수록 슬레이브가 연결이 끊긴 시간이 더 길어집니다
*/
# repl-backlog-size 1mb
// 426행, 일정 시간 동안 슬레이브가 마스터에 연결되지 않으면 backlog(버퍼) 메모리가 해제됨. 0은 해제하지 않음, 기본값 3600초
# repl-backlog-ttl 3600
// 441행, 슬레이브 우선순위 설정, 숫자가 작을수록 우선순위가 높음. 마스터 장애 시 우선순위가 높은 슬레이브로 복구됨. 0으로 설정하면 해당 슬레이브는 절대 선택되지 않음
replica-priority 100
// 457-458행, 마스터의 사용 가능 슬레이브가 3개 미만이나 네트워크 지연이 10초 이상일 때 마스터가 사용자의 쓰기 요청을 거부
# min-replicas-to-write 3
# min-replicas-max-lag 10
// 507행, 인증 비밀번호 지정, 기본값은 비활성화
# requirepass foobared
// 539행, 동시에 redis에 연결할 최대 클라이언트 수
# maxclients 10000
특히 주의할 점: 69행의 bind, 88행의 protected-mode, 136행의 daemonize, 539행의 maxclients, 그리고 모든 마스터-슬레이브 복제 구성 매개변수입니다.
(4). Redis 기본 사용법
가장 간단한 사용법: redis-cli -h [IP 주소] -p [포트 번호]. 로컬에 연결하는 경우 -h와 -p는 생략할 수 있습니다.
- Redis 문자열 작업
키 명명 규칙: ASCII 문자 사용 가능; 키 길이는 너무 길지 않아야 함(길이가 길수록 더 많은 공간 소모); 동일한 데이터베이스(네임스페이스) 내에서 키 이름은 중복될 수 없음(키 이름을 복제하면 실제로는 키의 값을 수정); 다른 데이터베이스(네임스페이스)에서는 키 이름이 중복될 수 있음; 키는 자동 만료가 가능합니다.
[root@server ~]# redis-cli
127.0.0.1:6379> set system centos // 키-값 생성
OK
127.0.0.1:6379> get system // 키-값 조회
"centos"
127.0.0.1:6379> exit
[root@server ~]# systemctl restart redis // 재시작
[root@server ~]# redis-cli
127.0.0.1:6379> get system // 키-값이 여전히 존재하는 것을 확인
"centos"
127.0.0.1:6379> set name "youxi" EX 10 // 이렇게 설정하면 키-값이 10초 동안만 존재
OK
127.0.0.1:6379> get name // 10초 후 다시 확인하면 임시 키-값이 사라짐
(nil)
- 인증 기능 활성화 시
먼저 구성 파일을 수정하여 인증 기능을 활성화합니다
[root@server ~]# vim /etc/redis.conf
requirepass 123456 // 507행 주석 제거, 인증 비밀번호 설정
[root@server ~]# systemctl restart redis
이제 redis를 다시 사용해보면
[root@server ~]# redis-cli
127.0.0.1:6379> get system // 인증 없이 시도 시 오류 발생
(error) NOAUTH Authentication required.
127.0.0.1:6379> auth 123456 // 인증
OK
127.0.0.1:6379> get system // 인증 후 다시 키-값 조회 성공
"centos"
(5). 영구화(Persistence) 구성
Redis는 작동 시 모든 데이터 세트를 메모리에 저장합니다. Redis가 충돌하거나 전원이 차단되면 모든 데이터가 손실될 수 있으므로, 데이터의 신뢰성을 보장하기 위해 영구화 기능을 제공합니다. Redis 영구화에는 RDB와 AOF 두 가지 구현 방법이 있습니다.
RDB: 바이너리 형식의 데이터 파일로 저장되며, 기본적으로 활성화된 영구화 메커니즘입니다. 사전에 정의된 전략에 따라 주기적으로 데이터를 디스크에 저장합니다.
AOF(Append Only File): MySQL의 바이너리 로그와 유사하며, 모든 redis 쓰기 작업 명령을 순차적으로 지정된 파일 끝에 추가하는 방식으로 구현되는 로그 기반 영구화 메커니즘입니다. 모든 작업을 기록하므로 시간이 지나면 파일 크기가 커지고 일부 기록된 명령은 중복될 수 있습니다. 하지만 redis 프로세스가 해당 AOF 파일을 자동으로 스캔하여 중복 작업을 병합하여 나중에 데이터를 한 번에 복원할 수 있습니다.
RDB 구성은 위에서 이미 설명했으므로, 여기서 다시 복제합니다. 총 6개의 구성 항목입니다.
/*
* 218-220행, 스냅샷 저장 정책, 디스크에 대한 영구화 전략
* 첫 번째 숫자는 시간(초 단위), 두 번째 숫자는 키-값 변경 횟수
* 예를 들어 첫 번째 설정은 900초 내에 최소 1번의 키-값 변경이 발생하면 스냅샷(영구화)을 한 번 수행
* 두 번째 설정은 300초 내에 최소 10번의 키-값 변경이 발생하면 스냅샷(영구화)을 한 번 수행
* 모든 조건은 병렬 관계이며, 다른 키-값 변경에 따라 규칙이 선택됨
*/
save 900 1
save 300 10
save 60 10000
// 235행, 스냅샷 백업 중 오류 발생 시 중지 여부, 기본값인 yes로 설정
stop-writes-on-bgsave-error yes
// 241행, RDB 파일 압축 여부 지정. yes는 압축을 의미하며 CPU 자원을 소모
rdbcompression yes
/* 250행, RDB 파일에 대해 체크섬 검증을 수행할지 여부.
* 이 항목은 redis 시작 시 RDB 파일을 로드할 때 체크섬을 검사할지, redis가 RDB 파일을 생성할 때 체크섬 정보를 생성하고, 다시 시작하거나 RDB 파일을 로드할 때 체크섬 정보를 검사할지 정의합니다.
* 검사 시 시간이 소모되어 redis 시작이 느려질 수 있지만, RDB 파일에 오류가 발생했는지 판단할 수 있습니다.
*/
rdbchecksum yes
// 253행, RDB 파일 이름
dbfilename dump.rdb
// 263행, RDB 파일 저장 경로
dir /var/lib/redis
AOF 구성은 679행부터 시작하며, 필요한 경우 직접 확인할 수 있습니다.