이 블로그에서는 간단한 Java 애플리케이션이 데이터베이스나 서비스로서의 데이터베이스 (DBaaS) DC/OS에서 서비스 검색을 사용합니다.
왜 서비스 검색인가?
애플리케이션은 일반적으로 애플리케이션 서버, 데이터베이스, 웹 서버, 캐싱 및 메시징 서버와 같은 여러 구성 요소로 이루어져 있습니다. 일반적으로 애플리케이션의 필요에 따라 각 구성 요소의 여러 복제본이 실행됩니다. 컨테이너 오케스트레이션 프레임워크를 사용하여 이 애플리케이션을 배포한다는 것은 각 복제본이 컨테이너로 실행된다는 것을 의미합니다. 따라서 애플리케이션은 일반적으로 멀티 컨테이너 애플리케이션으로 배포됩니다.
각 컨테이너에는 수명 기간 동안 고유한 IP 주소가 할당됩니다. 그러나 컨테이너는 임시적이며 오케스트레이션 프레임워크에 의해 다른 호스트에서 종료되고 다시 예약될 수 있습니다. 이 경우 일반적으로 컨테이너에는 다른 IP 주소가 할당됩니다. 즉, 애플리케이션 서버에 배포된 애플리케이션은 데이터베이스의 IP 주소에 의존할 수 없습니다. 이 경우 서비스 검색이 필요합니다.
따라서 컴포넌트의 여러 복제본에는 논리적 이름이 할당됩니다. 예를 들어 웹
모든 애플리케이션 서버 컨테이너와 db
를 모든 데이터베이스 컨테이너에 추가합니다. 이제 애플리케이션은 논리적 서비스 이름을 사용하여 데이터베이스 컨테이너와 통신할 수 있습니다. 이를 통해 데이터베이스 컨테이너는 클러스터의 어느 곳에서나 스케줄을 재조정할 수 있으며 동적으로 확장 및 축소할 수도 있습니다.
애플리케이션 서버와 데이터베이스 서버의 단일 인스턴스를 사용하여 DC/OS에서 이를 어떻게 수행할 수 있는지 살펴보겠습니다. 이 블로그에서는 애플리케이션 서버에는 WildFly를, 데이터베이스에는 Couchbase를 사용합니다.
DC/OS를 사용하는 Mesos의 Couchbase 클러스터 설정 방법에 대한 자세한 내용은 카우치베이스 클러스터를 설정합니다.
이 블로그에서는 다음과 같은 주요 단계를 사용합니다:
- DC/OS 클러스터 설정
- 마라톤 애플리케이션 정의
- 애플리케이션 배포
이 블로그에 사용된 전체 소스 코드는 다음 링크에서 확인할 수 있습니다. github.com/arun-gupta/dcos-java-database.
많은 분들께 감사드립니다. 언터스타인 Maven 플러그인을 만들고 DC/OS의 내부 작동을 이해하는 데 도움을 주신 분들께 감사드립니다.
DC/OS 클러스터 설정
DC/OS 클러스터는 다음을 사용하여 쉽게 만들 수 있습니다. CloudFormation 템플릿. 시스템 요구 사항, 스크린샷 및 설정을 포함한 자세한 지침은 AWS에 DC/OS 설치하기에서 확인할 수 있습니다.
CloudFormation 출력은 다음과 같습니다:
키에 표시된 값을 메모해 둡니다. DnsAddress
그리고 PublicSlaveDnsAddress
. 첫 번째 키의 값은 DC/OS GUI에 액세스하는 데 사용할 수 있으며 다음과 같습니다:
CLI에 설명된 대로 DC/OS CLI를 구성합니다. 간단히 말해, 다음 명령이 사용됩니다:
dcos config set core.dcos_url http://${DnsAddress}
교체${DnsAddress}
를 CloudFormation 출력의 해당 값으로 대체합니다.dcos 인증 로그인
dcos config show core.dcos_acs_token
. 아직 완료되지 않은 경우 다음에서 리포지토리를 복제합니다. github.com/arun-gupta/dcos-java-database. 새 파일 만들기.dcos-token
를 클릭하고 이 파일에 명령의 출력을 복사합니다.dcos 패키지 설치 마라톤-lb
마라톤 애플리케이션 정의
마라톤 프레임워크는 DC/OS에서 컨테이너를 스케줄링하는 데 사용됩니다. 마라톤 애플리케이션은 애플리케이션 정의를 제공하여 정의할 수 있습니다.
앞서 언급했듯이 이 블로그에서는 간단한 Java 애플리케이션이 데이터베이스와 통신하는 방법을 보여드리겠습니다. 여기서는 WildFly에 배포된 Java EE 애플리케이션을 사용하고 데이터베이스로 Couchbase를 사용하겠습니다. 애플리케이션 정의는 다음과 같습니다:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
{ "id":"/웹앱", "apps":[ { "id":"데이터베이스", "cpus":4, "mem":4096, "인스턴스":1, "컨테이너":{ "type":"DOCKER", "docker":{ "이미지":"아룽업타/카우치베이스:여행", "네트워크":"USER" } }, "ipAddress":{ "네트워크 이름":"dcos" } }, { "id":"웹", "종속성":[ "/웹앱/데이터베이스" ], "cpus":2, "mem":4096, "인스턴스":1, "컨테이너":{ "type":"DOCKER", "docker":{ "이미지":"arungupta/wildfly-couchbase-javaee:travel", "네트워크":"USER", "portMappings":[ { "hostPort":0, "컨테이너 포트":8080, "프로토콜":"tcp" } ] } }, "ipAddress":{ "네트워크 이름":"dcos" }, "env":{ "couchbase_uri":"데이터베이스-웹앱.마라톤.컨테이너ip.dcos.thisdcos.디렉토리" }, "레이블":{ "haproxy_0_vhost":"DCOS-PublicSlaveLo-DD2EGGFVCJA0-1604955948.us-west-1.elb.amazonaws.com", "haproxy_group":"외부" } } ] } |
이 애플리케이션 정의의 핵심은 무엇인가요?
- 애플리케이션에는 두 개의 컨테이너가 있습니다:
데이터베이스
그리고웹
. 웹 컨테이너는 다음을 사용하여 정의된 데이터베이스 컨테이너에 대한 종속성이 있습니다.종속성
속성입니다. 데이터베이스
컨테이너 용도아룽업타/카우치베이스:여행
도커 이미지. 이 이미지는 다음에서 생성됩니다. github.com/arun-gupta/couchbase-javaee/tree/master/couchbase. 카우치베이스 기본 이미지를 사용하고 Couchbase REST API 를 사용하여 데이터베이스를 미리 구성할 수 있습니다. 샘플 버킷도 데이터베이스에 로드됩니다.웹
컨테이너 용도아룽업타/와일드플라이-카우치베이스-자바예:여행
이미지. 이 이미지는 다음에서 생성됩니다. github.com/arun-gupta/couchbase-javaee/blob/master/Dockerfile. 이 앱은 WildFly에 번들로 제공되는 Java EE 7 애플리케이션입니다. 이 앱은COUCHBASE_URI
를 환경 변수로 설정하여 Couchbase 데이터베이스에 연결합니다. 이 환경 변수의 값은 DNS 서비스 검색을 사용하도록 구성되며 가상 네트워크에 설명된 대로 파생됩니다.
값을 변경해야 합니다. haproxy_0_vhost
의 값과 일치하도록 ${공용슬레이브Dns주소}
를 출력합니다. 레이블 haproxy_0_vhost
는 가상 호스트가 있는 외부 로드 밸런서에 Docker 컨테이너(이 경우 WildFly 애플리케이션 서버)를 노출하도록 Marathon-LB에 지시합니다. 이 경우 0
는 0부터 시작하는 서비스포트 인덱스에 해당합니다. 서비스포트 정의가 여러 개 있는 경우 0, 1, 2 등으로 반복합니다. 내부 및 외부 로드 밸런싱 앱 배포에 대한 자세한 내용은 마라톤-lb를 구성하는 방법에 대한 자세한 내용을 참조하세요.
서비스 검색 및 로드 밸런싱에서는 DC/OS의 서비스 검색 및 로드 밸런싱에 대한 자세한 내용을 제공합니다.
Maven을 사용하여 애플리케이션 배포
애플리케이션은 다음을 사용하여 배포할 수 있습니다. dcos-maven-플러그인.
플러그인처럼 보입니다:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<plugin> <groupId>dcos</groupId> <artifactId>dcos-maven-플러그인</artifactId> <version>0.2</version> <configuration> <dcosUrl>http://DCOS-ElasticLoadBa-1TH4TXIU5P783-1163025470.us-west-1.elb.amazonaws.com/</dcosUrl> <배포 가능그룹</deployable> <ignoreSslCertificate>true</ignoreSslCertificate> </configuration> <executions> <execution> <id>dcos:deploy</id> <phase>설치</phase> <goals> <goal>배포</goal> </goals> 실행> </executions> </plugin> |
이 조각의 주요 요점은 다음과 같습니다:
- 플러그인 버전은 0.2입니다. 이는 플러그인이 아직 개발 초기 단계에 있음을 나타냅니다.
dcosUrl
의 값은${DnsAddress}
키를 입력합니다. 이 주소는 애플리케이션 배포에 사용됩니다.<배포 가능
요소는 앱, 그룹 또는 포드 등 다양한 유형의 배포를 가능하게 합니다. 이 요소는 플러그인에 대한 힌트이며 향후 버전에서 Marathon API가 통합됨에 따라 사라질 가능성이 높습니다. 팔로우 #11 에서 자세한 내용을 확인하세요.
플러그인에 대한 기타 세부 정보 및 구성은 다음 링크에서 확인할 수 있습니다. dcos-maven-플러그인.
애플리케이션을 배포합니다:
1 |
mvn 설치 |
다음과 같은 출력이 표시됩니다:
1 2 3 4 5 6 7 8 |
[정보] --- dcos-maven-플러그인:0.2:배포 (dcos:배포) @ dcos-자바-데이터베이스 --- [정보] 정보 에 실행 DC/OS 배포 [정보] 앱 정의: /사용자/arungupta/작업 공간/dcos-자바-데이터베이스/앱-정의.json [정보] dcos 토큰: /사용자/arungupta/작업 공간/dcos-자바-데이터베이스/.dcos-토큰 [정보] dcos URL: http://DCOS-ElasticLoadBa-1TH4TXIU5P783-1163025470.us-west-1.elb.amazonaws.com/ [정보] 무시 ssl 인증서: true [정보] 배포 가능: 그룹 [정보] 응답 에서 DC/OS [200] {"버전":"2017-03-07T13:27:49.970Z","deploymentId":"dbc80f96-28cb-4040-8d0d-78452e461ec1"} |
다음은 DC/OS 콘솔의 업데이트된 출력 중 일부입니다.
첫 번째 업데이트된 서비스 탭:
서비스 내 두 가지 애플리케이션:
데이터베이스 애플리케이션에는 하나의 작업이 있습니다:
데이터베이스 작업 상태:
데이터베이스 작업의 로그입니다:
서버 구성을 위한 Couchbase REST API의 출력을 보여줍니다.
웹 작업 상태:
웹 작업의 로그:
Java EE 애플리케이션이 성공적으로 배포되었음을 보여줍니다.
애플리케이션에 액세스합니다:
1 |
curl http://DCOS-PublicSlaveLo-DD2EGGFVCJA0-1604955948.us-west-1.elb.amazonaws.com/airlines/resources/airline |
주소는 키의 값입니다. ${공용슬레이브Dns주소}
를 추가할 수 있습니다. 예를 들어 다음과 같이 형식이 지정된 출력은 jq처럼 보입니다:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
[ { "travel-sample": { "country": "미국", "iata": "Q5", "콜사인": "MILE-AIR", "name": "40마일 에어", "icao": "MLA", "id": 10, "type": "항공사" } }, { "travel-sample": { "country": "미국", . . . "icao": "RLA", "id": 1203, "type": "항공사" } } ] |
그거예요!
앞서 언급했듯이 이 블로그에 사용된 전체 소스 코드는 다음 링크에서 확인할 수 있습니다. github.com/arun-gupta/dcos-java-database.
이 블로그에서는 간단한 Java 애플리케이션이 DC/OS에서 서비스 검색을 사용하여 데이터베이스와 통신하는 방법을 보여드렸습니다.
자세한 내용은 여기에서 확인하세요:
[...] 출처: http://www.couchbase.com/service-discovery-java-database-dcos/ […]
[...] DC/OS에서 Java 및 데이터베이스 애플리케이션을 사용한 서비스 검색은 서비스 검색이 멀티 컨테이너 애플리케이션에 중요한 측면인 이유를 설명합니다. 이 블로그에서는 DC/OS에서 이를 수행하는 방법도 설명합니다. [...]
[...] DC/OS에서 Java 및 데이터베이스 애플리케이션을 사용한 서비스 검색은 서비스 검색이 멀티 컨테이너 애플리케이션에 중요한 측면인 이유를 설명합니다. 이 블로그에서는 DC/OS에서 이를 수행하는 방법도 설명합니다. [...]
안녕하세요, 아룬.
서비스 등록을 위해 하프록시와 같은 로드밸런서를 사용하면 안 되는 이유가 궁금합니다. 하프록시는 요청을 CS/OS에서 사용 가능한 서비스 중 하나에 전달할 논리적 서비스 이름을 게시합니다. 서비스 등록이 왜 그렇게 번거로울까요? 동적이고, 확장 가능하며, 기술적으로 투명하기 때문입니다.
감사합니다, Alexander