과제 내용

  • 스크립트를 실행하면 자동으로 redis를 설치함
  • redis-cli 입력시 자동으로 접속할 수 있는 alias 추가
  • 설치 버전을 변수로 받기
sh install_redis.sh 7.0.8

 

개발환경

  • NHN Cloud
  • CentOS 7.9

 

프로세스

 

코드

  • 버전을 입력받지 않았을 때

 

  • 버전을 입력받았을 때
    • 입력한 버전을 설치할 것인지 묻기

 

  • redis와 dependency들이 이미 설치되어 있는지 확인

 

  • redis 다운로드 및 설치

 

  • redis.conf 등 설정

 

  • redis 실행

 

  • alias 설정

 

결과

ACL

Access Control List의 줄임말로 redis 6부터 도입된 기능입니다.

 

다른 RDBMS(MySQL, Oracle 등)에는 유저별로 접근 가능한 범위를 정할 수 있지만

redis에는 유저라는 개념이 없었습니다.

 

ACL은 유저를 설정하고 실행 가능한 커맨드와 접근할 수 있는 키 측면에서 특정 연결을 가능하게 해줍니다.

 

# 1
ACL SETUSER alice on >p1pp0 ~cached:* +get

# 2
AUTH alice p1pp0
  • #1 : alice 라는 user를 생성한다.
    • 이름 
    • 패스워드 : p1pp0
    • 접근 가능한 키 패턴 : cached 로 시작하는 key들에 접근할 수 있다. (allkeys : 모든 키에 접근 가능)
    • 실행 가능한 커맨드 : 접근할 때는 get 만 사용할 수 있다. (allcommands : 모든 명령어 사용 가능)
  • #2 : alice 계정으로 redis를 사용하도록 한다.

비밀번호만 설정한다는 것은 "default" user를 사용한다는 의미입니다.

ACL feature를 사용하여 user를 생성하고, user가 접근할 수 있는 key와 command를 지정해놓는다면, redis를 조금 더 안전하게 사용할 수 있을 것입니다.

 

사용자 등록

> ACL SETUSER user on/off >password keys commands
  • user: user-id를 설정한다.
  • on/off: 사용 여부를 정한다. on이면 사용 가능하고, off이면 사용할 수 없다.
    • Off는 사용자는 등록하지만 일단 사용하지 못하게 할 경우 또는 기존 사용자를 사용하지 못하게 할 경우 사용한다.
    • 이 경우 새로 로그인(auth)은 할 수 없지만, 이미 로그인한 사용자의 사용을 막지는 못한다.
  • >password: '>' 구분자 다음에 지정한다. 자유롭게 지정할 수 있다.
    • 패스워드 없이 사용하려면 nopass를 지정한다. 로그인 시 어떤 문자열이든 입력해도 된다.
    • 패스워드를 지정했을 경우: auth user password 로 로그인
  • keys:
    • 모든 키 : allkeys 또는 ~*
    • 특정 패턴 : 예) ~user*, ~key* 이렇게 지정하면 user 또는 key로 시작하는 키에 대해서만 사용할 수 있다.
    • 키 X : Resetkeys
    • 키 패턴을 지정하면 매 명령마다 비교하므로 성능이 떨어질 수 있다. 성능이 우선일 경우 사용에 주의
  • commands:
    • 모든 명령 : allcommands 또는 +@all
    • 명령 X : Nocommands 또는 -@all
    • 명령은 그룹 또는 명령으로 추가 또는 뺄 수 있다.
      • 명령 그룹 : +@group/-@group, 명령 : +command/-command

 

사용자 조회

ACL GETUSER user

 

사용자 삭제

ACL DELUSER user

 

본인 확인

ACL WHOAMI

 

사용자 리스트 조회

ACL USERS

 

사용자 정보 리스트 조회

ACL LIST

 

사용자 정보 저장

ACL SAVE

 

사용자 정보 로드

ACL LOAD

 

명령 그룹 조회

127.0.0.1:6379> ACL CAT
1) "keyspace"
2) "read"
3) "write"
4) "set"
5) "sortedset"
6) "list"
7) "hash"
8) "string"
9) "bitmap"
10) "hyperloglog"
11) "geo"
12) "stream"
13) "pubsub"
14) "admin"
15) "fast"
16) "slow"
17) "blocking"
18) "dangerous"
19) "connection"
20) "transaction"
21) "scripting"
  • keyspace: del, expire, flushdb, keys, ttl, scan 등
  • read: get, lrange, smembers, zrange, hget, xrange 등
  • write: set, lpush, sadd, zadd, hset, xadd 등
  • set: sadd, scard, srem, spop 등
  • sortedset: zadd, zcard, srem, zpopmin 등
  • list: lpush, llen, lrem, lpop 등
  • hash: hset, hlen, ldel, hget 등
  • string: set, get, incr 등
  • bitmap: setbit, bitop, getbit 등
  • hyperloglog: pfadd, pfmerge, pfcount, pfselftest
  • geo: geoadd, geodist, georadius 등
  • stream: xadd, xlen, xrange, xdel 등
  • pubsub: publish, subscribe, pubsub 등
  • admin: bgsave, config, debug, shutdown 등
    Admin 명령은 dangerous 그룹에 포함된다.
  • fast: get, lpush, hget 등
  • slow: lrem, mset, save 등
  • blocking: blpop, brpop, brpoplpush, bzpopmin, bzpopmax, xread, xreadgroup
  • dangerous: flushdb, keys, shutdown, info, client 등
  • connection: hello, client, auth, echo, ping, command
  • transaction: watch, multi, unwatch, discard, exec
  • scripting: evalsha, eval, script

각 명령이 어느 그룹에 속하는지는 "command info 명령"을 사용해서 확인할 수 있다.

예를 들면, SET 명령은 write, string, slow이고, GET 명령은 read, string, fast이다.

 

패스워드 생성

ACL GENPASS [<bits>]
  • 디폴트로 64바이트 문자열로 패스워드를 생성한다.
  • 암호화 알고리즘으로 SHA-256을 사용한다.

 

ACL(Auth) 로그

ACL LOG [<count> | RESET]

✅ 공식문서

https://redis.io/topics/acl

 

목차

 

 

 

 

 

 

참고

http://redisgate.kr/redis/server/acl.php

https://sungbin.dev/post/Redis%20%ED%95%B4%ED%82%B9%EB%8B%B9%ED%95%9C%20%EC%9D%B4%EC%95%BC%EA%B8%B0

Pub/Sub - 메시지 브로커

Pub/Sub은 Publish/Subscribe의 줄임말입니다.

 

단어 자체에 구독/게시라는 뜻이 있듯이 Redis에서 Pub/Sub 기능을 사용하면

클라이언트가 채널을 통해 메시지를 주고받음으로써 서로 통신할 수 있습니다.

 

구조

클라이언트는 하나의 Topic을 "Sub"하고,

해당 토픽을 "Sub"한 다른 모든 클라이언트는 해당 Topic에서 "Pub"되는 메시지를 수신합니다.

 

MSDN blog

Topic이라는 매개체를 통해서 메시지를 전달하므로

수신자와 발신자가 서로를 알지 못하더라도 메시지를 송수신할 수 있습니다.

 

특징

메시지는 Redis에 저장되지 않고 채널을 구독하는 클라이언트에 실시간으로 전송된다는 점에 유의해야 합니다.

클라이언트에게 전달되면 이를 바로 삭제합니다.

 

예시

이를 통해 Redis 지원 애플리케이션에서 실시간 메시징 및 알림을 구현할 수 있습니다.

예를 들어 채팅 애플리케이션은 pub/sub를 사용하여 한 사용자에서 다른 사용자에게 실시간으로 메시지를 보낼 수 있습니다.

  1. 애플리케이션에는 각 대화에 대한 채널이 있고
  2. 대화에 참여하는 클라이언트는 해당 채널을 구독합니다.
  3. 사용자가 메시지를 보내면 애플리케이션은 해당 채널에 메시지를 게시하고
  4. 해당 채널을 구독하는 다른 모든 클라이언트는 실시간으로 메시지를 수신합니다.

 

👎 따라서 메시지를 저장하여 관리해야 되는 경우, Redis의 Pub/Sub은 적합하지 않을 수 있습니다.

👍 예를 들어 PUSH 메시지처럼 실시간으로 로그인된 사용자에게 메시지를 전달하는 기능을 구현할 경우, 유용하게 사용될 것입니다.

 

명령어

Commands Syntax Description
subscribe channel [channel...] 채널을 구독하여, 메시지를 수신받음 (동시에 여러개 구독 가능)
publish channel message 메시지 지정한 채널로 송신
pubsub subcommand [argument [argument ...]] 서버에 등록된 채널이나 패턴을 조회
psubscribe pattern [pattern ...] 채널 이름을 패턴으로 등록
unsubscribe [channel [channel ...]] subscribe로 등록한 채널 구독 해제
punsubscribe [pattern [pattern ..]] psubscribe로 등록한 패턴 채널 구독 해제

 

subscribe 명령어

파라미터로 명시한 채널을 구독합니다. 여러 개의 채널을 동시에 구독할 수 있습니다.

결과값 : 구독한 채널명, integer값 반환

> subscribe <채널명>

> subscribe <채널명1> <채널명2> ... # 여러 개의 채널을 등록하면, 각각의 채널로 메시지가 발행되면 모두 수신한다.

✔️ redis에서 channel을 생성하는 명령어는 없고, subscribe로 채널을 생성하고 구독하는 것으로 보면 됩니다.

 

publish 명령어

이제 ch1을 구독하는 subscriber가 생겼으므로,

publisher client에서 publish 명령어를 사용해 메시지를 발행하면

subscriber client에서 해당 메시지를 전달받게 됩니다.

> publish <채널> <내용>
(integer) 2 # 채널에 메시지를 발행했고, 2개의 클라이언트에게 전달되었음

publisher
subscriber

 

pubsub 명령어

administrator가 효율적으로 subscriber를 관리할 수 있도록 하는 명령어입니다.

  • channels : 활성화 된 채널
  • numsub : 특정 채널을 구독하고 있는 subscriber의 개수 확인
    • pattern subscription으로 구독하고 있는 subscriber는 count에 포함되지 않음
  • numpat : pattern subscription의 subscriber 개수 확인
    • 특정 채널의 subscriber가 아닌, 전체 subscriber 개수 return
# 활성화된 채널이 없을 때
> pubsub channels
(empty array)

# 아래의 SUBSCRIBE 명령어로 채널을 한 개 활성화 시켰을 때
> pubsub channels
1) "c1"

# 채널을 구독중인 클라이언트 수 확인
> pubsub numsub ch1
1) "ch1"
2) (integer) 1

# 패턴형으로 등록된 클라이언트 수 확인
> pubsub numpat
(integer) 0

 

psubscribe 명령어

수신할 채널 이름의 패턴을 등록하는 명령어입니다.

 

패턴은 아래와 같은 glob-style을 지원합니다.

  • '?' : 한 글자 대치
  • '*' : 공백이나 여러 글자 대치
# 패턴을 등록하여 수신시작
> psubscribe c*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "c*"
3) (integer) 1

# 패턴 채널을 등록된 채널에는 포함되지 않음
127.0.0.1:6379> pubsub channels
1) "c1"

# 패턴 조회 : 1개 확인
127.0.0.1:6379> pubsub numpat
(integer) 1

# 등록하지 않았던 채널 ch2로 메시지 보냄
> publish ch2 "test 2"
(integer) 1

# 패턴으로 구독 신청한 채널에 메시지가 추가됨
> psubscribe c*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "c*"
3) (integer) 1
1) "pmessage"
2) "c*"
3) "c2"
4) "test 2"

 

unsubscribe / punsubscribe 명령어

  • 기본 : redis-cli에서 ctrl+c로 구독 종료
  • 별도 클라이언트 : unsubscribe 명령어로 수신 중단
  • 패턴 채널 : punsubscribe 명령어로 수신 중단
  • 채널명 입력하지 않으면 : 해당 클라이언트에 등록된 모든 채널 삭제
> unsubscribe ch1*
1) "unsubscribe"
2) "ch*"
3) (integer) 1

