Consul을 멤버 자격 공급자로 사용

Consul은 간단한 서비스 등록, 상태 검사, 오류 검색 및 키-값 스토리지를 포함하는 분산된 고가용성 데이터 센터 인식 서비스 검색 플랫폼입니다. 데이터 센터의 모든 노드가 서버 또는 클라이언트 역할을 하는 Consul 에이전트를 실행한다는 전제 하에 빌드되었습니다. 각 에이전트는 확장 가능한 가십 프로토콜을 통해 통신합니다.

여기에는 유사한 솔루션과의 비교를 포함하여 Consul에 대한 자세한 개요가 있습니다.

Consul은 Go로 작성되었으며 오픈 소스입니다. 컴파일된 다운로드는 macOS X, FreeBSD, Linux, Solaris 및 Windows에서 사용할 수 있습니다.

Consul을 선택하는 이유는 무엇인가요?

Orleans 멤버 자격 공급자인 Consul은 잠재 고객에게 기존 인프라 및 협력 IT 공급자가 필요하지 않은 온-프레미스 솔루션을 제공해야 하는 경우에 적합합니다. Consul은 간단한 단일 실행 파일이며 종속성이 없으므로 미들웨어 솔루션에 쉽게 빌드할 수 있습니다. Consul이 마이크로 서비스를 검색, 확인 및 유지 관리하기 위한 솔루션인 경우 단순성과 운영 편의성을 위해 Orleans 멤버 자격과 완전히 통합하는 것이 좋습니다. Consul에는 Orleans의 클러스터 관리와 완전히 통합되는 멤버 자격 테이블("Orleans 사용자 지정 시스템 저장소"라고도 함)도 있습니다.

Consul 설정

Consul.io에는 안정적인 Consul 클러스터를 설정하는 방법에 대한 광범위한 설명서가 있으며 여기서 반복하는 것은 의미가 없습니다. 그러나 편의를 위해 이 가이드를 포함하므로 독립 실행형 Consul 에이전트를 사용하여 Orleans를 신속하게 실행할 수 있습니다.

  1. Consul을 설치할 폴더를 만듭니다(예: C:\Consul).

  2. 하위 폴더 만들기: C:\Consul\Data(Consul에서 이 디렉토리가 없는 경우 디렉터리를 생성하지 않음).

  3. C:\ConsulConsul.exe다운로드하여 압축을 풉니다.

  4. C:\Consul에서 명령 프롬프트를 열고 다음 명령을 실행합니다.

    ./consul.exe agent -server -bootstrap -data-dir "C:\Consul\Data" -client='0.0.0.0'
    

    위의 명령은 다음을 수행합니다.

    • agent: Consul에게 서비스를 호스트하는 에이전트 프로세스를 실행하도록 지시합니다. 이 스위치가 없으면 Consul 프로세스는 RPC를 사용하여 실행 중인 에이전트를 구성하려고 시도합니다.
    • -server: 에이전트를 클라이언트가 아닌 서버로 정의합니다(Consul 클라이언트는 모든 서비스 및 데이터를 호스트하는 에이전트이지만 클러스터 리더를 결정할 수 있는 의결권이 없는 에이전트입니다.
    • -bootstrap: 클러스터의 첫 번째 노드(및 첫 번째 노드만)는 클러스터 리더십을 가정할 수 있도록 부트스트랩되어야 합니다.
    • -data-dir [path]: 클러스터 멤버 자격 테이블을 포함하여 모든 Consul 데이터가 저장되는 경로를 지정합니다.
    • -client='0.0.0.0': 서비스를 열 IP를 Consul에 알립니다.

    다른 많은 매개 변수와 JSON 구성 파일을 사용하는 옵션이 있습니다. 옵션의 전체 목록은 Consul 설명서를 참조하세요.

  5. Consul이 실행 중이고 http://localhost:8500/v1/catalog/services의 브라우저에서 서비스 엔드포인트를 열어 Orleans의 멤버 자격 요청을 수락할 준비가 되었는지 확인합니다. 올바르게 작동하면 브라우저에 다음 JSON이 표시됩니다.

    {
        "consul": []
    }
    

Orleans 구성

Consul을 멤버 자격 공급자로 사용하도록 Orleans를 구성하려면 사일로 프로젝트에서 Microsoft.Orleans.Clustering.Consul NuGet 패키지를 참조해야 합니다. 이렇게 하면 다음과 같이 사일로의 Program.cs 파일에서 멤버 자격 공급자를 구성할 수 있습니다.

IHostBuilder builder = Host.CreateDefaultBuilder(args)
    .UseOrleans(silo =>
    {
        silo.UseConsulSiloClustering(options =>
        {
            // The address of the Consul server
            var address = new Uri("http://localhost:8500");
            options.ConfigureConsulClient(address);
        });
    })
    .UseConsoleLifetime();

using IHost host = builder.Build();
host.Run();

앞의 코드가 하는 역할은 다음과 같습니다.

클라이언트를 구성하려면 동일한 NuGet 패키지를 참조하고 UseConsulClientClustering 확장 메서드를 호출합니다.

Client SDK

서비스 검색에 Consul을 사용하려는 경우 가장 인기 있는 언어에 대한 클라이언트 SDK가 있습니다.

구현 세부 정보

멤버 자격 테이블 공급자는 CAS(Check-And-Set) 작업과 함께 Consul의 키/값 저장소 기능을 사용합니다. 각 Silo가 시작되면 두 개의 키-값 항목, 즉 사일로 세부 정보가 포함된 항목과 사일로가 마지막으로 활성 상태라고 보고한 항목이 등록됩니다. 후자는 사일로 간에 직접 전송되고 테이블에 기록되지 않는 실패 감지 하트비트가 아닌 진단 "I'm alive" 항목을 가리킵니다. 테이블에 대한 모든 쓰기는 Orleans의 클러스터 관리 프로토콜에 필요한 동시성 제어를 제공하기 위해 CAS를 사용하여 수행됩니다.

Silo가 실행되면 http://localhost:8500/v1/kv/?keys&pretty의 웹 브라우저에서 이러한 항목을 볼 수 있으며, 다음과 같은 항목이 표시됩니다.

[
    "orleans/default/192.168.1.11:11111@43165319",
    "orleans/default/192.168.1.11:11111@43165319/iamalive",
    "orleans/default/version"
]

모든 키에는 공급자에서 하드 코딩되고 Consul의 다른 사용자와 키 영역 충돌을 방지하기 위한 orleans 접두사가 붙습니다. 이러한 키를 사용하여 키 이름(따옴표 없이)을 http://localhost:8500/v1/kv/의 Consul KV 루트에 추가하여 이러한 각 키에 대한 추가 정보를 검색할 수 있습니다. 이렇게 하면 다음 JSON이 표시됩니다.

[
    {
        "LockIndex": 0,
        "Key": "orleans/default/192.168.1.11:11111@43165319",
        "Flags": 0,
        "Value": "[BASE64 UTF8 Encoded String]",
        "CreateIndex": 321,
        "ModifyIndex": 322
    }
]

Base64 UTF-8로 인코딩된 문자열 Value를 디코딩하면 실제 Orleans 멤버 자격 데이터가 제공됩니다.

http://localhost:8500/v1/KV/orleans/default/[SiloAddress]

{
    "Hostname": "[YOUR_MACHINE_NAME]",
    "ProxyPort": 30000,
    "StartTime": "2023-05-15T14:22:00.004977Z",
    "Status": 3,
    "SiloName": "Silo_fcad0",
    "SuspectingSilos": []
}

http://localhost:8500/v1/KV/orleans/default/[SiloAddress]/IAmAlive

"2023-05-15T14:27:01.1832828Z"

클라이언트가 연결할 때 URI http://192.168.1.26:8500/v1/KV/orleans/default/?recurse를 사용하여 하나의 HTTP GET에서 클러스터의 모든 사일로에 대한 KV를 읽습니다.

제한 사항

Consul을 멤버 자격 공급자로 사용할 때 알아야 할 몇 가지 제한 사항이 있습니다.

Orleans 확장 멤버 자격 프로토콜(테이블 버전 및 ETag)

Consul KV는 현재 원자성 업데이트를 지원하지 않습니다. 따라서 Orleans Consul 멤버 자격 공급자는 Orleans의 클러스터 관리에 설명된 대로 Orleans 기본 멤버 자격 프로토콜만 구현하며 확장 멤버 자격 프로토콜은 지원하지 않습니다. 이 확장 프로토콜은 필수는 아니지만 추가적인 사일로 연결 유효성 검사로 도입되었으며 아직 구현되지 않은 기능의 기초로 도입되었습니다.

여러 데이터 센터

Consul의 키-값 쌍은 현재 Consul 데이터 센터 간에 복제되지 않습니다. 이 복제 활동을 해결하기 위한 별도의 프로젝트가 있지만 아직 Orleans를 지원하는 것으로 입증되지 않았습니다.

Windows에서 실행하는 경우

Windows에서 Consul이 시작되면 다음 메시지가 기록됩니다.

==> WARNING: Windows is not recommended as a Consul server. Do not use in production.

이 경고 메시지는 실제 알려진 문제가 아니라 Windows 환경에서 실행할 때 테스트에 집중하지 않았기 때문에 표시됩니다. Consul이 적합한 선택인지 결정하기 전에 토론을 읽어 보세요.

잠재적인 향후 개선 사항

  1. Consul KV 복제 프로젝트가 여러 Consul 데이터 센터 간의 WAN 환경에서 Orleans 클러스터를 지원할 수 있음을 증명합니다.
  2. Consul에서 미리 알림 테이블을 구현합니다.
  3. 확장 멤버 자격 프로토콜을 구현합니다. Consul 뒤에 있는 팀은 원자성 작업을 구현할 계획입니다. 이 기능을 사용할 수 있게 되면 공급자의 제한을 제거할 수 있습니다.