정적 호스트 볼륨 사용

정적 호스트 볼륨 사용 (Use static host volumes)

정적 호스트 볼륨(static host volumes)은 Nomad 클러스터 안에서 실행되는 상태 저장 워크로드의 스토리지를 관리할 수 있어요. 이 튜토리얼은 영구 저장을 위해 정적 호스트 볼륨을 사용하는 MySQL 워크로드를 배포하는 과정을 안내해요. 동적 호스트 볼륨과 달리, 정적 호스트 볼륨은 Nomad 클라이언트 구성에 정의되며 그 수명 주기는 Nomad 외부에서 관리돼요.

출처: 문서

본문

정적 호스트 볼륨은 exec, java, docker 같은 Nomad 드라이버에서 사용할 수 있는 리소스를 지정하는 워크로드에 구애받지 않는(workload-agnostic) 방법을 제공해요. 자세한 내용은 host_volume 명세를 참조해요. Nomad는 스케줄링 과정에서 호스트 볼륨을 인지하므로, 특정 클라이언트에서 정적 호스트 볼륨을 사용할 수 있는지에 따라 스케줄링 결정을 내릴 수 있어요.

이것은 Docker 볼륨에 대한 Nomad 지원과 대조할 수 있어요. Docker 볼륨은 Nomad 외부에서 관리되고 Nomad 스케줄러가 이를 인지하지 못하기 때문에, Docker 볼륨은 모든 클라이언트에 배포되거나 운영자가 볼륨이 존재하는 위치를 스케줄러에 알리기 위해 수동으로 유지 관리하는 추가 제약(constraint)을 사용해야 해요.

사전 요구 사항 (Prerequisites)

이 가이드에서 설명하는 작업을 수행하려면 Consul이 설치된 Nomad 환경이 필요해요. Consul은 서비스 검색에 사용되며 정적 호스트 볼륨에는 필요하지 않아요. 이 Terraform 환경을 사용해 샌드박스 환경을 구성할 수 있어요. 이 튜토리얼은 서버 노드 1개와 클라이언트 노드 3개로 구성된 클러스터를 가정해요.

참고

이 튜토리얼은 데모용이며 단일 서버 노드만 가정해요. 프로덕션 구성은 레퍼런스 아키텍처를 참조해요.

MySQL 클라이언트 설치 (Install the MySQL client)

MySQL 클라이언트를 사용해 MySQL 데이터베이스에 연결하고 데이터를 확인할 거예요. Nomad 클라이언트의 포트 3306에 접근할 수 있는 노드에 설치되어 있는지 확인해요:

Ubuntu:

CentOS:

macOS via Homebrew:

정적 호스트 볼륨 만들기 (Build the static host volume)

대상 디렉터리 만들기 (Create a target directory)

클러스터의 Nomad 클라이언트 노드에서 MySQL 데이터를 유지하는 데 사용할 디렉터리를 만들어요. 이 예시에서는 /opt/mysql/data 디렉터리를 만들어 보겠어요.

Nomad 클라이언트가 root 사용자로 실행되지 않는다면 이 폴더의 소유자를 변경해야 할 수도 있어요.

클라이언트 구성 (Configure the client)

이 Nomad 클라이언트의 Nomad 구성을 편집해 정적 호스트 볼륨 정의를 만들어요.

Nomad 구성의 client 블록에 host_volume 블록을 추가해요:

    path      = "/opt/mysql/data"
    read_only = false
  }

이 변경 사항을 저장한 다음 이 클라이언트의 Nomad 서비스를 다시 시작해 정적 호스트 볼륨을 활성화해요. 클라이언트에 있는 동안 아래와 같이 nomad node status 명령을 사용해 호스트 볼륨이 구성됐는지 확인할 수 있어요:

ID           = 12937fa7
Name         = ip-172-31-15-65
Class        = <none>
DC           = dc1
Drain        = false
Eligibility  = eligible
Status       = ready
Host Volumes = mysql
Drivers      = docker,exec,java,mock_driver,raw_exec,rkt
...

MySQL 배포 (Deploy MySQL)

작업 파일 만들기 (Create the job file)

이제 스토리지에 정적 호스트 볼륨을 사용할 수 있는 MySQL 데이터베이스를 배포할 준비가 됐어요. mysql.nomad.hcl이라는 파일을 만들고 다음 내용을 제공해요:

  datacenters = ["dc1"]
  type        = "service"

  group "mysql-server" {
    count = 1

    volume "mysql" {
      type      = "host"
      read_only = false
      source    = "mysql"
    }

    restart {
      attempts = 10
      interval = "5m"
      delay    = "25s"
      mode     = "delay"
    }

    task "mysql-server" {
      driver = "docker"

      volume_mount {
        volume      = "mysql"
        destination = "/var/lib/mysql"
        read_only   = false
      }

      env = {
        "MYSQL_ROOT_PASSWORD" = "password"
      }

      config {
        image = "hashicorp/mysql-portworx-demo:latest"

        ports = ["db"]
      }

      resources {
        cpu    = 500
        memory = 1024
      }

      service {
        name = "mysql-server"
        port = "db"

        check {
          type     = "tcp"
          interval = "10s"
          timeout  = "2s"
        }
      }
    }
    network {
      port "db" {
        static = 3306
      }
    }
  }
}

위 작업 명세서에 대한 참고 사항 (Notes about the above job specification)

  • 서비스 이름은 mysql-server이며 나중에 데이터베이스에 연결하는 데 사용할 거예요.
  • read_only 인수는 읽기 전용 볼륨 마운트를 만들기 위해 변경해야 하는 모든 위치를 강조하기 위해 볼륨 관련 스탠자 전체에 제공돼요. 자세한 내용은 host_volume, volume, volume_mount 명세를 참조해요.
  • 메모리가 낮은 인스턴스의 경우 클러스터의 사용 가능한 리소스와 조화를 이루도록 resources 스탠자의 요청 메모리를 줄여야 할 수도 있어요.

작업 실행 (Run the job)

이전 단계에서 만든 작업 파일을 다음 명령으로 등록해요:

==> Monitoring evaluation "aa478d82"
    Evaluation triggered by job "mysql-server"
    Allocation "6c3b3703" created: node "be8aad4e", group "mysql-server"
    Evaluation status changed: "pending" -> "complete"
==> Evaluation "aa478d82" finished with status "complete"

할당 상태를 확인하고 작업이 실행 중인지 확인해요:

ID            = mysql-server
...
Summary
Task Group    Queued  Starting  Running  Failed  Complete  Lost
mysql-server  0       0         1        0       0         0

MySQL에 데이터 쓰기 (Write data to MySQL)

MySQL 연결 (Connect to MySQL)

(앞서 설치한) mysql 클라이언트를 사용해 데이터베이스에 연결하고 정보에 접근해요:

이 데모 데이터베이스의 비밀번호는 password예요.

참고

이 튜토리얼은 데모용이며 데이터베이스 비밀번호 보안에 대한 모범 사례를 따르지 않아요. 자세한 내용은 비밀번호 보안 유지를 참조해요.

이 클러스터에는 Nomad와 함께 Consul이 설치되어 있으므로 작업 파일에서 작업에 등록한 mysql-server 서비스 이름을 사용해 연결할 수 있어요.

테스트 데이터 추가 (Add test data)

데이터베이스에 연결한 후 items 테이블이 존재하는지 확인해요:

+--------------------------+
| Tables_in_itemcollection |
+--------------------------+
| items                    |
+--------------------------+
1 row in set (0.00 sec)

다음 명령으로 이 테이블의 내용을 표시해요:

+----+----------+
| id | name     |
+----+----------+
|  1 | bike     |
|  2 | baseball |
|  3 | chair    |
+----+----------+
3 rows in set (0.00 sec)

이제 이 테이블에 데이터를 추가해요(Nomad에서 데이터베이스를 종료하고 다시 시작한 후에도 이 데이터는 그대로 있어야 해요):

다른 값으로 INSERT INTO 명령을 원하는 만큼 실행해요.

mysql> INSERT INTO items (name) VALUES ('keyboard');

완료되면 exit를 입력하고 Nomad 클라이언트 명령줄로 돌아가요:

Bye

데이터베이스 작업 제거 (Destroy the database job)

다음 명령을 실행해 클러스터에서 MySQL 작업을 중지하고 제거해요:

==> Monitoring evaluation "6b784149"
    Evaluation triggered by job "mysql-server"
    Evaluation status changed: "pending" -> "complete"
==> Evaluation "6b784149" finished with status "complete"

클러스터에서 실행 중인 작업이 없는지 확인해요:

No running jobs

더 고급 사례에서 정적 호스트 볼륨을 지원하는 디렉터리는 NFS 같은 마운트된 네트워크 파일 시스템이나 GlusterFS나 SeaweedFS 같은 클러스터 인식 파일 시스템일 수 있어요. 이는 노드 오류 발생 시 더 복잡하고 자동적인 장애 복구 시나리오를 가능하게 해요.

다시 배포하고 확인 (Re-deploy and verify)

앞서 만든 mysql.nomad.hcl 작업 파일을 사용해 데이터베이스를 Nomad 클러스터에 다시 배포해요.

==> Monitoring evaluation "61b4f648"
    Evaluation triggered by job "mysql-server"
    Allocation "8e1324d2" created: node "be8aad4e", group "mysql-server"
    Evaluation status changed: "pending" -> "complete"
==> Evaluation "61b4f648" finished with status "complete"

MySQL에 다시 연결하면 데이터베이스를 제거하기 전에 추가한 정보가 여전히 존재하는지 확인할 수 있어요:

+----+----------+
| id | name     |
+----+----------+
|  1 | bike     |
|  2 | baseball |
|  3 | chair    |
|  4 | glove    |
|  5 | hat      |
|  6 | keyboard |
+----+----------+
6 rows in set (0.00 sec)

정리 (Clean up)

이 가이드를 완료한 후에는 다음 정리 단계를 수행해야 해요:

  • mysql-server 작업을 중지하고 제거해요.
  • Nomad 클라이언트 구성에서 host_volume "mysql" 스탠자를 제거하고 해당 클라이언트에서 Nomad 서비스를 다시 시작해요.
  • /opt/mysql/data 폴더와 더 이상 필요하지 않은 디렉터리 트리를 제거해요.

요약 (Summary)

이 가이드에서는 클라이언트 로컬 디렉터리를 사용해 Nomad 클라이언트에 정적 호스트 볼륨을 구성했어요. 이 볼륨을 Docker MySQL 컨테이너에 마운트하는 작업을 만들고 작업 수명을 넘어 지속되는 데이터를 썼어요.

더 알아보기 (Learn more)