You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 5 Next »

닷넷코어 어플리케이션을 리눅스 도커환경으로 클러스터화 하는 실험이며

최종목표는 단일지점 병목이 없는 분산처리 어플리케이션 작성입니다.

클러스터 시스템을 직접 작성한다고 구동하고 디버깅하는것은 어려운 일이지만

비주얼 스튜디오 도커툴의 도움을 받아보겠습니다.


실험 저장소 : https://github.com/psmon/NetCoreCluster


컨셉

  • 순수 로컬일때 스탠드 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 클러스터의 자세한 설명은 생략하였으며 다음을 참고합니다.

참고 자료:



  • No labels