닷넷코어 어플리케이션을 리눅스 도커환경으로 클러스터화 하는 실험이며
최종목표는 단일지점 병목이 없는 분산처리 어플리케이션 작성입니다.
클러스터 시스템을 직접 작성한다고 구동하고 디버깅하는것은 어려운 일이지만
비주얼 스튜디오 도커툴의 도움을 받아보겠습니다.
컨셉
- 순수 로컬일때 스탠드 Alone으로 모든기능이 작동됩니다.
- 로컬 Docker-Compose를 통해 클러스터 시스템을 디버깅할수 있습니다.
- Docker-Compose로 구성되고 작동되는 서비스는 쿠버네티스 또는 클라우드로 확장에 용이합니다.
Application LayOut
프로젝트는 2개이지만, 롤을 분리하여 4개의 어플리케이션을 띄운후
VisualStudio 내에서 작동및 디버깅을 하는 모습입니다.
- LightHouse : 아파치의 주키퍼와 유사한 역활을 하며, 클러스터에 조인할 노드들이 대상서비스를 찾을수 있게 디스커버리역활을 합니다.
- NetCoreCluser : 분산처리 노드 / 단일 노드등 여러가지 기능을 가질수 있으며 작동방법은 띄우는시점 결정되어 클러스터에 조인됩니다.
도커 프로젝트 추가
VisualStudio에서 도커툴을 지원함에 따라, 도커화된 프로젝트를 빌드및 디버깅가능합니다.
<?xml version="1.0" encoding="utf-8"?> <Project ToolsVersion="15.0" Sdk="Microsoft.Docker.Sdk"> <PropertyGroup Label="Globals"> <ProjectVersion>2.1</ProjectVersion> <DockerTargetOS>Linux</DockerTargetOS> <ProjectGuid>a325c35e-28e0-43ce-b28f-516dc1568e18</ProjectGuid> <DockerLaunchAction>None</DockerLaunchAction> <DockerServiceUrl>{Scheme}://localhost:{ServicePort}/swagger</DockerServiceUrl> <DockerServiceName>akka-infra</DockerServiceName> </PropertyGroup> <ItemGroup> <None Include="docker-compose.yml" /> <None Include=".dockerignore" /> </ItemGroup> </Project>
참고 : https://docs.microsoft.com/ko-kr/visualstudio/containers/overview?view=vs-2019
클러스터 시스템 구성
클러스터화된 시스템을 DockerCompose를 통해 구성할수 있습니다.
version: '3.4' services: lighthouse: image: ${DOCKER_REGISTRY-}lighthouse build: context: . dockerfile: ../LightHouse/Dockerfile environment: ACTORSYSTEM: NetCoreCluster CLUSTER_IP: lighthouse CLUSTER_PORT: 4053 CLUSTER_SEEDS: akka.tcp://NetCoreCluster@lighthouse:4053 ports: - 4053 netcoreapp1: image: ${DOCKER_REGISTRY-}netcoreapp build: context: . dockerfile: ../NetCoreCluster/Dockerfile environment: ASPNETCORE_ENVIRONMENT: Development ACTORSYSTEM: NetCoreCluster CLUSTER_IP: netcoreapp1 CLUSTER_PORT: 7000 CLUSTER_SEEDS: akka.tcp://NetCoreCluster@lighthouse:4053 CLUSTER_ROLES: "WorkNode" depends_on: - "lighthouse" netcoreapp2: image: ${DOCKER_REGISTRY-}netcoreapp build: context: . dockerfile: ../NetCoreCluster/Dockerfile environment: ASPNETCORE_ENVIRONMENT: Development ACTORSYSTEM: NetCoreCluster CLUSTER_IP: netcoreapp2 CLUSTER_PORT: 7000 CLUSTER_SEEDS: akka.tcp://NetCoreCluster@lighthouse:4053 CLUSTER_ROLES: "WorkNode" depends_on: - "netcoreapp1" netcoreapp3: image: ${DOCKER_REGISTRY-}netcoreapp build: context: . dockerfile: ../NetCoreCluster/Dockerfile environment: ASPNETCORE_ENVIRONMENT: Development ACTORSYSTEM: NetCoreCluster CLUSTER_IP: netcoreapp3 CLUSTER_PORT: 7000 CLUSTER_SEEDS: akka.tcp://NetCoreCluster@lighthouse:4053 CLUSTER_ROLES: "AdminNode" depends_on: - "netcoreapp2"
- WorkNode : 클러스터내에 유연하게 확장가능하며 작업 Node입니다.
- AdminNode : 클러스터내에 단하나만 작동하며 배치잡및 WorkNode에게 일을 시킬수 있습니다.
클러스터 시스템 디버깅
클러스터화가된 N개의 App이 동시에 구동되어도 브레이크포인트 판정이되며 작동중인 도커 인스턴스를 일시중지하고
디버깅이 가능합니다.
작동
- LightHouse : 디스커버리 기능을 하며, 신규 노드가 붙을시 클러스터시스템이 신규노드를 인지하게 됩니다.
- NetCoreCluste / NetCoreCluste_1 : 유연하게 확장될수 있으며 확장된 만큼 작업을 분배하여 처리합니다.
- NetCoreCluste_2 : 단일노드로 설정되었으며 일을 시킵니다.
닷넷코어 서비스와 도커를 활용하여 클러스터시스템을 직접 구현하고 배치를 해보았으며
Akka 클러스터의 자세한 설명은 생략하였으며 다음을 참고합니다.
참고 자료: