Spring Session using Redis 5.0.10 in Spring Boot 2.x (with cluster)
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:포트번호
끝..