클러스터란, 각기 다른 서버들을 하나로 묶어서 하나의 시스템으로 관리하는 것이다.
클러스터화된 시스템을 이용하면, 어느 하나의 서버가 장애가 발생하게 되더라도 다른 서버로 연결이 되어 중단되지 않고 사이트를 운영할 수 있게 된다.
이번 글에서는 Spring을 이용하여 어플리케이션을 3개 만들고, 각기 다른 포트로 배포하여 Nginx에서 클러스터로 관리하는 과정을 보여줄 것이다.
이번 글에서 진행할 과정을 그림으로 표현하면 아래와 같다.
간단하게 프로젝트를 위한 환경을 만들어준다.
server.port=8080
3개의 포트를 각각 8080, 8081, 8082로 만들어준다.
나중에 현재 어플리케이션이 어떤 포트인지 확인하기 위한 healthCheck API를 만들어준다.
import lombok.RequiredArgsConstructor;
import org.springframework.core.env.Environment;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequiredArgsConstructor
public class HealthCheckController {
private final Environment environment;
@GetMapping("/healthCheck")
public String healthCheck() {
return "현재 실행중이 포트번호는 " + environment.getProperty("local.server.port") + " 입니다.";
}
}
로컬에서 테스트하면 아래와 같이 나오게 된다.
- t2.medium 서버 인스턴스 생성(EC2)
- 서버 내부에 git, sdkman, Nginx 설치
- git clone을 이용하여 프로젝트 3번 가져오고, 각각 포트 변경
- java 11 설치
- 각 프로젝트 build 후, nohup을 이용하여 서비스 실행
생성관련된 내용은 기재하지 않았다.
인스턴스를 생성하여 서버에 각 어플리케이션을 넣는다.
위와같이 각 포트에 다른 서비스를 운영하고 있다.
본격적으로 클러스터링을 하기 위한 Nginx 설정이다.
먼저, 설정 파일을 따로 만들어서 적용시키기 위해 nginx.conf 설정파일에 경로를 추가해준다.
cd /etc/nginx
sudo vi nginx.conf
http {
** 상위 각 설정들 **
# Load modular configuration files from the /etc/nginx/conf.d directory.
# See http://nginx.org/en/docs/ngx_core_module.html#include
# for more information.
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/cluster/*.conf; # 추가 부분
** 이후 설정들 **
}
이후에 따로 설정할 추가파일을 생성한다.
sudo mkdri cluster
cd cluster
sudo vi cluster.conf
해당 설정파일에 로드밸런스 관련 포트설정을 진행한다.
upstream cluster_group_1 {
ip_hash;
server 127.0.0.1:8080 weight=2 max_fails=6;
server 127.0.0.1:8081;
server 127.0.0.1:8082;
}
server {
listen 80;
listen [::]:80;
server_name _;
root /usr/share/nginx/html;
location / {
sendfile off;
proxy_pass http://cluster_group_1;
proxy_redirect default;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_cache_bypass $http_upgrade;
proxy_max_temp_file_size 0;
}
}
http://cluster_group_1;
추가적으로 도메인 연결을 하고 싶다면 Https 적용하는 법 을 참고하면 된다.
테스트를 하면 아래와 같은 방식으로 동작하게 된다.