Table of Contents
Nomad + Spring Boot App 권장 설정
목표
Nomad 에서 Spring Boot App 실행을 위한 권장 설정을 찾아봅니다.
필요 툴 설치
AWS AMI 인스턴스를 생성합니다.
메모리는 2G 로 합니다.
내 IP 로부터의 모든 접속을 허용하도록 보안그룹을 설정해 줍니다.
JDK, Docker 와 스트래스 툴 hey 를 설치합니다.
sudo yum install java-11-amazon-corretto-headless -y
java -version
sudo yum install docker -y
docker -v
sudo service docker start
sudo systemctl enable docker.service
wget https://hey-release.s3.us-east-2.amazonaws.com/hey_linux_amd64
chmod 777 hey_linux_amd64
sudo mv hey_linux_amd64 /usr/bin/hey
hey -help
Consul 설치
sudo mkdir -p /etc/consul.d
sudo mkdir -p /opt/consul
sudo vi /etc/consul.d/consul.hcl
-----------------------------------------
datacenter = "dc1"
advertise_addr = "127.0.0.1"
client_addr = "0.0.0.0"
data_dir = "/opt/consul"
server = true
bootstrap_expect = 1
ui = true
telemetry {
prometheus_retention_time = "30s"
}
-----------------------------------------
sudo docker run -d --name consul \
-p 8500:8500 -p 8600:8600 -p 8600:8600/udp \
-v /opt/consul:/opt/consul \
-v /etc/consul.d:/etc/consul.d \
--restart=always \
consul
Nomad 설치
아래 명령으로 nomad 를 설치해 줍니다.
wget https://releases.hashicorp.com/nomad/1.1.3/nomad_1.1.3_linux_amd64.zip
unzip nomad_1.1.3_linux_amd64.zip
sudo mv nomad /usr/bin/
nomad version
테스트용이므로, 한 서버에 Server/Client 를 한번에 활성화 합니다.
sudo mkdir -p /etc/nomad.d
sudo mkdir -p /opt/nomad
sudo vi /etc/nomad.d/nomad.hcl
-----------------------------------------
datacenter = "dc1"
data_dir = "/opt/nomad/data"
bind_addr = "0.0.0.0"
server {
enabled = true
bootstrap_expect = 1
}
client {
enabled = true
}
-----------------------------------------
nomad client 는 root 권한이 필요합니다.
sudo nomad agent -config=/etc/nomad.d/nomad.hcl
앱 실행을 위한 최소 메모리 찾기
hello 설정
vi hello.nomad
------------------------------
job "hello" {
datacenters = ["dc1"]
type = "service"
group "helloGroup" {
network {
# port "http" {}
port "https" {}
port "lb" { static = 8080 }
}
count = 1
# Define a task to run
task "helloTask" {
driver = "java"
config {
jar_path = "local/TestPublic-0.0.2-SNAPSHOT.jar"
}
env {
PORT = "${NOMAD_PORT_http}"
NODE_IP = "${NOMAD_IP_http}"
}
service {
# name = "helloService"
port = "lb"
port = "http"
check {
type = "http"
path = "/hello" # health check 용 url
interval = "2s"
timeout = "2s"
}
}
resources {
cpu = 500 # 500 Mhz
memory = 256 # 256 MB
}
# 원격에서 다운받아야 합니다.
artifact {
source = "https://github.com/skyer9/TestPublic/raw/master/TestPublic-0.0.2-SNAPSHOT.jar"
}
}
}
}
------------------------------
nomad run hello.nomad
스트레스 테스트 하기
5분간 200개의 동시 커넥션을 하도록 합니다.
hey -z 5m -c 200 http://172.31.5.55:8080/hello
Tomcat Thread 가 최대 200개가 생성되고, Thread 하나당 1M 의 메모리가 할당됩니다.
즉, Hello World 앱을 위한 메모리 + 200M 를 할당하는 것이 좋습니다.
Spring Boot 권장 설정
JDK, Spring Boot 버전은 최신 버전으로
JDK 11 이상의 버전이 권장되고, Spring Boot 는 2.3.0 이상의 버전으로 합니다.
-Xms -Xmx 사용안함
Nomad 에서 메모리를 할당하면, JDK 가 할당받은 메모리를 기반으로 최적의 Heap 메모리를 설정합니다.
따라서, 별도의 설정을 하기보다는 Nomad 메모리 설정만 하고 -Xms -Xmx
는 JDK 가 자동할당하도록 두는 것이 최적의 설정이 됩니다.
Graceful Shutdown
Spring Boot 2.3.0 부터 추가된 설정입니다.
아래 설정만으로 셧다운시 오류 발생을 없앨 수 있습니다.
application.yml
server:
shutdown: graceful
vi hello.nomad
------------------------------
job "hello" {
datacenters = ["dc1"]
type = "service"
group "helloGroup" {
network {
# port "http" {}
port "https" {}
port "lb" { static = 8080 }
}
count = 1
# Define a task to run
task "helloTask" {
driver = "java"
config {
jar_path = "local/TestPublic-0.0.4-SNAPSHOT.jar"
}
env {
PORT = "${NOMAD_PORT_http}"
NODE_IP = "${NOMAD_IP_http}"
}
service {
name = "helloService"
port = "lb"
# port = "http"
check {
type = "http"
path = "/health" # health check 용 url
interval = "2s"
timeout = "2s"
}
}
resources {
cpu = 500 # 500 Mhz
memory = 448 # 448 MB
}
# 원격에서 다운받아야 합니다.
artifact {
source = "https://github.com/skyer9/TestPublic/raw/master/TestPublic-0.0.4-SNAPSHOT.jar"
}
}
}
}
------------------------------
nomad stop -purge hello
nomad run hello.nomad