관리 메뉴

HeBhy, since 1983.

Spring Session using Redis 5.0.10 in Spring Boot 2.x (with cluster) 본문

Dev/Web

Spring Session using Redis 5.0.10 in Spring Boot 2.x (with cluster)

HeBhy 2018. 9. 18. 01:38

1. redis 설치 (CentOS 7)

  (참조: https://redis.io/download)

 

$ cd /usr/local/src
$ wget https://download.redis.io/releases/redis-5.0.10.tar.gz
$ tar xvzf redis-5.0.10.tar.gz
$ cd redis-5.0.10
$ make && make install
$ cd utils
$ ./install_server.sh

* 버전업으로 인해 빌드에러가 나는경우.. 다음을 실행후 다시 install_server.sh 실행.

yum install centos-release-scl
yum install devtoolset-7-gcc*
scl enable devtoolset-7 bash
yum install tcl tk
make distclean && make install

 

 

 -install_server.sh 실행 후 엔터... 계속 입력후 마지막 경로는 /usr/local/bin/redis-server 처럼 풀 경로+파일명을 적어준다.

 

 -설정파일 수정: /etc/redis/6379.conf

  > 보안상 protected-mode 가 기본인데 bind 주소'로'만 접속 허용된다. 서버(redis) 내부ip나 외부ip주소가 1.2.3.4 이면 conf 파일에서 'bind 1.2.3.4 127.0.0.1 ::1' 이런식으로 적어준다. 이 모드에서 패스워드는 필요없다.

*클러스터 오류때문에 반드시 127.0.0.1과 ::1이 마지막이어야 합니다~ local ip(v4 & v6)를 적지 않으면 무한 waiting이 생길 수 있습니다.

 

 -수정 후 'systemctl redis_xxxx enable && systemctl redis_xxxx start' 해서 서비스 등록

 -'./redis-cli -h 127.0.0.1 -p 포트번호'  입력해서 접속에러 안뜨면 성공. selinux 포트도 막혀있다면 open해줘야 함..(semanage port -l | grep redis 하면 기본 포트가 있을것이다.. 만약 7000포트를 쓴다면 17000,27000포트도 selinux에 추가해주자. 노드간 통신에 쓰인다. 마스터노드만 열어주면됨..)

 -bind에서 ip 1.2.3.4로 추가해준경우, './redis-cli -h 1.2.3.4 -p 포트번호' 로도 해서 외부에서 접속되는지 확인.

 

 -외부 접속 아이피 방화벽 설정: firewalld 필요.

 

$ firewall-cmd --zone=public --add-service=redis --permanent
$ vi /usr/lib/firewalld/services/redis.xml
 > 포트번호가 변경되었다면 기존 포트번호(6379)를 변경된 포트번호로 수정
$ firewall-cmd --reload

 

 

2. Spring 설정 (Spring boot 2.x + maven)

  (참조: https://docs.spring.io/spring-session/docs/current/reference/html5/#httpsession-redis)

 -Spring maven 'pom.xml' 에 추가 (무난한 lettuce connection을 사용하기로 한다. 다른거 비추.)

 

1
2
3
4
5
6
7
8
9
        <dependency>
            <groupId>org.springframework.session</groupId>
            <artifactId>spring-session-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>io.lettuce</groupId>
            <artifactId>lettuce-core</artifactId>
        </dependency>
 
cs

 

 

 -application.properties에 추가

 

1
2
3
spring.session.store-type=REDIS
spring.redis.host=192.168.0.123
spring.redis.port=6379
cs

 

-혹시 클러스터를 쓰게된다면.. 다음을 추가. IP:port는 마스터노드가 있는 host목록임..

spring.redis.cluster.nodes=127.0.0.1:6379,127.0.0.1:6380,127.0.0.1:6381, ...

 

 

 

3. 클러스터 (센티넬 아님. 센티넬은 별도 설치)

일단, 3개 장비를 사용한다고 하면 각각 위와 같이 구성한다. 그리고 각 서버를 마스터로 한다고 하면, 레플리카(슬레이브)가 각 1개이상 있어야 하므로. 여기선 마스터2,마스터3(각 다른 서버)랑 슬레이브2,슬레이브3으로 서비스를 가동한다. spring boot에서 처리할때는 마스터노드만 입력하면 된다.. 마스터랑 슬레이브는 3개이상 필요하니 총 6개 이상 노드가 필요함.. 그 이하는 생성이 안됨..

 

예로, 서버1에서 6379 port로 했다면 위 참고해서 6479포트도 서비스를 설치해준다. 서버2, 3도 마찬가지다.

그리고 4개의 서비스에 대해 /etc/redis/포트번호.conf 에서 다음을 주석 해제하거나 수정해준다

cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000
appendonly yes

 

설정 후 반드시 서비스를 다시 시작해준다. (systemctl restart redis_xxxx)

그 전에, 방화벽에서 마스터노드 포트를 다 열어준다.(노드당 2개포트=> 즉, 6379이면 16379까지.) 이왕이면 redis자체 bind 기능도 있지만 trusted-zone에 서로 ip 추가해서 등록되지 않은 ip 접근 자체를 차단하자.

 

그리고 클러스터 생성하기.. 뒤에 레플리카는 기존 slave다.. 마스터1당 레플리카1로 설정하면 자동 master-slave로 구성됨..

$ redis-cli --cluster create 127.0.0.1:6379 192.168.0.2:6379 192.168.0.3:6379 127.0.0.1:6479 192.168.0.2:6479 192.168.0.3:6479 --cluster-replicas 1

 

이러면 포트번호,ip등으로 알아서 마스터/레플리카를 나눠준다. 그대로 진행할거면 yes. 만일, 마스터랑 레플리카랑 같은 ip로 묶이면 경고를 띄운다. 즉, 기본적으로 마스터/레플리카가 같은서버에 있다가 host가 죽어버리면 redis가 무응답상태가 되기때문에 다른 호스트로 분리하는듯 하니 자동으로 해준대로 진행하시길..

 

"yes"를 치면 클러스터 조인을 기다린다. 혹시라도 실패하면 각 서버에서 아래를 한번씩 실행해주면 됨.. flushall은 혹시 모르니 해주는것임.. 멈춰있으면 위에 bind 설정을 다시 참고.(127.0.0.1이 젤 마지막에)

$ redis-cli --cluster call 127.0.0.1:포트번호 flushall
$ redis-cli --cluster call 127.0.0.1:포트번호 cluster reset

 

설정 완료 후 상태 체크는 다음 명령으로.

$ redis-cli --cluster check 127.0.0.1:포트번호

 

끝..

Comments