> punsubscribe ch1*
1) "punsubscribe"
2) "ch*"
3) (integer) 1

 

 

 

 

참고

https://inpa.tistory.com/entry/REDIS-%F0%9F%93%9A-PUBSUB-%EA%B8%B0%EB%8A%A5-%EC%86%8C%EA%B0%9C-%EC%B1%84%ED%8C%85-%EA%B5%AC%EB%8F%85-%EC%95%8C%EB%A6%BC

https://velog.io/@tilsong/Redis%EC%9D%98-%EC%A3%BC%EC%9A%94-%EA%B8%B0%EB%8A%A5-2-PubSub

✅ 공식문서

Install Redis on Linux

 

⬇️ Redis 설치 전에 인스턴스 생성하는 방법 ⬇️

2023.01.08 - [인프라/NHN Cloud] - NHN Cloud 인스턴스 생성하기


인스턴스 환경

  • OS : CentOS 7.9
  • 아키텍쳐: x86_64

설치할 Redis 버전

  • redis 7.0.8 (the lastest stable)

 

1. 설치 과정

( 1 / 4 ) 인스턴스에 SSH 방식으로 접속

ssh -i [키페어이름.pem] centos@[플로팅IP]

 

( 2 / 4 ) epel 다운로드

  • yum 리포지토리에는 최신버전(7.0.8)이 아닌 3.2.12 버전이 있으므로 epel, remi 저장소를 이용
sudo yum install epel-release

💡 EPEL이란?

더보기
  • Extra Packages for Enterprise Linux의 약자
  • Fedora에서 관리
  • CentOS Default 리포지토리에 포함되지 않은 여러 패키지들을 설치할 수 있는 커뮤니티 기반 저장소

 

( 3 / 4 ) REMI 저장소 패키지 설치

sudo yum -y install http://rpms.remirepo.net/enterprise/remi-release-7.rpm

💡REMI란?

더보기
  • Default 리포지토리에는 오래된 버전의 패키지들이 있기 때문에 최신 버전이 필요한 경우 remi 사용
  • remi 저장소는 epel 저장소 의존성이 있음 (epel이 있어야 remi 사용 가능)

 

( 4 / 4 ) yum을 통해 다운로드

sudo yum install redis

 

2. 설치 결과

( 1 / 7 ) redis 서버 실행

sudo systemctl start redis
sudo systemctl enable redis  # Redis를 자동 시작될 수 있도록 설정

 

# Redis 서비스 상태 확인
systemctl status redis

( 2 / 7 ) redis 클라이언트 실행

redis-cli

 

( 3 / 7 ) ping 날려보기

 

( 4 / 7 ) strings 생성

 

( 5 / 7 ) hashes 생성

 

( 6 / 7 ) set key 생성

 

( 7 / 7 ) 종료하기

종료하기 전에 데이터를 디스크에 저장함

# redis-cli에서
redis-cli shutdown

 

부록) 제거 방법

1. 설치한 redis 패키지명 확인

# / 위치에서
sudo yum list installed redis*

 

2. 제거 명령

# redis 중단
sudo service redis stop

# redis 제거
sudo yum remove redis.x86_64

 

 

 

 

 

참고

https://puttico.tistory.com/151

https://www.lesstif.com/system-admin/epel-yum-100205250.html

✅ 공식문서

Install Redis from Source

 

⬇️ Redis 설치 전에 인스턴스 생성하는 방법 ⬇️

2023.01.08 - [인프라/NHN Cloud] - NHN Cloud 인스턴스 생성하기


인스턴스 환경

  • OS : CentOS 7.9
  • 아키텍쳐: x86_64

설치할 Redis 버전

  • redis 7.0.8 (the lastest stable)

 

1. 설치 과정

( 1 / 6 ) 인스턴스에 SSH 방식으로 접속

ssh -i [키페어이름.pem] centos@[플로팅IP]

 

( 2 / 6 ) wget 다운로드

# 인터넷이 가능한 환경일 경우
sudo yum install wget

# 인터넷이 불가능할 경우
# 설치할 파일을 서버에 업로드해서 진행

 

( 3 / 6 ) redis 바이너리 버전 압축파일 다운로드

# 안정적인 최신 버전에 대한 소스 파일 (버전 7.0.8)
wget https://download.redis.io/redis-stable.tar.gz

 

( 4 / 6 ) 압축해제

tar -xzvf redis-stable.tar.gz

 

( 5 / 6 ) make 실행

make

💡 make란?

더보기
  • Unix/Linux에 포함되어 있는 명령어
  • 파일관리 유틸리티 소프트웨어
  • makefile이라는 파일을 참조해서 컴파일러에 명령을 전달하며, makefile에 기술된 shell 명령어가 순차적으로 실행되게 함
    • gcc 명령어 등의 컴파일러 명령어를 makefile에 기술해 놓으면 개발자는 make 명령어만 사용해서 여러 단계의 컴파일 과정을 한번에 진행할 수 있음

 

  • ❗️오류 발생 which: no python3 in (/user/local/bin:/usr/bin:...)
    • python3 설치 여부 확인 후 설치
# 설치 여부 확인
python3 --version

# 설치 전
-bash: python3: command not found

# 설치
sudo yum install python3

# 설치 후
Python 3.6.8

 

  • ❗️오류 발생 make[3]: cc: Command not found
    • gcc가 없어서 나는 오류이므로 gcc 설치 후 make clean하고 다시 make
# src 위치에서
sudo yum install gcc
make clean
make

💡 gcc란?

더보기

Gnu Complier Collection의 줄임말로 GNU 프로젝트의 일환으로 개발되어 널리 쓰이고 있는 컴파일러

 

  • ❗️❗️ 다시 오류 발생
make distclean
make

💡 make clean 과 make distclean 차이

더보기

보통 source complie 과정은 <압축해제 - configure - make> 이다.

 

make 한 것을 되돌리기 위해서는 make clean을 하면 되지만,

설정을 변경해서 configure 이전으로 되돌리기 위해서는 make distclean을 한다.

  • make clean : 이전에 컴파일 했던 내용을 삭제
  • make distclean : tar.gz 등 압축파일을 풀었을 때 최초 상태로 되돌아감
    • 이미 한번 configure 했다가 다시 configure 하기 위해서 해당 파일을 압축 해제한 디렉토리 내에서 설정 파일 등을 지워야 하는 복잡한 과정을 알아서 삭제해줌

 

( 6 / 6 ) 다운로드 받은 압축파일 삭제

rm redis-stable.tar.gz

 

2. 설치 결과

( 1 / 6 ) redis 서버 실행

cd redis-stable/
src/redis-server

 

( 2 / 6 ) redis 클라이언트 실행

서버를 켜둔 상태에서 다른 쉘에서 SSH 접속해서 redis-cli로 동작 중인 redis 서버에 접속

cd redis-stable/
src/redis-cli

 

( 3 / 6 ) ping 날려보기

 

( 4 / 6 ) strings 생성

 

( 5 / 6 ) hashes 생성

 

( 6 / 6 ) set key 생성

 

 

부록) 제거 방법

# 1. 실행중인 모든 레디스 서버를 중단
$ sudo service redis stop
 
# 2. /usr/local/bin/ 의 모든 것 제거
$ sudo rm /usr/local/bin/redis-*
 
# 3. Redis configurations 폴더 및 내용 제거
$ sudo rm -r /etc/redis/
 
# 4. 로그 파일들 제거
$ sudo rm /var/log/redis_*
 
# 5. Redis data 폴더 및 내용 제거
$ sudo rm -r /var/lib/redis/
 
# 6. Redis init 스크립트 제거
$ sudo rm /etc/init.d/redis_*
 
# 7. Redis PID 제거
$ sudo rm /var/run/redis_*

 

 

 

참고

http://egloos.zum.com/sweeper/v/3157977

https://dobby-the-house-elf.tistory.com/109

https://m.blog.naver.com/sory1008/221707361845

https://celltwo.tistory.com/89

https://80000coding.oopy.io/d5fa7c87-192f-4c68-95eb-aa4af5b9dbf5

+ Recent posts