Nomad + Spring Boot App 권장 설정

By | 2021년 8월 20일
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

답글 남기기