닷넷코어 어플리케이션을 리눅스 도커환경으로 클러스터화 하는 실험이며
최종목표는 단일지점 병목이 없는 분산처리 어플리케이션 작성입니다.
클러스터 시스템을 로컬에 구동하고 디버깅하는것은 귀찮고 어려운 일이지만
비주얼 스튜디오 도커툴의 도움을 받아보겠습니다.
컨셉
- 순수 로컬일때 스탠드 Alone으로 모든기능이 작동됩니다.
- 로컬 Docker-Compose를 통해 클러스터 시스템을 디버깅할수 있습니다.
- Docker-Compose로 구성되고 작동되는 서비스는 쿠버네티스 또는 클라우드로 확장에 용이합니다.
Application LayOut
- LightHouse : 아파치의 주키퍼와 유사한 역활을 하며, 클러스터에 조인할 노드들이 대상서비스를 찾을수 있게 디스커버리역활을 합니다.
- NetCoreCluser : 분산처리 노드 / 단일 노드등 여러가지 기능을 가질수 있으며 작동방법은 띄우는시점 결정되어 클러스터에 조인됩니다.
- docker-compose-infra : 도커 컴포저를 이용해 클러스터 로컬환경을 구성할수 있습니다. 프로젝트는 2개이지만, 롤을 분리하여 N개의 어플리케이션을 롤별로 구동가능합니다. ( 단일저장소 MSA)
로컬에서는 다음과같은 구성으로 NetCoreCluser-StandAlone 으로 모든 롤이 실행이 가능하며, SeedNode없이 Seed기능이 작동됩니다. ( 누구나, 클러스터의 Seed가 될수 있습니다. )
{ "$schema": "http://json.schemastore.org/launchsettings.json", "profiles": { "Local-Development": { "commandName": "Project", "launchBrowser": false, "launchUrl": "help/", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development", "CLUSTER_PORT": "7100", "CLUSTER_IP": "127.0.0.1", "CLUSTER_SEEDS": "akka.tcp://NetCoreCluster@127.0.0.1:7100", "CLUSTER_ROLES": "WorkNode,AdminNode", "ACTORSYSTEM": "NetCoreCluster" }, "applicationUrl": "http://localhost:7000" } } }
도커 프로젝트 추가
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에게 일을 시킬수 있습니다.
도커 데스크탑 대시보드
visual studio 가 아닌곳에서도, 도커컴포저내 클러스터화된 어플리케이션 제어가 가능하며
노드를 중단시키고 새롭게 조인시키는 다양한 클러스터 테스트를 도커를 통해 수행가능합니다.
클러스터 시스템 디버깅
클러스터화가된 N개의 App이 동시에 구동되어도 브레이크포인트 판정이되며 작동중인 도커 인스턴스를 일시중지하고 디버깅이 가능합니다.
도커화및 클러스터화 구동을 수행해볼수 있으며 , 커스텀화된 분산처리 로직을 직접설계및 추가 가능합니다.
작동
- LightHouse : 디스커버리 기능을 하며, 신규 노드가 붙을시 클러스터시스템이 신규노드를 인지하게 됩니다.
- NetCoreCluste / NetCoreCluste_1 : 유연하게 확장될수 있으며 확장된 만큼 작업을 분배하여 처리합니다.
- NetCoreCluste_2 : 단일노드로 설정되었으며 일을 시킵니다.
Q&A
- SeedNode(LightHouse) 가 중단되면 어떻게됩니까? 기족 작업노드는 작동하나, 신규로 조인되는 노드들이 발견을 할수 없기때문에, 클러스터에서 신규노드 인식이 되지 않습니다.
- 단일 SeedNode도 이중화가 가능합니까? SeedNode를 복수개를 둬서 단일지점 장애포인트를 대비할수 있습니다.
- WorkNode가 중단되면 어떻게 됩니까? 클러스터에서 자동 제외가 되며, 작동중인 WorkNode에서 Task가 진행될수 있습니다.
- WokrNode가 모두 중단되면 어떻게됩니까? 클러스터에서 Task를 할당할 Node가 존재하지 않기때문에 신규 Task수행이 실패가 될수 있습니다.
- 오토 스케일링을 지원합니까? 인스턴스를 새롭게 할당하는것은 쿠버네티스를 이용해야하며 다른 전략이 사용되어야합니다. 단순하게 도커의 리소스량을 통해 스케일아웃도 가능하지만 액터모니터링을 감시하는 전략도 사용할수 있습니다.
- 무중단 업데이틀 지원합니까? 무중단업데이트는, 중단된 상태에서 발생하는 메시지를 처리하는 정확하게 한번전송과 관련된 주제로 Kafka및 Akka퍼시스트를 통해 설계를 해야하며 GraceFulDown과 함께 활용해야합니다.
닷넷코어 서비스와 도커를 활용하여 클러스터시스템을 직접 구현하고 배치를 해보았으며
Akka 클러스터의 자세한 설명은 생략하였으며 다음을 참고합니다.
참고 자료: