Middleware/Redis 2019. 2. 27. 23:01

Redis - Redis 설치 및 설정, 간단한 사용방법




Redis란? 정말 단순하게 표현하면 key-value 형태의 값을 저장할 수 있는 하나의 In-Memory DB라고 생각하시면 됩니다. 

사용용도는 정말 많습니다. Springboot에서는 세션클러스터링을 위해 Redis를 사용하기도 하고, Cache를 위해서 사용하기도 하며,

여러 서버에서 공통으로 공유해야하는 정보를 담는 용도로 사용하기도 합니다. 필자는 챗봇을 개발중인데, 이중화된 서버에서 세션값을

공유하기위한 용도로 Redis를 사용하려고 합니다. 우선 이번 포스팅에서는 Redis 설치 및 설정, 그리고 간단한 사용법에 대한 포스팅입니다.


▶︎▶︎▶︎Redis Homepage


우선 위에서 Redis를 다운로드 받아줍니다.


그리고 다운로드 받아진 Redis Root 폴더로 들어가서

>make 

명령으로 컴파일을 해줍니다.


준비끝 !



첫번째 예제는 Redis Server를 Standard Alone으로 구성하는 예제입니다.

(편의상 Redis 폴더의 root를 $REDIS로 표현합니다.)


>$REDIS/src/redis-server 


위처럼 실행시켜줍니다. 그러면 Redis Server은 모든 기본설정으로 구동이됩니다.

localhost:6379



이런 화면이 보인다면 지금까지는 잘 따라오신겁니다. 다음은 cli를 이용하여 간단하게 데이터를 삽입,조회 해보겠습니다.



직관적으로 key-value 형태의 데이터를 삽입하고 조회하는 예제입니다.


현재까지의 구성으로 dev환경에서는 충분히 활용가치가 있습니다. 하지만 prod환경에서는 하나의 Redis Server로

운영한다는 것은 아주 위험한 선택일 것 같습니다. 그래서 다음 예제는 Zookeeper와 같은 소프트웨어에서도 이용하는

구성인 Master-Slave 관계를 구축해보겠습니다. Redis Server 구성은 하나의 로컬에서 구성한다는 가정입니다.



서버명 

IP:PORT 

Master Node 

127.0.0.1 : 6379 

Slave Node - 1 

127.0.0.1 : 6380 

Slave Node - 2 

127.0.0.1 : 6381 


위의 구성으로 진행해보도록 하겠습니다. 진행하기에 앞서 우리가 이번 포스팅에서 건들게되는 

설정파일이 있습니다. 그것은 바로 redis.conf입니다. 해당 파일을 들어가보면 주석으로 친절하게 설정정보 설명이 되어있습니다.

이번에는 모든 설정정보를 다루기보다는 우리가 많이 다루고, 꼭 필요한 정보들에 대한 설명만 할 예정입니다.


우선 다중 Redis Server 구성을 위하여 $REDIS에 있는 redis.conf를 2개 복사해둡니다.(Slave 2개 설정파일)


>cp redis.conf ./redis-slave1.conf

>cp redis.conf ./redis-slave2.conf


설정값

설명 

daemonize [yes||no] default no 

Redis는 기본적으로 daemon으로 실행하지 않습니다. 만약 daemon으로 실행하고 싶다면 'yes'를 사용하시면 됩니다. 만약 daemon으로 실행시 '/var/run/redis.pid' 파일에 pid를 디폴트로 기록할 것입니다.(파일경로 변경가능 - pidfile 설정) 

port [number] default 6379 

Connection 요청을 받을 포트를 지정하는 설정입니다. 

bind [ip] default all interface

Redis를 bind 할 특정 interface를 지정하는 설정입니다. 만약 명시하지 않으면 모든 interface로부터 들어오는 요청들을 listen합니다. 

unixsocket [path], unixsocketperm [number]

unixsocket /tmp/redis.sock / unixsocketperm 755

소켓으로 Redis Server를 붙게할 수 있는 설정입니다. 

timeout [second] 

클라이언트의 idle 시간이 해당 초만큼 지속되면 connection을 닫습니다.

0으로 지정할시 항상 connection을 열어둡니다. 

loglevel [level - debug, verbose,notice,warning] 

로그레벨지정 

logfile [file path] 

로그파일이 쓰여질 파일 경로를 지정합니다. 

slaveof -> replicaof [master ip] [master port] 

최근 버젼은 slaveof에서 replicaof로 변경됨.(어느 버전부터 바뀐지는 확인필요)

Master-Slave 관계를 구성하기 위하여 Master의 replication Node가될 slave Node 설정파일에 Master Node의 ip와port 정보를 기입하는 설정이다.

즉, Master의 데이터가 slave에 replicate되게 된다. 

 masterauth [master-password]

만약 Master Node 설정파일에 Slave Node가 붙기 위한 암호요구를 하였다면(require pass [password]), Slave Node의 설정파일은 Master Node가 지정한 패스워드로 해당 설정을 해줘야한다. 

slave-server-stale-data [yes||no] default yes

-> replica-server-stale-data [yes||no] default yes 

만약 slave가 master와의 connection이 끊겼거나 replication 중일 때, 취할수 있는 행동 2가지가 있다.


1. [yes] - 유효하지 않은 데이터로 클라이언트 요청에 답한다.

2. [no] - 몇몇 명령을 제외하고 요청에 대해 error로 응답한다. 

repl-ping-slave-perid [seconds] default 10 

Slave가 지정된 시간마다 ping을 날린다. 

repl-timeout [seconds] default 60 

타임아웃 시간을 설정한다. 기본적으로 ping 주기보다 큰 시간을 주어야한다. 

 require pass [password]

클라이언트에게 패스워드를 요구한다.(Slave가 Master에 접근할때의 보안설정이기도하다) 

maxclient [size]

한번에 연결될 수 있는 클라이언트의 연결수이다. 

maxmemory [bytes] 

Redis Server의 최대 메모리 사용양을 설정한다. 만약 memory에 한계가 도달했다면 Redis는 선택된 eviction policy(제거정책)에 따라 key들을 제거한다. 만약 제거에 실패한다면 read-only에 대한 명령만 수행할 수있게 된다. 

maxmemory-policy [policy] 

max memory 도달시 취할 정책을 설정한다

1) volatile-ru : expire가 설정된 key들 중 LRU 알고리즘을 이용해 선택된 key를 제거한다.

2) alleys-lru :  모든 keys에 대해 LRU 알고리즘을 적용해 제거한다.

3) volatile-random : expire가 설정된 key들 중 임의의 key를 제거한다.

4) alleys-random : 모든 keys중 랜덤하게 제거한다.

5) volatile-ttl : expire time이 가장 적게 남은 key를 제거한다.

6) noeviction : 어떠한 key도 제거하지 않는다. read-only작업만 허용하고 write와 그 밖에 명령은 error를 내뿜는다.

appendonly [yes||no]

Redis는 기본적으로 비동기로 disk에 dataset의 dump를 남긴다. 이 방법은 최근 데이터가 손실되어도 큰 문제가 없다면 사용해도 좋지만, 하나라도 데이터의 유실을 원치 않는 상황이라면 yes로 설정하여 요청받는 모든 write를 disk에 쓰도록하면 된다.(default file appendonly.aof) 

 appendfilename [file name]

append only 파일 이름을 설정한다. 


여기까지 몇가지 설정들을 다루어봤다. 실제 위에 설정들 일부를 사용하여 Master-Slave 관계를 구성해볼 것이다.


우선 MasterNode의 설정파일로 사용할 redis.conf이다.


>bind 127.0.0.1

>port 6379

>requirepass yourpassword

>daemonize  yes


이정도 설정으로 나머지는 기본설정을 사용한다.


이제는 나머지 SlaveNode의 설정파일 2개이다.


>bind 127.0.0.1

>port 6380(slave -1) / port 6381(slave-2)

>replicaof 127.0.0.1 6379

>masterauth yourpassword

>daemonize yes


로 구성한다.



이제 순차적으로 실행시켜본다


>$REDIS/src/redis-server ../redis.conf

>$REDIS/src/redis-server ../redis-slave1.conf

>$REDIS/src/redis-server ../redis-slave2.conf



Master&Slave를 순차적으로 실행 시킨 로그이다. Connection이 맺어지고 있는 것이 보인다.


그리고 실제로 데이터의 복제가 잘 이루어지는지 보기 위해 몇개의 창을 더 띄워서

cli로 데이터를 삽입,조회해본다.



복사가 잘된것을 확인할 수 있다. 그렇다면 혹시나 Master와의 관계를 끊기 위해

Master 노드를 중지시켰다면 어떻게 될까?



SlaveNode들의 로그를 보면 connection refused 로그가 계속해서 떨어진다.

하지만 아까 보았던 설정에서 replica-server-stale-data의 설정에 따라 Slave들의 행동이 

달라질것이다.



마지막으로 다시 MasterNode를 띄워보면



Slave들이 다시 Master에 connection 된것을 볼수있다. 여기까지는 좋다. 데이터 복제를 위해 replica도 구성했고,

근데 하나찜찜한 것이있다. Master가 죽으면 알아서 Slave중에서 Master를 선출하면 좋을 텐데.... 방법이 있다!

바로 sentinel을 이용하여 클러스터를 구성해주는 것이다. sentinel은 아쉽게도 다음 포스팅에서 다뤄볼 예정이다.


posted by 여성게
: